Я пытаюсь реализовать альфа-маскирование с использованием 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, работает последовательно для наземных и фоновых четырехугольников.