我有以下加载和绑定(bind) 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 会用钢绘制,但我发现这两种形状都是用钢绘制的。如果我在绑定(bind)时更改纹理的索引(glActiveTexture 使用 TEXTURE0、TEXTURE1、TEXTURE2 而不是 1、2、3),两个形状都绘制在砖 block 中。传递给 glUniform1f 的值似乎并不重要。
我在这里不知所措,我正在遵循 Android OpenGL ES2.0 Texture Swapping 中的方法,但除了不使用他正在使用的统一普通 handle (据我所知它们不是必需的?),我不确定为什么它不起作用。想法?
最佳答案
我看到您正在为采样器调用 glUniform1f
而不是 glUniform1i
。我不知道这是否一定会导致错误,但这看起来确实有点奇怪,而且我不确定如果您尝试使用 float 设置采样器会发生什么。
你还有 glGetError 吗?
关于android opengl es 2.0 纹理切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10592867/