紋理單元
上一節(jié)的最后我們提到了,在著色器代碼中,我們聲明了一個(gè)uniform的sampler2D類型的變量,卻沒有給它賦值。如果使用函數(shù)glUniform1i(),我們可以給紋理采樣器分配一個(gè)位置值,這樣的話我們能夠在一個(gè)片段著色器中設(shè)置多個(gè)紋理。

location是uniform變量的位置,我們用value為紋理采樣器賦值,這個(gè)值被稱為紋理的位置值。一個(gè)紋理的位置值通常稱為一個(gè)紋理單元(Texture Unit)。一個(gè)紋理的默認(rèn)紋理單元是0,所以上一節(jié)我們沒有分配一個(gè)位置值。紋理單元的主要目的是讓我們在著色器中可以使用多個(gè)紋理。

要使用多個(gè)紋理,首先要在著色器中增加紋理采樣器:

最終輸出的顏色是兩個(gè)紋理的結(jié)合,這里使用了GLSL中的函數(shù)mix()。mix是一個(gè)用于執(zhí)行線性插值的函數(shù)。

當(dāng)a為0時(shí),結(jié)果為x,當(dāng)a為1時(shí),結(jié)果為y。當(dāng)a在0和1之間時(shí),mix函數(shù)會在x和y之間進(jìn)行線性插值,生成一個(gè)平滑的過渡值。
下一步我們載入并創(chuàng)建另一個(gè)紋理,不再贅述。
為了同時(shí)使用兩個(gè)紋理,我們需要調(diào)用函數(shù)glActiveTexture()和glBindTexture(),來定義哪個(gè)采樣器對應(yīng)哪個(gè)紋理單元。
glActiveTexture用于激活多重紋理單元,以便在渲染時(shí)能夠設(shè)置和使用多個(gè)紋理。

函數(shù)的參數(shù)是一個(gè)枚舉值,表示要激活的紋理單元。常用的紋理單元枚舉值如GL_TEXTURE0、GL_TEXTURE1、GL_TEXTURE2,這里的數(shù)字后綴就是我們在glUniform1i中設(shè)置的位置值。

下面是使用兩個(gè)紋理的效果:
