如何在OpenGL中交叉两个平滑的形状?

时间:2013-03-14 16:25:53

标签: opengl-es opengl-es-2.0 alpha masking blending

我已经使用生成三角形条的例程在OpenGL中成功绘制了两个平滑形状,其最外边缘线的所有顶点都在alpha 0。现在我想要与它们相交,但我似乎总是失去一个形状的光滑边缘。这是我正在使用的代码:

// Draw: smooth black shape as normal

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
// Draw: smooth black shape into alpha channel

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glBlendFunc(GL_DST_ALPHA, GL_SRC_ALPHA);
// Draw: Yellow overlay shape with black shape's alpha

// Reset blending modes for rest of program

Combined Shapes http://img268.imageshack.us/img268/1000/combineshapes.jpg

这是结果(在底部) - 黄色形状失去了平滑的右手边缘,因为这些像素中的alpha现在是1.我怎样才能获得平滑的相交形状?

2 个答案:

答案 0 :(得分:0)

你需要这样的代码片段:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendEquation(GL_FUNC_ADD);
glEnable(GL_BLEND);

我认为关键元素是glEnable(GL_BLEND)。

答案 1 :(得分:0)

我很长时间都在努力解决这个问题,并尝试了glColorMaskglBlendEquation的每个绘图顺序和组合。最后我意识到有一个非常简单的解决方案 - 预乘alpha。

在我的“平滑形状”绘图程序中,而不仅仅是将外部平滑边缘绘制为相同的颜色alpha=0,我允许指定外部平滑颜色。对于黄色形状,我指定了黑色,并且在整个形状具有光滑边缘的同时给了我光滑的边缘 - 即使黄色形状的右边缘没有被alpha通道遮盖。