所以我有一些代码:
mTextureUniformHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_Texture");
获取u_texture
的句柄并在片段着色器中对其执行某些操作。
final String perPixelFragmentShader =
"precision mediump float; \n" +
"uniform sampler2D u_Texture; \n" +
"varying vec3 v_Position; \n" +
"varying vec2 v_TexCoordinate; \n" +
"void main() { \n" +
"gl_FragColor = texture2D(u_Texture, v_TexCoordinate); } \n";
但是,我对以下这一行做了什么感到困惑:
GLES20.glUniform1i(mTextureUniformHandle, 0);
我认为这一行等同于
uniform sampler2d u_Texture = 0;
但如果是这种情况,我认为texture2d(u_Texture, v_TexCoordinate)
无法正常工作。根据列出的枚举的2d纹理应该是:
public static final int GL_TEXTURE_2D = 3553;
所以我真的很困惑为什么我使用glUniform1i()
调用将句柄设置为0。
答案 0 :(得分:0)
您分配给uniform sampler2D
的值取决于您要使用的绑定纹理,而不是它的纹理类型。
根据变量名判断您的代码基于http://www.learnopengles.com/android-lesson-four-introducing-basic-texturing/。如果您查看使用纹理部分,您会看到一个解释。引用:
简而言之:
- 设置活动纹理单元。
- 将纹理绑定到此单元。
- 将此单位指定给片段着色器中的纹理均匀。
醇>根据需要重复多个纹理。
您的问题与步骤3有关,您使用的数字基于您的示例纹理单元0
中的第1步(您不会包括)。
这是OpenGL着色器的一个奇怪部分。真的没有必要让它变得如此复杂(能够简单地说uniform sampler2d u_Texture = 0;
并完成它会很好),但遗憾的是它并没有这样做。