我需要在OpenGL中绘制一条平滑的线,这就是我所做的:
glEnable( GL_LINE_SMOOTH );
glEnable( GL_POLYGON_SMOOTH );
glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
glBegin( GL_LINE_STRIP );
for( UINT uiPoint = 0; uiPoint < iNumPoints; ++uiPoint )
{
const Coord &Node = vecPoints[uiPoint];
glVertex3f( Node.x, Node.y, Node.z );
}
glEnd();
我还能做些什么?
答案 0 :(得分:22)
您还需要启用混合以使线条平滑处于工作状态。尝试:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
然后绘制线条。将线宽设置为非整数宽度也可能有帮助。
正如其他人所提到的,这不会使多边形边缘平滑,但会产生抗锯齿线。
答案 1 :(得分:12)
您可以生成薄的,面向屏幕的多边形,并根据到线的距离设置片段的alpha。
示例:
a (0,1) b (0,1)
+--------------------------------------+
A | | B
----+--------------------------------------+----
| |
+--------------------------------------+
d (0,0) c (0,0)
假设您要绘制段[AB]。
(或多或少是ShaderX5中使用的技术)
但只有在您不能使用MSAA时才这样做。
答案 2 :(得分:5)
GL_POLYGON_SMOOTH本身对你没有好处。创建OpenGL上下文时,需要强制进行抗锯齿处理。你用什么来创建OpenGL窗口?看它是否支持其参数中的抗锯齿。或者你可以使用Nvidia或ATI工具强制所有OpenGL程序的抗锯齿......这一切都取决于你的设置。
答案 3 :(得分:4)
正如另一个提到的答案,启用抗锯齿有帮助 - 如何启用这取决于您的上下文创建,但此信息有望用于GLFW用户。
如果使用GLFW 2:
glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4);
如果使用GLFW 3:
glfwWindowHint(GLFW_SAMPLES, 4);
...或您喜欢的任何数量的抗锯齿样本。在打开GLFW窗口之前,需要设置上述提示。
答案 4 :(得分:1)
无法保证GL_LINE_SMOOTH
或GL_POLYGON_SMOOTH
可以执行任何操作。
虽然它们看起来像核心功能,但我的经验是许多硬件没有实现这些 - 那些没有实现它的一致,如果它们确实实现了它,性能损失可能相当大。如果你看一下OpenGL规范文档 - 它们为整个库提供了很好的参考,但是你不会在那里找到任何提及它们,因为它们不是规范的一部分。您可以通过查看glEnable的规范在某种程度上确认这一点:khronos.org/opengles/sdk/docs/man/xhtml/glEnable.xml
答案 5 :(得分:-1)
Nanovg是一个2D绘图包,可呈现给OpenGL。我将它与常规OpenGL一起用于填充和描边的2D路径和线条。 https://github.com/memononen/nanovg