iOS OpenGL ES 2.0 VBO 混淆

Posted

技术标签:

【中文标题】iOS OpenGL ES 2.0 VBO 混淆【英文标题】:iOS OpenGL ES 2.0 VBO confusion 【发布时间】:2014-04-28 16:08:36 【问题描述】:

我正在尝试在 iPhone 上渲染大量带纹理的四边形。为了提高渲染速度,我创建了一个 VBO,我可以利用它在一次绘制调用中渲染我的对象。这似乎运作良好,但我是 OpenGL 的新手,在为我的每个四边形提供独特的变换时遇到了问题(最终我正在寻找每个四边形具有自定义比例、位置和旋转) .

经过大量谷歌搜索后,处理这种情况的标准方法似乎是将统一矩阵传递给顶点着色器,并让每个四边形处理自己的渲染。但这种方法似乎否定了 VBO 的目的,最终要求 每个对象 进行一次绘制调用。

在我看来,每个对象都应该保留自己的模型视图矩阵,并根据需要使用它来变换、缩放和旋转对象。但是将单独的矩阵应用于 VBO 中的对象让我迷失了方向。我考虑了两种方法:

将模型视图矩阵作为非统一属性发送到顶点着色器,并在着色器中应用。 或者在将顶点数据存储到 VBO 并发送到 GPU 之前对其进行转换

但我发现很难找到有关如何最好地处理此问题的信息这一事实使我相信我混淆了这个问题。处理此问题的最佳方法是什么?

【问题讨论】:

我不认为您缺少一个简单的解决方案。您正在考虑的两种方法都是可行的。在您的用例中,每四边形转换的更改频率如何?您是否通常多次使用相同的转换进行绘制,并且很少修改转换?或者转换是否会改变所有/部分四边形的每一帧? 转换将相当频繁地更新。我考虑过保留一个带有静态顶点数据的 VBO,并将属性(例如以弧度表示的旋转)传递给顶点着色器——然后我可以在其中生成一个变换矩阵。但我有一种感觉,这可能比简单地在 CPU 上做更昂贵。 如果您想确保为您的用例找到性能最佳的解决方案,您可能需要尝试一些方法,并对它们进行基准测试。根据我们掌握的信息,我认为这并不明确。尽管看起来不优雅,但在 CPU 上更新顶点坐标可能比其他方法更好。不幸的是,glMapBufferRange 可以帮助您避免这种方法的副本,它不在 ES 2.0 中。反其道而行之,将更多的计算转移到 GPU 上显然很有吸引力,但您必须确定它是否适合您的使用。 【参考方案1】:

这是关于如何优化许多简单几何图形(四边形实际上是 2 个三角形,6 个顶点,除非我们使用条带)的渲染的“常青”问题(一个很好的问题)。

无论如何,在这种情况下,VBO 与 VAO 的使用并不意味着显着的优势,因为要在内存缓冲区上传输的数据的大小相当低(每个顶点 32 字节,每个三角形 96 字节,每个四边形 192 )这对于当今的内存带宽来说并不是很大的努力(但这取决于您的意思是多少个四边形。如果每帧有 20.000 个四边形,那么无论如何这都是个问题)。

一种可能的方法是批量绘制四边形,方法是在每一帧构建一个新的 VAO,并将不同的四边形放置在您自己的坐标系中。类似于将四边形顶点移动到“虚拟”网格原点中的正确位置。然后,您只需在 VAO 中对新创建的网格执行一次绘制。

通过这种方式,您可以在更少的调用中批量绘制多个对象。

问题是,如果您的四边形需要“缩放”和“旋转”而不仅仅是平移,您可以使用 CPU 计算实际顶点位置,但在计算能力方面会很昂贵。

在传输网格的方式之上的一个简单建议是为四边形的所有纹理使用纹理图集,这样您将需要一个低得多(如果根本不需要)的纹理绑定操作,这可能渲染操作代价高昂。

【讨论】:

以上是关于iOS OpenGL ES 2.0 VBO 混淆的主要内容,如果未能解决你的问题,请参考以下文章

安卓 OpenGL ES 2.0 VBO

OpenGL ES 2.0 VBO 问题

OpenGL ES 2.0 vbo 白屏

共享内存架构中的 OpenGL (ES 2.0) VBO 性能

OpenGL ES 2.0:似乎无法渲染第二个 VBO?

切换到使用交错 VBO - 编译但没有绘制 - opengl es 2.0