c++ - 如何在不使用 GL_LINE_SMOOTH 的情况下使用 OpenGL 在 2D 场景中绘制平滑线条?

标签 c++ opengl glsl

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

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

最佳答案

因此,您想要流畅的线条,但不包含:

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

好的。

最好的办法是使用 Valve 的 Alpha-Tested Magnification technique .根据您的需要,基本思想是创建一个表示与线的距离的纹理,纹理中心的距离为 1.0。这可能是一维纹理。

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


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

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

关于c++ - 如何在不使用 GL_LINE_SMOOTH 的情况下使用 OpenGL 在 2D 场景中绘制平滑线条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10352870/

相关文章:

c++ - 将两个图像堆栈的非幂加载到 3d 纹理 OpenGL C++

c++ - 超出窗口的 opengl 菜单是如何实现的?

java - LWJGL 3 - 渲染文本

c++ - vector::erase 和 reverse_iterator

c++ - 如何在 Windows 上使用 Visual C++ 强制加载链接库

c++ - 为什么非成员函数不允许使用 const 之类的修饰符

c# - 顶点属性缓冲区绑定(bind)到错误的属性

glsl - 使用 Phong 照明和定向照明

opengl - 在 GLSL 中混合多个纹理

c++ - 使用 Linux 访问并口