我的问题是获取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