【发布时间】:2011-04-03 21:53:59
【问题描述】:
我的问题是在 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;
}
};
所以,我只是根据统一变量在两个颜色值之间进行选择。很简单(这是一个测试),但是当 blend 时,我得到了全黑 ,而不是预期的行为。
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) 就证明了这一点。为什么它会如此可怕地破坏一切?我已经尝试升级我的显示驱动程序。
【问题讨论】:
-
您找到解决问题的方法了吗?我有完全相同的问题。
-
是的,标记的解决方案对我有用。