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

Я реализовал сцену, используя 3 quad, A, B и C. Quad C находится за quad B. Quad B находится поверх Quad A.

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

В приведенном ниже примере кода показано, как я рисую 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?


person ct_    schedule 29.06.2011    source источник


Ответы (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
person datenwolf    schedule 29.06.2011
comment
вызывает glActiveTexture(GL_TEXTUREN); синоним вызова glEnable(GL_TEXTURE_2D); ? - person ct_; 30.06.2011
comment
@ct: Нет, он переключает текущий активный модуль текстурирования, glEnable/glDisable(GL_TEXTURE_…) включает/отключает активный модуль текстурирования. Это очень похоже на glMatrixMode. - person datenwolf; 30.06.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
.....
person genpfault    schedule 29.06.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
person fintelia    schedule 01.07.2011