【问题标题】:Qt OpenGL point sizeQt OpenGL点大小
【发布时间】:2017-12-30 12:00:40
【问题描述】:

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

更改点的大小
glPointSize(4);

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

绘制 GL_TRIANGLES 非常适合我。

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

【问题讨论】:

    标签: c++ qt opengl 3d glpointsize


    【解决方案1】:

    如果您使用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),否则,该值将被忽略,当前设置的点大小来自 @使用 987654340@。
    • @derhass 谢谢。我将此提示添加到我的答案中。
    • 好吧,我认为您的更新现在有点混乱。您首先明确地谈论 OpenGL ES,它没有那个启用位并且表现得好像它总是启用的,所以在 ES 上,它不是必需的。在桌面 GL otoh 上,您必须启用它。
    • @derhass 修复了它
    【解决方案2】:

    按照 derhass 的建议,首先在您的 C++ 代码(不是着色器)中使用此行启用点大小

    glEnable(GL_PROGRAM_POINT_SIZE);
    

    然后按照 Scheff 的建议,在您的 vertex 着色器代码中添加 gl_PointSize 内置函数。 因此,例如,如果您想要一个点的大小为 12,就这样使用它。

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

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多