如何在 OpenGL 中使两个平滑形状相交?

Dan*_*day 5 alpha blending opengl-es masking opengl-es-2.0

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

\n
// Draw: smooth black shape as normal\n\nglColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);\n// Draw: smooth black shape into alpha channel\n\nglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);\nglBlendFunc(GL_DST_ALPHA, GL_SRC_ALPHA);\n// Draw: Yellow overlay shape with black shape\'s alpha\n\n// Reset blending modes for rest of program\n
Run Code Online (Sandbox Code Playgroud)\n

组合形状

\n\n

这是结果(底部)\xe2\x80\x94 黄色形状失去了平滑的右侧边缘,因为这些像素中的 alpha 现在为 1。如何获得平滑的相交形状?

\n

Dan*_*day 1

我在这个问题上挣扎了很长时间,并尝试了每一种绘图顺序以及glColorMask和的组合glBlendEquation。最后我意识到有一个非常简单的解决方案 \xe2\x80\x94 预乘 alpha。

\n\n

在我的“平滑形状”绘图例程中,不仅仅是将外部平滑边缘绘制为相同的颜色,alpha=0在我的“平滑形状”绘图例程中,我允许指定外部平滑颜色,对于黄色形状,我指定了黑色,这给了我一个平滑的边缘,同时整体形状具有平滑的边缘 \xe2\x80\x94 即使黄色形状的右侧边缘没有被阿尔法通道。

\n