如何使用着色器程序将 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() 方法。这就是我在绘制三角形之前设置glViewportmvpMatrix 的地方。

我在下面概述了我所做的事情。

工具

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 窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何将浮点矩阵作为 2D 纹理传递给片段着色器?

带有着色器的 2D 照明 - 受窗口大小影响的光半径

OpenGL ES之如何传输一个超大数组给着色器程序

将 Sampler2D 与着色器一起使用的问题

如何将噪声着色器放入我的平面几何体中

渐变着色器 Z 仅在场景视图中战斗