Мультитекстурирование затемняет всю сцену! - PullRequest
0 голосов
/ 30 июня 2011

Я реализовал сцену, используя 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 ]

1 голос
/ 30 июня 2011

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

Добавить

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
0 голосов
/ 01 июля 2011

Вы можете включать и отключать 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
0 голосов
/ 30 июня 2011

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

// draw Quad B
....

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);

glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);

// draw Quad A
.....

// draw Quad C
.....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...