在 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
,因此可以使用一个纹理的程序更简单地省略该调用。