OpenGL 混合:删除被绘制的像素(立即模式)
OpenGL blending: Remove pixels being drawn over (immediate mode)
我想要实现的是一种混合,我在其中绘制两个四边形,它们都是透明的,最后绘制的四边形将完全取消前一个四边形的颜色,就好像它从未存在过一样。然而,它可能不会影响它后面的任何东西,除了那个单独的其他四边形。因为懒得解释,所以做了下图:
我使用的是非常基本的 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
是否有更简单的方法,取决于总体目标是什么。
我想要实现的是一种混合,我在其中绘制两个四边形,它们都是透明的,最后绘制的四边形将完全取消前一个四边形的颜色,就好像它从未存在过一样。然而,它可能不会影响它后面的任何东西,除了那个单独的其他四边形。因为懒得解释,所以做了下图:
我使用的是非常基本的 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
是否有更简单的方法,取决于总体目标是什么。