Маскирование OpenGL с помощью альфа-смешивания

Я пытаюсь сделать 3 текстуры,
-Фон
-Черная / белая маска переднего плана
-Foreground

Я использовал это OpenGL — маска с несколькими текстурами
потому что это точно решает мою проблему. Но я не могу заставить его работать. Я получаю только последнюю текстуру рендеринга, в данном случае переднего плана. Я вызвал glutInitDisplayMode (GLUT_ALPHA); чтобы получить альфа рендеринг, как предложено в ответе.
Кто-нибудь может обнаружить ошибки с моей стороны?

Мой код выглядит следующим образом:

double stretch = ((double)m_videoResY * (double)m_depthResX) / ((double)m_videoResX * (double)m_depthResY);

glEnable(GL_BLEND);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(+0.5, -0.5, +0.5, -0.5, 0.001f, 1.0);

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -0.5f);

glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glDisable(GL_DEPTH_TEST);

glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBlendFunc(GL_ONE, GL_ZERO);

glBindTexture(GL_TEXTURE_2D, m_backgroundTexture);//Draw BGTexture

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glBegin(GL_QUADS);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-0.5f, -0.5f, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-0.5f, 0.5f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(0.5f, 0.5f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(0.5f, -0.5f, 0.0f);
glEnd();glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO);

//mask with userID
glBindTexture(GL_TEXTURE_2D, m_userIDTexture);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-0.5f, -0.5f, 0.0f);
glTexCoord2f(1.0f, 1.0f * stretch);
glVertex3f(-0.5f, 0.5f, 0.0f);
glTexCoord2f(0.0f, 1.0f * stretch);
glVertex3f(0.5f, 0.5f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(0.5f, -0.5f, 0.0f);
glEnd();//blend with Video of User
glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);glBindTexture(GL_TEXTURE_2D, m_videoTexture);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-0.5f, -0.5f, 0.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-0.5f, 0.5f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(0.5f, 0.5f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(0.5f, -0.5f, 0.0f);
glEnd();

1

Решение

Я полагаю, ваши ошибки:

Когда вы рисуете свой фон с помощью glBlendFunc (GL_ONE, GL_ZERO);
В результате вы обычно рисуете его в кадровом буфере, но, не предоставляя никакой необходимой операции смешивания, более эффективным на этом этапе является то, что вы вообще не используете смешивание. Итак, более эффективным является glDisable (GL_BLEND), но ваш проход работает здесь так, как вы ожидаете.

На втором проходе вы рисуете с помощью glBlendFuncSeparate (GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO); Я не знаю, почему вы используете здесь такую ​​изощренную функцию и раздельно смешиваете цвета и альфа-значения.
Итак, что касается третьего прохода, я полагаю, что вы хотите изменить альфа-значение фона с помощью маски черного / белого цвета переднего плана. Если это правда, вы должны использовать glBlendFuncSeparate (GL_ZERO, GL_ONE, GL_ZERO, GL_SRC_COLOR); — Да, маленькая ошибка.

И на третьем проходе, когда вы рисуете передний план, у вас есть glBlendFunc (GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA), что означает, что вы хотите нарисовать те области, где ваша черно-белая маска была белой и смешивалась с затуханием для более темных областей маски.

Если у вас есть какие-либо вопросы о glBlendFunc, я могу вам помочь.

0

Другие решения