Mi problema es obtener más de una textura accesible en un sombreador GLSL. Esto es lo que estoy haciendo:Múltiples texturas en GLSL: solo funciona
Shader:
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;
}
};
Por lo tanto, sólo tiene que elegir entre los dos valores de color en base a una variable uniforme. Bastante simple (esta es una prueba), pero en lugar del comportamiento esperado, obtengo todo negro
cuando combine < = 0.5
.
código 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()
El shader se compila y se comprometieron antes de todo esto. Todos los controles de cordura en ese proceso indican que va bien.
Como dije, el valor de
Solucionado de acuerdo con la respuesta de Bahbar.col
en el programa de sombreado refleja fragmentos de una textura; el valor de
col2
es negro. La textura que se muestra es la última textura activa; si cambio el último
glBindTexture
para vincular
Texture0.Handle
, la textura cambia.
Como está, la escena se vuelve negra, incluso si agrego algo como gl_FragColor.r = blend;
como la última línea del sombreador. Pero si hago un comentario sobre la llamada glActiveTexture(GL_TEXTURE1);
, el sombreador vuelve a funcionar y aparece la misma textura en sampler0 y sampler1.
¿Qué está pasando? La línea en cuestión, glActiveTexture(GL_TEXTURE1);
, parece funcionar bien, como lo demuestra un glGetIntegerv(GL_ACTIVE_TEXTURE, &anint)
posterior. ¿Por qué rompe todo tan horriblemente? Ya he intentado actualizar mis controladores de pantalla.
¿Has encontrado la solución a tu problema? Tengo exactamente el mismo problema. – Andrea3000
Sí, la solución etiquetada funcionó para mí. – appas