在 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
,因此可以使用一個紋理的程式更簡單地省略該呼叫。