如何使用OpenGL在2D场景中绘制平滑线而不使用GL_LINE_SMOOTH?

Roo*_*kie 11 c++ opengl glsl

由于GL_LINE_SMOOTH不是硬件加速,并非所有GFX卡都支持,如何在2D模式下绘制平滑线,这看起来与GL_LINE_SMOOTH一样好?

编辑2:我目前的解决方案是从2个四边形中绘制一条线,从边缘渐变为零透明度,这两个四边形之间的颜色将是线条颜色.它对于基本的平滑线条渲染效果不错,并且不使用纹理,因此渲染速度非常快.

Nic*_*las 10

所以,你想要平滑的线条,而不是:

  • 线平滑.
  • 全屏抗锯齿.
  • 着色器.

好的.

您最好的选择是使用Valve的Alpha测试放大技术.根据您的需要,基本思想是创建一个纹理,表示距离线的距离,纹理的中心距离为1.0.这可能是一维纹理.

然后使用本文中描述的技术(其中许多使用固定功能,包括抗锯齿版本),绘制一个代表你的线条的四边形.显然你需要alpha混合(因此它不是与顺序无关的).您可以使用线宽来控制它变为合适颜色的距离,从而可以制作窄线或宽线.


使用着色器执行此操作几乎与上面相同,除了没有纹理.不是访问距离纹理,而是从顶点着色器传递和插值距离.对于四边形的左边缘,顶点着色器通过0.对于右边缘,它通过1.将此乘以2,减去1,并取绝对值.

这是你离线的距离(线是四边形的中心).然后就像Valve的算法一样使用那个距离.

  • @Rookie:"更多内存"是指4KB(可能是GPU的最小可能分配).每行不需要一个纹理,只需要一个纹理周期.如上所述,它可能是一维纹理; 它也不一定特别大.16x1`GL_LUMINANCE8`纹理可以正常工作.不知何故,我不认为你会错过4K的RAM. (4认同)

Roo*_*kie 1

目前我使用 2 或 3 个四边形来执行此操作,这是最简单的方法。

  • 如果线条粗细 <= 1px,那么您只需要 2 个四边形。
  • 如果线条粗细> 1px,那么您需要在中间添加第三个四边形。
  • 如果线条粗细 >= 1px,则淡入淡出边缘四边形的粗细不得改变。

在下图中,您可以看到带有蓝色边框的四边形。白色表示完全不透明度,黑色表示零不透明度(=完全透明)。

在此输入图像描述