如何在C 中提高2D OpenGL渲染

How to make 2D OpenGL rendering efficient in C++

本文关键字:2D OpenGL 渲染      更新时间:2023-10-16

我正在使用OpenGL在C 中进行一个小项目。我希望能够以某种颜色或尽可能高效地呈现多个2D矩形。

但是,我在现代C 中这样做,所以我在OpenGL API上写了许多包装器,因此我具有更好的逻辑结构,RAII,...

以这种精神,我想创建一个类矩形,该矩形将具有绘制方法(),并且此方法将激活相应的openGL上下文并调用gldrawarrays()。这很好,但是后来我意识到,如果我想渲染更多的矩形,我将不得不在许多情况下进行循环。他们每个都会切换上下文,我认为这是一个有效的解决方案。

有了一点思考的解决方案之后,我的解决方案是创建一个渲染器对象,该对象将对所有矩形,相关程序和巨大的缓冲区持有一个VAO,我将在其中保留所有坐标的对象(然后,矩形实例将就像一个更聪明的指针到此缓冲区),然后立即将它们全部绘制。当然,这会给我增加用于管理缓冲区本身的工作(添加/删除矩形)。会更好吗?

另外,您还有什么技巧,我还应该专注于什么?

通常要最小化绘图调用的数量。将许多几何数据放在单个缓冲区对象中,然后将其全部批准为单个glDraw…调用绝对是必不可少的方法。最好的方法是不要认为使用opengl是单个对象(没有勺子)绘制的东西,而只是颜色贴片,偶然似乎是矩形,盒子,球形,球,汤匙……

使用C 成语实现此功能的一种方法是具有一个缓冲对象类,该类内部管理包含的数据中包含的数据块。请记住,缓冲对象本身几乎是无形的,只有将它们用作其意义的顶点属性的来源。然后,您的单个矩形将每个矩形从这样的缓冲对象实例分配;返回的实例可以提供相对于某个内部偏移的矩形属性的索引(传递给glVertexAttribPointer的内容);实际上,拥有一个 buffer对象类,a 对象属性视图类(管理属性指针)和在属性视图上操作的实际几何类别。

在准备实际绘图呼叫时,几何实例只会散发其各自顶点的实例;加入它们并将其用于glDrawElements调用。

如果您的几何形状没有改变,那么最佳方法是用一个VBO创建VAO,用于使用一个VBO进行RenCtangle的几何形状,一个带有多个矩形的转换的VBO,您可能会绘制多个矩形和一个vBO纹理坐标,并执行启动您将其从CPU删除大量的Trafic到GPU。此外,如果值不变,请尝试缓存制服,而不会设置每个渲染调用的值。尝试使用GlTrace之类的工具,看看是否可以减少不必要的状态更改。收集尽可能多的数据,然后仅渲染调用。