【问题标题】:android opengl es 2.0 texture switchingandroid opengl es 2.0 纹理切换
【发布时间】:2012-05-15 09:09:09
【问题描述】:

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

【问题讨论】:

    标签: android opengl-es-2.0 textures


    【解决方案1】:

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

    你还有 glGetError 吗?

    【讨论】:

    • exasperated sigh 虽然我很喜欢解决问题,但我非常讨厌这是一个小问题,以至于你在展示给别人之前忽略了 100 次,而他们发现了它立即地。 glUniform1f 不适用于这种类型的东西,必须使用 glUniformi。谢谢蒂姆。
    猜你喜欢
    • 2023-03-04
    • 2012-04-08
    • 1970-01-01
    • 2011-05-19
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多