11

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

Edit2:我目前的解决方案是从 2 个四边形中画一条线,从边缘褪色到零透明度,这两个四边形之间的颜色将是线条颜色。它对于基本的平滑线渲染足够好,并且不使用纹理,因此渲染速度非常快。

4

3 回答 3

11

所以,你想要流畅的线条,没有:

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

好的。

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

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


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

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

于 2012-05-12T00:10:57.000 回答
3

打开全屏抗锯齿并使用四边形将是我的首选。

于 2012-04-27T16:25:17.800 回答
1

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

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

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

在此处输入图像描述

于 2012-08-20T10:09:04.760 回答