如何在C 中提高2D OpenGL渲染
How to make 2D OpenGL rendering efficient in C++
我正在使用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之类的工具,看看是否可以减少不必要的状态更改。收集尽可能多的数据,然后仅渲染调用。
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量
- 如何在OpenGL(GLFW,很高兴)中进行2D缩放?
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- OpenGL 不显示 2D 线
- 如何在 openGL-2D 中绘制不同颜色的线条?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- 如何在C 中提高2D OpenGL渲染
- 无法使用 opengl 正确旋转 2D 对象
- 使用SFML,现代OpenGL转换从2D点到3D
- OpenGL 2D纹理抖动/脉动
- 如何在OpenGl中制作2d棋盘
- 在OpenGL中绘制多个2D纹理
- OpenGl 2d 纹理重复(不同设备上的结果不同)
- OpenGL 渲染大量动态 2D 圆
- 在OpenGL 2.1中,即使在2D空间(具有2D纹理),也可以安全使用3D TEX坐标
- OpenGL:从数据阵列生成2D纹理以显示在四边形上
- Opengl 以 2D 或 3D 显示顶点
- 如何在OpenGL中将两个不同的图像渲染为两个不同图元?2D纹理阵列
- 如何在 2D opengl 中进行拣选
- 如何处理 2D opengl 项目的纹理