OpenGL混合:删除被绘制的像素(立即模式)

时间:2017-08-08 15:42:02

标签: java opengl immediate-mode

我想要实现的是一种混合,我在彼此上绘制两个四边形,两个都是透明的,最后绘制的四边形将完全取消前一个四边形的颜色,就像它从未出现过一样。但是,除了那个单一的其他四边形之外,它可能不会影响它背后因为我解释起来很可怕,所以我做了以下图片:

enter image description here

我正在使用非常基本的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 个答案:

答案 0 :(得分:3)

这本身并不是一个混合问题。 解决此问题的一种方法是更改​​深度缓冲区比较功能。 使用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

是否有更简单的方式来做,取决于总体目标是什么。