c++ - 在 OpenGL 中渲染混合线

标签 c++ opengl

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

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

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

[这是线条相互交叉且未正确混合的问题图片]

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

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

OpenGL blending function to elminate primitive overlap but maintain overall opacity

最佳答案

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

lines as simple overlapping rectangles

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

rounded corner cap

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

回应@GuyRT 的回答:GL_MAX 混合模式看起来像这样:

intersection of feathered lines in MAX blend mode

关于c++ - 在 OpenGL 中渲染混合线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22483198/

相关文章:

c++ - 默认初始化数据成员是对象?

c++ - QFile::flush() 与 QFile::close()

c++ - 调整光源大小

c++ - 使用 GLUT 检查 Q 按钮是否被按下?

c++ - 打印 `vector<pair<int, int>>`

c++ - 使用 GoogleTest 进行测试时派生类中的虚函数未被调用

c++ - 参数包和移动语义

file - 用于 opengl 的 3DS 文件加载器

opengl - opengl中纹理单元和采样器制服的对应关系

c++ - 使用 glDrawArrays 绘制多个对象