Мультитекстурирование затемняет всю сцену!

Я реализовал сцену, используя 3 четырехугольника, A, B и C. Quad C отстает от Quad B. Quad B расположен поверх Quad A.

Все квады используют одну и ту же текстуру, за исключением Quad B. Quad B использует альфа-карту и базовую текстуру, которую используют все остальные Quad.

Пример кода ниже показывает, как я рисую Quad B с фиксированной функцией мультитекстурирования.

GLuint alphaGLTexture; 
SDL_SurfaceToGLTexture(aTexture, &alphaGLTexture);

GLuint baseGLTexture;
SDL_SurfaceToGLTexture(baseTexture, &baseGLTexture);

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, alphaGLTexture);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);

glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, baseGLTexture); 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);

glTranslatef(0.0f, 0.0f, 0.0f);

double u_coord = 0.0f, v_coord = 0.0f;

// Renders Quad B
glActiveTexture(GL_TEXTURE0)
glBegin(GL_QUADS);

// remainder of code modifies u_coord, v_coord and draws the other glVertex3f's.
glMultiTexCoord2f(GL_TEXTURE0, u_coord, v_coord);
glMultiTexCoord2f(GL_TEXTURE1, u_coord, v_coord);
glVertex3f(posax, posay, posaz);

Когда я применяю многотекстурированную альфа-карту к Quad B, текстурированные Quads A и C меняют цвет и становятся темнее, чем Quad B.

Когда я удаляю все упоминания в GL_TEXTURE1, все рендерится хорошо, без затемнения, хотя я теряю альфа-отображение на Quad B.

Любые рекомендации или советы? Что-то не так с моими вызовами glTexEnvi?

3 ответа

Решение

Вам необходимо отключить все текстурные блоки, чтобы ни одна из текстур не влияла на остальную часть сцены. Судя по виду вашего кода, вы, вероятно, просто забыли отслеживать свои состояния.

добавлять

glActiveTexture(GL_TEXTURE0);
glDisable(GL_TEXTURE_2D); // or whatever texture target used

glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D); // or whatever texture target used

glActiveTexture(GL_TEXTURE…);
glDisable(GL_TEXTURE_2D); // or whatever texture target used

Вы можете включать и отключать GL_TEXTURE_2D в каждом кадре в зависимости от того, требуется ли это для каждого текстурного блока (как предлагали другие ответы). В качестве альтернативы, вы можете просто отсоединить ненужные текстуры, что должно быть намного быстрее:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D,0);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D,0);

glActiveTexture(GL_TEXTURE0); //make sure to set the active texture unit back to 0

Попробуйте отключить текстурный блок 1, если вы не используете его для других четырехугольников:

// draw Quad B
....

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);

glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);

// draw Quad A
.....

// draw Quad C
.....
Другие вопросы по тегам