我有以下代码加载和绑定3个纹理:
// Load the texture
mTextureDataHandle[0] = TextureHelper.loadTexture(mActivityContext, R.drawable.bricks);
mTextureDataHandle[1] = TextureHelper.loadTexture(mActivityContext, R.drawable.grass);
mTextureDataHandle[2] = TextureHelper.loadTexture(mActivityContext, R.drawable.steel);
// Set the active texture unit to texture unit 0 and bind to the texture data.
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle[0]);
GLES20.glActiveTexture(GLES20.GL_TEXTURE2);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle[1]);
GLES20.glActiveTexture(GLES20.GL_TEXTURE3);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle[2]);
然后我想独立使用每个纹理:
GLES20.glUseProgram(mPerVertexTexturedProgramHandle);
GLES20.glUniform1f(mTextureUniformHandle, 2);
drawStuff();
GLES20.glUseProgram(mPerVertexProgramHandle);
//Draw some smooth shapes
GLES20.glUseProgram(mPerVertexTexturedProgramHandle);
GLES20.glUniform1f(mTextureUniformHandle, 3);
drawOtherStuff();
GLES20.glUseProgram(mPerVertexProgramHandle);
我原本以为Stuff会在草地上绘制,而OtherStuff在钢铁中绘制,但我发现两种形状都是用钢材绘制的。如果我在绑定时更改纹理的索引(glActiveTexture与TEXTURE0,TEXTURE1,TEXTURE2而不是1,2,3),则两个形状都用砖块绘制。将什么值传递给glUniform1f似乎并不重要。
我在这里不知所措,我正在按照Android OpenGL ES2.0 Texture Swapping的方法,但除了不使用他正在使用的统一正常句柄(据我所知他们没有必要?),我我不确定为什么它不起作用。想法?
答案 0 :(得分:2)
我发现您为采样器而不是glUniform1f
呼叫glUniform1i
。我不知道这是否会导致错误,但它确实有点奇怪,我不确定如果你试图用浮点数设置一个采样器会发生什么。
你在任何地方也有glGetError吗?