我的問題是獲取GLSL着色器中可以訪問的多個紋理。 下面是我在做什麼:GLSL中的多個紋理 - 只有一個可以工作
着色器:
uniform sampler2D sampler0;
uniform sampler2D sampler1;
uniform float blend;
void main(void)
{
vec2 coords = gl_TexCoord[0];
vec4 col = texture2D(sampler0, coords);
vec4 col2 = texture2D(sampler1, coords);
if (blend > 0.5){
gl_FragColor = col;
} else {
gl_FragColor = col2;
}
};
所以,我只是基於一個統一的變量兩種顏色值之間進行選擇。足夠簡單(這是一個測試),但代替預期的行爲,當混合< = 0.5時,我得到全黑色
。
的OpenGL代碼:
m_sampler0location = m_shader.FindUniform("sampler0");
m_sampler1location = m_shader.FindUniform("sampler1");
m_blendlocation = m_shader.FindUniform("blend");
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
m_extensions.glUniform1iARB(m_sampler0location, 0);
glBindTexture(GL_TEXTURE_2D, Texture0.Handle);
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
m_extensions.glUniform1iARB(m_sampler1location, 1);
glBindTexture(GL_TEXTURE_2D, Texture1.Handle);
glBegin(GL_QUADS);
//lower left
glTexCoord2f(0, 0);
glVertex2f(-1.0, -1.0);
//upper left
glTexCoord2f(0, maxCoords0.t);
glVertex2f(-1.0, 1.0);
//upper right
glTexCoord2f(maxCoords0.s, maxCoords0.t);
glVertex2f(1.0, 1.0);
//lower right
glTexCoord2f(maxCoords0.s, 0);
glVertex2f(1.0, -1.0);
glEnd()
着色器之前,所有編譯和約束。在這個過程中的所有理智檢查都表明它沒問題。
正如我所說的,着色器程序中的值
根據Bahbar的回覆修復。col
反映了紋理中的碎片;
col2
的值爲黑色。顯示的紋理是最後一個活動紋理 - 如果我將最後一個
glBindTexture
更改爲綁定
Texture0.Handle
,紋理會更改。
事實上,即使我將諸如gl_FragColor.r = blend;
之類的東西添加爲着色器的最後一行,場景也會呈現全黑。但是,如果我註釋掉glActiveTexture(GL_TEXTURE1);
,則着色器會再次運行,並且sampler0和sampler1中都會出現相同的紋理。
發生了什麼事?有問題的線路glActiveTexture(GL_TEXTURE1);
似乎工作得很好,後續的glGetIntegerv(GL_ACTIVE_TEXTURE, &anint)
就證明了這一點。它爲什麼如此可怕地破壞一切?我已經嘗試升級我的顯示驅動程序。
您是否找到了解決問題的方法?我有完全相同的問題。 – Andrea3000 2012-02-11 09:40:25
是的,標記的解決方案爲我工作。 – appas 2012-02-12 07:43:45