OpenGL设置纹理均匀手柄有什么作用?

时间:2014-04-06 03:18:45

标签: opengl-es

所以我有一些代码:

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。

1 个答案:

答案 0 :(得分:0)

您分配给uniform sampler2D的值取决于您要使用的绑定纹理,而不是它的纹理类型。

根据变量名判断您的代码基于http://www.learnopengles.com/android-lesson-four-introducing-basic-texturing/。如果您查看使用纹理部分,您会看到一个解释。引用:

  

简而言之:

     
      
  1. 设置活动纹理单元。
  2.   
  3. 将纹理绑定到此单元。
  4.   
  5. 将此单位指定给片段着色器中的纹理均匀。
  6.         

    根据需要重复多个纹理。

您的问题与步骤3有关,您使用的数字基于您的示例纹理单元0中的第1步(您不会包括)。

这是OpenGL着色器的一个奇怪部分。真的没有必要让它变得如此复杂(能够简单地说uniform sampler2d u_Texture = 0;并完成它会很好),但遗憾的是它并没有这样做。