2016-11-13 105 views
0

我正在尝试用现代Opengl绘制矩形,使用着色器进行填充和描边。我将填充颜色,笔触颜色和笔触宽度发送到片段着色器中的统一块(以及矩形位置和大小)。将笔画片段设置为笔触颜色并将填充片段填充到填充颜色的建议方法是什么?GLSL中的2D矩形笔画

目前,我有两个想法在我脑海中浮动。首先,if语句检查碎片坐标是否位于矩形或矩形区域的边界内,并根据该区域设置碎片颜色。这种方法会产生相当大的一个复杂的if语句,当它旋转矩形时,它可能会变得更糟。 (另外,我读过应该避免在着色器中分支)

我的第二个想法是使用带符号的距离函数来确定颜色,但我不熟悉使用这些,我有这个想法他们不太擅长做尖角。

我在这里脱颖而出吗?有没有更好的方法来做到这一点?

回答

0

片段着色器听起来像一个舞台,如果你想光栅化描边,那就太迟了。在栅格化过程已执行之后,片段着色器被执行。如果我可以提出建议,我会考虑使用geometry shader来即时生成笔划的几何图形。虽然可以逐步将数据添加到VBO是最好的解决方案(因为大部分笔画不会随时间而改变)。如果您的绘图区域的分辨率没有改变,您还可以考虑将笔触渲染为纹理,并修改它。

0

您需要2个绘制调用,一个用于填充矩形,另一个用于未填充矩形。 你也可以使用这个库https://github.com/memononen/nanovg

+0

通过填充和未填充,你是指一个绘图调用笔画几何和一个绘制调用剩余的填充几何?另外,是的,我现在正在使用nanovg,但我正试图建立自己的图书馆以摆脱它。 – user1435899

+0

是的,一个用于中风,一个用于填充。 建立你自己的图书馆是毫无意义的,你会得到很多的错误和非便携式解决方案。麻省理工学院的许可证非常灵活,您可以轻松改进nanovg用于特殊用途。此外,nanovg可以轻松移植到DirectX,Vulkan和其他图形API – quazeeee