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