Qt OpenGL 点大小

3
我正在使用基于现代OpenGL的QOpenGLFunctions。我想在我的窗口上绘制一些GL_POINTS,但点的大小似乎非常小。通常,您可以使用`glPointSize()`函数更改点的大小。
glPointSize(4);

然而,在QOpenGLFunctions包装器中不存在此代码片段,因此我不确定该如何更改它们。
对于我来说,绘制GL_TRIANGLES非常完美。
我想绘制点以显示真实世界物体的点云。
2个回答

5
如果您使用QOpenGLFunctions,实际上没有glPointSize()可用。为什么?

QOpenGLFunctions类提供跨平台访问OpenGL ES 2.0 API。

khronos.org上进行交叉检查:

+--------------+-----------------------------------------------------------------------+
| Function /   |                             OpenGL Version                            |
| Feature Name | 2.0 | 2.1 | 3.0 | 3.1 | 3.2 | 3.3 | 4.0 | 4.1 | 4.2 | 4.3 | 4.4 | 4.5 |
+--------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| glPointSize  |  v  |  v  |  v  |  v  |  v  |  v  |  v  |  v  |  v  |  v  |  v  |  v  |
+--------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
所以,它支持OpenGL但不支持OpenGL ES。
有两个可能的选择:
选项1:gl_PointSize 在OpenGL ES中,您可以使用GLSL着色器变量gl_PointSize代替。
(我在搜索适当的文档链接时“偶然”发现了这一点 - 以前从未知道过也从未使用过。) derhass提供了额外的提示,如果启用glEnable(GL_PROGRAM_POINT_SIZE),这也可以与OpenGL(非ES)一起使用。
引用: GL_PROGRAM_POINT_SIZE 如果启用并且顶点或几何着色器处于活动状态,则派生点大小取自(可能被裁剪的)着色器内置gl_PointSize并夹在实现相关的点大小范围内。

选项2:使用另一种QOpenGLFunctions_???

除了QOpenGLFunctions之外,您可以明确使用非便携式的替代方法(假设您不需要支持手机、嵌入式或类似设备)。

我在Qt文档中找到的最好的概述是:QAbstractOpenGLFunctions


选项1的补充:如果您想在桌面GL上使用gl_PointSize顶点着色器输出,则必须启用glEnable(GL_PROGRAM_POINT_SIZE),否则该值将被忽略,并且将使用从glPointSize设置的当前点大小。 - derhass
@derhass 谢谢。我已经将这个提示添加到我的答案中了。 - Scheff's Cat
嗯,我认为你的更新现在有点令人困惑。你首先明确谈论了OpenGL ES,它没有那个启用位,并且表现得好像它总是被启用的,因此在ES上不需要它。然而,在桌面GL上,你必须启用它。 - derhass
1
@derhass已经修复了它。 - Scheff's Cat

0
如derhass所建议的,首先在您的C++代码中(而不是着色器)使用以下行启用点大小:

enable the point size

glEnable(GL_PROGRAM_POINT_SIZE);

接着像Scheff建议的那样,在你的顶点着色器代码中添加gl_PointSize内置函数。 例如,如果你想要一个大小为12的点,就像这样使用它。

// main from your vertex.glsl shader (not from your main.cpp!)
void main() {
    ...
    gl_PointSize = 12;
    ...
}

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