Java OpenGL混合:删除正在绘制的像素(即时模式)

Java OpenGL混合:删除正在绘制的像素(即时模式),java,opengl,immediate-mode,Java,Opengl,Immediate Mode,我想要实现的是一种混合,我在上面画两个四边形,都是透明的,最后画的四边形将完全取消前一个四边形的颜色,就好像它从未出现过一样。然而,它可能不会影响它后面的任何东西,除了那一个四元。因为我很难解释,所以我制作了以下图像: 我使用的是非常基本的openGL即时模式函数。 目前,我有以下几点: glEnable(GL_BLEND) glColor4f(0,0,1,0.3f); glBegin(GL_QUADS); { glVertex2d(100, -100); glVertex2d

我想要实现的是一种混合,我在上面画两个四边形,都是透明的,最后画的四边形将完全取消前一个四边形的颜色,就好像它从未出现过一样。然而,它可能不会影响它后面的任何东西,除了那一个四元。因为我很难解释,所以我制作了以下图像:

我使用的是非常基本的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();

这本身并不是一个真正的混合问题。 解决此问题的一种方法是更改深度缓冲区比较函数。 对绿色方块使用
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


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

这本身并不是一个真正的混合问题。 解决此问题的一种方法是更改深度缓冲区比较函数。 对绿色方块使用
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


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

“都是透明的”。。。如果它们相互覆盖,则它们是不透明的。所以你不想要不透明的渲染吗?一点也不。在我想要渲染的项目中,在这两个四边形后面也有渲染的东西(尽管它们实际上是更复杂的形状)。我想看看这些形状的背后是什么,形状本身不会像它们那样重叠。看到图中的黑线了吗?只需禁用混合?这会再次挫败我尝试的目的。使用此ontop,已经渲染了整个场景。四边形需要透明;所以你也可以看到他们在后面覆盖的部分。图像中的线条在四边形后面,而不是前面!“都是透明的”。。。如果它们相互覆盖,则它们是不透明的。所以你不想要不透明的渲染吗?一点也不。在我想要渲染的项目中,在这两个四边形后面也有渲染的东西(尽管它们实际上是更复杂的形状)。我想看看这些形状的背后是什么,形状本身不会像它们那样重叠。看到图中的黑线了吗?只需禁用混合?这会再次挫败我尝试的目的。使用此ontop,已经渲染了整个场景。四边形需要透明;所以你也可以看到他们在后面覆盖的部分。图像中的线条在四边形后面,而不是前面!看来我想得太多了。非常感谢!有没有办法将深度缓冲区恢复到渲染后清除深度缓冲区之前的状态?一种方法是重新绘制所有内容。但这看起来性能非常高/效率非常低。还有其他方法吗?还有其他方法,但这取决于总体目标是什么,我建议一个总体更好的方法。我正在做的是添加(修改)一个游戏。我正在绘制一个GUI,它有多个轮廓、圆角矩形(轮廓只是一个较大的圆角矩形)。我希望GUI是透明的,这就是为什么我问这个问题,以使大纲正常工作。但是,在绘制GUI的中途清除深度缓冲区会破坏一些图形元素。这就是为什么我想在渲染矩形后恢复它。看起来我完全想过头了。非常感谢!有没有办法将深度缓冲区恢复到渲染后清除深度缓冲区之前的状态?一种方法是重新绘制所有内容。但这看起来性能非常高/效率非常低。还有其他方法吗?还有其他方法,但这取决于总体目标是什么,我建议一个总体更好的方法。我正在做的是添加(修改)一个游戏。我正在绘制一个GUI,它有多个轮廓、圆角矩形(轮廓只是一个较大的圆角矩形)。我希望GUI是透明的,这就是为什么我问这个问题,以使大纲正常工作。但是,在绘制GUI的中途清除深度缓冲区会破坏一些图形元素。这就是为什么我想在渲染矩形后恢复它。