Мультитекстурирование opengl уничтожает мою сцену! - PullRequest
1 голос
/ 10 июня 2011

Я пытаюсь реализовать альфа-маскирование с использованием opengl и мультитекстурирования. У меня есть альфа-изображение (это RGB без данных в альфа-канале) и другое изображение (также RGB без альфы), которое я хотел бы замаскировать альфа-изображением. Я использую в сцене четырехугольники: квадрат и фон, а затем квад, который представляет сущность, которую я пытаюсь замаскировать.

Когда я «включаю» код мультитекстурирования, квадраты земли и фона стираются с экрана. Я вижу передний план с изображением, и он правильно замаскирован. Когда я выключаю код мультитекстурирования, сцена визуализируется, как и ожидалось, но при этом удаляются объект и изображение переднего плана (вместе с мультитекстурированием).

Я изменил свою альфа-маску и обнаружил, что мультитекстурирующий код рисует огромную плоскость (несмотря на мои вычисления UV-координат и вызовы glVertex3f) с исходным изображением и альфа-картой. У меня создается впечатление, что OpenGL игнорирует мой вызов glVertex3f.

Мне пришлось изменить GL_SOURCE0_RGB на GL_SOURCE1_RGB, если я этого не сделаю, я получаю очень странное поведение с видеокарты (объект переднего плана рендерится, но маска не применяется и превращается в серый квад правая сторона экрана с нанесенной на него фанкой проекцией). Я проверил это на 2 системах, и в обоих случаях это одинаковое поведение.

Я пытаюсь использовать метод мультитекстурирования с фиксированным конвейером.

GLuint alphaGLTexture; 
SDL_SurfaceToGLTexture(aTexture, &alphaGLTexture);

GLuint fgGLTexture;
SDL_SurfaceToGLTexture(fgTexture, &fgGLTexture);

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, fgGLTexture); 

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;

glBegin(GL_QUADS);

glMultiTexCoord2f(GL_TEXTURE0, u_coord, v_coord);
glMultiTexCoord2f(GL_TEXTURE1, u_coord, v_coord);
glVertex3f(posax, posay, posaz);

u_coord = 1.0f; v_coord = 0.0f;
glMultiTexCoord2f(GL_TEXTURE0, u_coord, v_coord);
glMultiTexCoord2f(GL_TEXTURE1, u_coord, v_coord);
glVertex3f(posbx, posby, posbz);

u_coord = 1.0f; v_coord = 1.0f;
glMultiTexCoord2f(GL_TEXTURE0, u_coord, v_coord);
glMultiTexCoord2f(GL_TEXTURE1, u_coord, v_coord);
glVertex3f(poscx, poscy, poscz);

u_coord = 0.0f; v_coord = 1.0f;
glMultiTexCoord2f(GL_TEXTURE0, u_coord, v_coord);
glMultiTexCoord2f(GL_TEXTURE1, u_coord, v_coord);
glVertex3f(posdx, posdy, posdz);

glEnd();

glLoadIdentity();

Функция, SDL_SurfaceToGLTexture, работает последовательно для наземных и фоновых четырехугольников.

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

Вы привязываете альфа-текстуру к GL_TEXTURE0, а текстуру переднего плана к GL_TEXTURE1. Но при рисовании вы устанавливаете координаты текстуры для GL_TEXTURE1 и GL_TEXTURE2. Это задумано или это может быть вашей проблемой?

РЕДАКТИРОВАТЬ: Вы уверены, что вы отключили текстурирование для всех единиц, кроме тех, которые используются при рендеринге фона четырехугольников. Кроме того, имейте в виду, что текстурная среда является состоянием на единицу, а не состоянием на каждую текстуру, поэтому вам также необходимо восстанавливать ее при использовании текстурирования на фоновых квадратах.

Решение Криса связано с этим. Просто имейте в виду, что OpenGL является конечным автоматом, и когда не сбрасывается активный текстурный блок, все последующие текстурные операции применяются к GL_TEXTURE1, а когда не отключается текстурирование для неиспользуемых блоков, все последующие объекты (конечно, даже в следующем кадре) ) будет нарисован многократно.

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

После настройки текстурного окружения для второго уровня, попробуйте вызвать "glActiveTexture (GL_TEXTURE0);" снова. Я видел много странностей, когда забыл сбросить уровень текстуры обратно на GL_TEXTURE0.

Кроме того, разбрасывайте некоторые вызовы glGetError () после каждых нескольких вызовов OpenGL, чтобы увидеть, есть ли ошибка в невинном поиске.

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