2016-10-13 8 views
0

サンプラーのユニフォームを正しいテクスチャユニットに設定した場合、私は印象に残っていましたが、現在バインドされているテクスチャターゲットが0であるかどうかは関係ありません。描画するときに、私はmytextureにGL_TEXTURE_2Dバウンド維持しない限り、例えば、サンプリングするためにバインディングする必要があるテクスチャはありますか?

glActiveTexture(GL_TEXTURE1); 
glGenTextures(1, &mytexture); 

glBindTexture(GL_TEXTURE_2D, mytexture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, my_data); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glBindTexture(GL_TEXTURE_2D, 0); // This is the line I'm wondering about 

はいつか、後で...

glUniform1i(glGetUniformLocation(program, "mysampler"), 1); 
//draw_stuff 

は残念ながら、画面はすべて黒です。 GL_TEXTURE_2Dが0にバインドされているときにサンプリングするのは不正ですか?

+0

はい、バインドレステクスチャ拡張機能を使用している場合を除き、テクスチャをバインドする必要があります。 – datenwolf

+0

ちょっとしたヒント:あなたのターゲットバージョンが4.5か、あなたが 'GL_ARB_direct_state_access'をサポートしているのであれば、bind to modifyの代わりに' glCreateTextures'、 'glBindTextureUnit'と' glTextureParameter'を使うことを検討してください。同じ効果、少ないコール、パイプラインやオブジェクトの状態の改ざんのリスクを減らすことができます。 – thokra

答えて

4

正確には、GL_TEXTURENをいくつかのテクスチャターゲットタイプ(GL_TEXTURE_2D、GL_TEXTURE_3Dなど)のスロットとして考えてください。 GL_TEXTURE1をアクティブにしてGL_TEXTURE_2Dにテクスチャをバインドすると、スロット1の2Dテクスチャが "mytexture"に設定されることをドライバに伝えます。

次に、あなたが同様にあなたのシェーダにこの情報を渡す必要があります。

glUniform1i(glGetUniformLocation(program, "mysampler"), 1); 

これだけであなたはそれがありますテクスチャをバインド解除する場合は、スロット1にGL_TEXTURE_2Dを探す必要があることを、あなたのシェーダであなたのsampler2Dを伝えますサンプリングするものは何もありません。

関連する問題