Моя проблема заключается в получении более одной текстуры, доступной в шейдере GLSL. Вот что я делаю:
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;
}
};
Итак, я просто выбираю между двумя значениями цвета на основе единой переменной. Достаточно просто (это тест), но вместо ожидаемого поведения я получаю весь черный , когда blend <= 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)
. Почему это так ужасно нарушает? Я уже пробовал обновить свои драйверы дисплея.