java - OpenGL混合: Remove pixels being drawn over (immediate mode)

标签 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();

最佳答案

这本身并不是一个真正的混合问题。 解决此问题的一种方法是更改​​深度缓冲区比较函数。 使用 GL_LESS 绘制绿色方 block ,同时先绘制蓝色方 block 。 这样,绿色方 block 的像素与蓝色方 block 重叠,就根本不会被绘制。

glDepthFunc(GL_LEQUAL);
// Draw the blue square

glDepthFunc(GL_LESS);
// Draw the green square

如果您想让元素在蓝色和绿色方 block 下可见。您可以绘制第一个,然后清除深度缓冲区,然后它是相同的。

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

是否有更简单的方法来做到这一点,取决于总体目标是什么。

关于java - OpenGL混合: Remove pixels being drawn over (immediate mode),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45572655/

相关文章:

java - 如何绘制从相机到 3D 区域的投影线?

c++ - 从鼠标坐标到 3d 的点-三角形相交?

java - 在 C++ 中是否有 Java 'volatile' 的等价物?

java - 遍历数组 - 仅打印第一个索引

Java - 数组元素的排列 - 解释清楚

opengl - 在 OpenGL 中使用 RGB 纹理作为 alpha 值/子像素字体渲染

compilation - 自定义控制流编译词示例

OpenGL:为什么当物体旋转时照明会改变?

c++ - 立即模式未正确绘制 alpha 纹理

java - Morena 版本 6 与 7