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



所以我有一些代码:

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/。如果您查看使用纹理部分,您会看到一个解释。报价:

总之:

  1. 设置活动纹理单元。
  2. 将纹理绑定到本机。
  3. 将此单元分配给片段着色器中的纹理均匀。
根据需要

对任意数量的纹理重复此操作。

您的问题是关于步骤 3 的,您使用的数字基于示例纹理单元中的步骤 1(不包括在内)0 .

这是OpenGL着色器的奇怪部分之一。并没有强烈需要让它变得如此复杂(能够说uniform sampler2d u_Texture = 0;并完成它会很好),但不幸的是它不是那样工作的。

相关内容

最新更新