1

我有以下代码可以加载和绑定 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的方法,但除了不使用他正在使用的统一普通句柄(据我所知它们不是必需的?),我'我不确定为什么它不起作用。想法?

4

1 回答 1

2

我看到您正在调用glUniform1f您的采样器而不是glUniform1i. 我不知道这是否一定会导致错误,但这似乎有点奇怪,我不确定如果你尝试设置一个带有浮点数的采样器会发生什么。

你在任何地方都有 glGetError 吗?

于 2012-05-15T01:09:09.947 回答