如何使用着色器程序将 2D 场景放入 QOpenGLWidget 窗口?
Posted
技术标签:
【中文标题】如何使用着色器程序将 2D 场景放入 QOpenGLWidget 窗口?【英文标题】:How do I fit a 2D scene into a QOpenGLWidget window using a shader program? 【发布时间】:2018-09-03 01:08:19 【问题描述】:我正在尝试将整个 2D 三角形场景放入一个窗口中。我正在使用着色器程序来处理绘制三角形。我只是希望看到的 900 个三角形中的一小部分。但是,当我使用已弃用的 OpenGL API 在类似场景中绘制正方形时,它可以按预期工作。
它一定与我传递给顶点着色器的 MVP 矩阵有关。请参阅scene.cpp 模块中的paintGL()
方法。这就是我在绘制三角形之前设置glViewport
和mvpMatrix
的地方。
我在下面概述了我所做的事情。
工具
Linux Qt 5.11.1 OpenGL ES设置
-
场景为 1M x 1M
使用着色器程序将 900 个三角形添加到场景中
它是一个由 30 x 30 三角形均匀分布在场景中的网格
问题
已尝试将整个场景放入窗口中。 结果是 900 个三角形中只有 75 个在窗口中可见。这是triangles 演示的截图。
三角形演示源:
scene.cpp 模块包含paintGL
方法。
triangles.cpp 模块是设置着色器程序和构造三角形的地方。
triangles 演示的完整源代码在 github 上。
什么有效
我发现使用已弃用的 OpenGL API,使用 GL_QUADS 绘制正方形,可以满足我的要求。但是,我想使用着色器。
这是squares 演示的屏幕截图。它是 1M x 1M 场景中的 10 x 10 方格的网格。
方块演示来源:
squares 演示的完整源代码在 github 上。【问题讨论】:
一个非常广泛的问题。您不能针对特定的源代码缩小范围吗? 【参考方案1】:我发现了错误。我在triangles.cpp 分配VBO。我使用了错误的字节数。
变化:
_vertexBuffer.allocate(_vertexes, _vertexCount);
到:
_vertexBuffer.allocate(_vertexes, _vertexCount * sizeof(QVector3D));
解决了问题。
【讨论】:
以上是关于如何使用着色器程序将 2D 场景放入 QOpenGLWidget 窗口?的主要内容,如果未能解决你的问题,请参考以下文章