3

我正在将 QOpenGLFunctions 与现代 OpenGL 一起使用。我想在我的窗口上画一些 GL_POINTS 但点的大小似乎真的很小。通常,您可以更改点的大小

glPointSize(4);

但是,QOpenGLFunctions 包装器中不存在此代码段,因此我不确定如何更改它们。

绘制 GL_TRIANGLES 对我来说效果很好。

我想绘制点以显示真实世界对象的点云。

4

2 回答 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).

GL_PROGRAM_POINT_SIZE

如果启用并且顶点或几何着色器处于活动状态,则派生的点大小取自(可能裁剪的)内置着色器gl_PointSize,并钳制到与实现相关的点大小范围。

选项 2:使用替代QOpenGLFunctions_???

而不是QOpenGLFunctions,您可以明确使用非便携式替代方案(假设您不需要支持电话、嵌入式或类似的东西)。

Qt 文档中最好的概述。我可以找到:QAbstractOpenGLFunctions

于 2017-12-30T15:46:51.993 回答
0

正如 derhass 建议的那样,首先在您的C++ 代码(不是着色器)中使用这一行启用点大小:

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;
    ...
}
于 2020-12-11T14:46:00.803 回答