Android用OpenGLES2.0の1つのシェーダープログラムで、2つの異なるテクスチャを使用して2つのオブジェクトを描画しようとしています。最初のオブジェクトにはが必要texture0
で、2番目のオブジェクトにはが必要texture1
です。
フラグメントシェーダーには次のものがあります。
uniform sampler2D tex;
およびJavaコードの場合:
int tiu0 = 0;
int tiu1 = 1;
int texLoc = glGetUniformLocation(program, "tex");
glUseProgram(program);
// bind texture0 to texture image unit 0
glActiveTexture(GL_TEXTURE0 + tiu0);
glBindTexture(GL_TEXTURE_2D, texture0);
// bind texture1 to texture image unit 1
glActiveTexture(GL_TEXTURE0 + tiu1);
glBindTexture(GL_TEXTURE_2D, texture1);
glUniform1i(texLoc, tiu0);
// success: glGetError returns GL_NO_ERROR, glGetUniformiv returns 0 for texLoc
drawFirstObject(); // should have texture0
glUniform1i(texLoc, tiu1);
// success: glGetError returns GL_NO_ERROR, glGetUniformiv returns 1 for texLoc
drawSecondObject(); // should have texture1
Android2.3.3を搭載したSamsungGalaxyAceで実行すると、両方のオブジェクトが同じになりtexture0
ます。同様のコードは、デスクトップコンピューターのOpenGL2.0で正しく実行されます。
を削除するdrawFirstObject
と、2番目のオブジェクトにはが含まれますtexture1
。
を削除するdrawSecondObject
と、最初のオブジェクトにはが含まれますtexture0
。
drawFirstObject
とdrawSecondObject
私がしばらくの間プログラムを変更した場合:
glUseProgram(0); // can be also any valid program other than the program from the next call
glUseProgram(program);
その場合、両方のオブジェクトに。がありtexture1
ます。
とは異なるユニフォームの値sampler2D
は常に正しく設定されます。
オブジェクトを描画する前に、1つのテクスチャイメージユニットを使用して適切なテクスチャをそのテクスチャイメージユニットにバインドするだけで、異なるテクスチャの2つのオブジェクトを描画できることはわかっていますが、ここで何が起こっているのかも知りたいです。
私のコードに何か問題がありますか?OpenGL ES 2.0で、コードに示したようにテクスチャ画像ユニットを切り替えるだけで、異なるテクスチャのオブジェクトを描画することは可能ですか?それが不可能な場合、OpenGL 2.0(可能な場合)とOpenGL ES 2.0の違いはどこかに文書化されていますか?見つかりません。