OpenGL 3.2核心配置文件glLineWidth

10

我正在Mac OS X上设置OpenGL 3.2核心上下文。 我想要能够在屏幕上绘制一些粗黑线。 在以前的OpenGL版本中,我可以这样设置:

glLineWidth(10.0f);

我会得到一条宽度为10像素的线。但是当我检查3.2 Core中的线宽范围时

GLint range[2];
glGetIntegerv(GL_ALIASED_LINE_WIDTH_RANGE, range);
glGetIntegerv(GL_SMOOTH_LINE_WIDTH_RANGE, range);

我获取到用于Aliased线的值为1,Smooth线的值为0-1。如何在屏幕空间中绘制宽度为10.0像素的线条?是否有一种简单的方法可以绘制这种线条而不是将每个线段制作成矩形?

3个回答

8
使用OpenGL 3.2核心配置文件,在调用glLineWidth时,如果值大于1.0,则会产生INVALID_VALUE错误(调用glGetError来证明)。
确定绘制线所需的四边形,可以获得所需的结果。
我认为你应该能够从线点生成四边形:嘿,一个更大的线是一个四边形!也许你可以使用像this这样的技术来获得你想要的结果。
关键是:不要依赖LineWidth,而是将一个单位四边形作为输入(使用三角带的4个顶点),然后在着色器内部转换传入的顶点并传递相应的uniform变量。
也许另一种方法是使用几何着色器进行渲染:从一个点生成一个四边形。然而,我不确定这一点。我不知道使用几何着色器(当然只有可行的情况下)是否是最佳方法:对于组成条带的每条线,绘制单个四边形的成本是着色器uniform设置。

看起来最好/唯一的方法是通过初始几何体或几何着色器绘制完整的几何体。 - user1139069
1
对于那些想知道此限制在哪里记录的人,GL3.3规范中的章节E.2.1中有记录,而不是记录LineWidth的3.5章节中。 - Ruslan

1

线宽 > 1.0 已被弃用并不再在核心配置文件 OpenGL Context 中支持。
但是,在兼容性配置文件上仍然得到维护。

请参阅 OpenGL 4.6 API Core Profile Specificatio - E.2.1 Deprecated But Still Supported Features

以下功能已被弃用,但仍存在于核心配置文件中。它们可能会在未来的 OpenGL 版本中被删除,并且在实现核心配置文件的向前兼容上下文中被删除。

  • 宽线 - LineWidth 值大于 1.0 将生成 INVALID_VALUE 错误

针对核心配置文件上下文,可能在以下答案中提供解决方案:
OpenGL线宽
GLSL几何着色器替换glLineWidth
在OpenGL中绘制可变宽度的线条(无需glLineWidth)
OpenGL:在三维空间中绘制粗且光滑/非断裂线条


1
这可能取决于您设置的投影类型。您正在使用正交或透视投影矩阵吗?
我认为如果您没有使用正交投影,那么基元的最终光栅化将受到对象(模型矩阵)与相机(视图矩阵)之间距离的影响。
祝好!

我正在使用正交投影。 - user1139069

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接