在OpenGL中渲染混合线

时间:2014-03-18 15:02:45

标签: c++ opengl

我想绘制大量的四边形,每个四边形代表曲线的一小部分,这样曲线看起来很光滑,但实际上只是由线性碎片组成。我还希望能够设置线的粗细和线的混合部分的厚度,使得在混合区域中线线性地丢失其α分量。理想情况下,这些线条能够在3D场景中以任何方式定向,尽管它们通常位于面向相机的平面中。

问题在于难以将线与背景混合而不会使重叠的部分彼此相互作用,在许多重叠的地方变得更亮。我只希望线的一个片段与背景混合,但如果分别渲染每个四边形,很难知道哪个片段是正确的。

有没有一种有效的方法来做这样的事情?或者我是否必须进行某种预处理才能将线条转换为1个网格而不是将其渲染为一堆四边形?

[以下是相互交叉的问题的图片&没有正确混合]

http://i.imgur.com/8cYm1zK.png

这是一个相关的问题,但它有所不同,因为我想混合四边形,使它们线性脱落。如果从该线程实现解决方案,则混合看起来不正确。

OpenGL blending function to elminate primitive overlap but maintain overall opacity

2 个答案:

答案 0 :(得分:3)

看起来您将线条渲染为简单的重叠矩形,如下所示:

lines as simple overlapping rectangles

为了获得完美的效果,你需要像这样渲染角帽,没有任何重叠:

rounded corner cap

想想你是如何构建那些橙色点的。您可以使用三角形风扇来近似圆形盖帽。您也可以根据自己的喜好制作尖角或扁平角。

回应@ GuyRT的回答:GL_MAX混合模式如下所示:

intersection of feathered lines in MAX blend mode

答案 1 :(得分:2)

您可以使用glBlendEquation( GL_MAX )将线条绘制到FBO中,然后使用glBlendEquation( GL_FUNC_ADD )(默认的混合方程式)将结果与背景合并。

一个更好的选择(根据japreiss&OP和OP的评论),只是将线条的明亮部分绘制到FBO中,然后模糊结果(首先水平到另一个缓冲区)在合成到背景之前,然后再次垂直进入第一个缓冲区。