Смешивание OpenGL: удаляет пиксели, которые рисуются поверх (немедленный режим)
Чего я хотел бы добиться, так это смешивания, в котором я нарисую два четырехугольника поверх друг друга, оба прозрачных, а последний нарисованный квад полностью отменит цвет предыдущего квадрата, как если бы его никогда не было. Тем не менее, это может не повлиять на что-либо за этим, кроме этого единственного другого четырехугольника. Поскольку я ужасно объясняю, я сделал следующее изображение:
Я использую очень простые функции непосредственного режима openGL. В настоящее время у меня есть что-то вроде:
glEnable(GL_BLEND)
glColor4f(0,0,1,0.3f);
glBegin(GL_QUADS);
{
glVertex2d(100, -100);
glVertex2d(-100, -100);
glVertex2d(-100, 100);
glVertex2d(100, 100);
}
glEnd();
glColor4f(0,1,0,0.3f);
glBegin(GL_QUADS);
{
glVertex2d(150, -50);
glVertex2d(-50, -50);
glVertex2d(-50, 150);
glVertex2d(150, 150);
}
glEnd();
1 ответ
Это не проблема смешивания как таковая. Одним из способов решения этой проблемы было бы изменение функции сравнения буфера глубины. использование GL_LESS
для зеленого квадрата, в то время как сначала рисуем синий квадрат. Таким образом, пиксели зеленого квадрата, перекрывающего синий квадрат, просто не будут нарисованы вообще для начала.
glDepthFunc(GL_LEQUAL);
// Draw the blue square
glDepthFunc(GL_LESS);
// Draw the green square
Если вы хотите, чтобы элементы были видны как под синим, так и зеленым квадратом. Вы можете нарисовать сначала, а затем очистить буфер глубины, а затем он будет таким же.
glDepthFunc(GL_LEQUAL);
// Draw the red squares
glClear(GL_DEPTH_BUFFER_BIT);
glDepthFunc(GL_LEQUAL);
// Draw the blue square
glDepthFunc(GL_LESS);
// Draw the green square
Есть ли более простой способ сделать это, зависит от общей цели.