所以我有一些代码:
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。
分配给uniform sampler2D
的值基于要将其用于哪个绑定纹理,而不是纹理类型。
从变量名称来看,您的代码基于 http://www.learnopengles.com/android-lesson-four-introducing-basic-texturing/。如果您查看使用纹理部分,您会看到一个解释。报价:
总之:
根据需要
- 设置活动纹理单元。
- 将纹理绑定到本机。
- 将此单元分配给片段着色器中的纹理均匀。
对任意数量的纹理重复此操作。
您的问题是关于步骤 3 的,您使用的数字基于示例纹理单元中的步骤 1(不包括在内)0
.
这是OpenGL着色器的奇怪部分之一。并没有强烈需要让它变得如此复杂(能够说uniform sampler2d u_Texture = 0;
并完成它会很好),但不幸的是它不是那样工作的。