在 GLSL 着色器中使用纹理

顶点着色器仅接受纹理坐标作为顶点属性,并将坐标转发到片段着色器。默认情况下,它还将保证片段将根据其在三角形中的位置接收正确插值的坐标:

layout (location = 0) in vec3 position;
layout (location = 1) in vec2 texCoordIn;

out vec2 texCoordOut;

void main()
{
    gl_Position = vec4(position, 1.0f);
    texCoordOut = texCoordIn;
}

片段着色器然后接受 texCoord 输出变量作为输入变量。然后,你可以通过声明 uniform sampler2D 将纹理添加到片段着色器。为了对纹理片段进行采样,我们使用了内置函数 texture,它具有两个参数。首先是我们想要采样的纹理,第二个是这个纹理的坐标:

in vec2 texCoordOut;

out vec4 color;

uniform sampler2D image;

void main()
{
    color = texture(image, texCoordOut);
}

请注意,image 不是此处的直接纹理 ID。它是将被采样的纹理单元的 id。反过来,纹理不直接绑定到程序; 它们与纹理单元绑定在一起。这是通过首先使用 glActiveTexture 激活纹理单元来实现的,然后调用 glBindTexture 将影响这个特定的纹理单元。然而,由于默认纹理单元是纹理单元 0,因此可以使用一个纹理的程序更简单地省略该调用。