如何使用着色器程序将2D场景放入QOpenGLWidget窗口中?

时间:2018-09-03 01:08:19

标签: c++ opengl glsl qt5 shader

我正在尝试将三角形的整个2D场景拟合到一个窗口中。我正在使用着色器程序来处理绘制三角形。我只希望看到900个三角形中的一小部分。但是,当我使用不推荐使用的OpenGL API在类似场景中绘制正方形时,它会按预期工作。

它必须与我传递到顶点着色器中的MVP矩阵有关。请参见scene.cpp模块中的paintGL()方法。那是我在绘制三角形之前设置glViewportmvpMatrix的地方。

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

工具

  • Linux
  • Qt 5.11.1
  • OpenGL ES

设置

  1. 场景是1M x 1M
  2. 使用着色器程序将
  3. 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演示源:

  • squares演示的完整源代码在github上。

1 个答案:

答案 0 :(得分:0)

我发现了错误。我是在triangles.cpp中分配VBO的。我使用了错误的字节数。

更改:

_vertexBuffer.allocate(_vertexes, _vertexCount);

收件人:

_vertexBuffer.allocate(_vertexes, _vertexCount * sizeof(QVector3D));

解决了这个问题。