如何在OpenGL ES 1.1中优化大型模型的渲染?

7

我刚刚在我的3D应用程序中实现了VBO,并且看到了大约5-10倍的渲染速度提升。以前每秒只能渲染1-2帧,现在可以渲染10-11帧。

我的问题是,是否有任何进一步的改进可以提高渲染速度?三角形条带会产生很大的差异吗?目前面之间没有共享顶点,每个面的顶点都是唯一的但重叠的。

我的设备利用率为100%,Tiler利用率为100%,Renderer利用率为11%,资源字节数为114819072。这是在CAD模型上渲染912,120个面。

有什么建议吗?

1个回答

10

瓦工利用率达到100%表示您的瓶颈在于发送到GPU的几何图形的大小。 尽可能缩小几何图形的大小可以使渲染时间几乎线性减少,这是我的经验。 过去,这些调整步骤对我有效:

  • 如果尚未使用索引,请尝试使用索引,这可能通过消除一些冗余顶点来减少几何图形。 iOS设备中的PowerVR GPU优化了使用索引的几何图形。

  • 尝试为顶点信息使用较小的数据类型。 我发现,即使使用GLshort而不是GLfloat来表示我的顶点和法线,也不会失去太多渲染精度。 这将显着压缩几何图形并导致渲染速度的大幅提高。

  • 将颜色相似的顶点分组,并以设置的颜色渲染它们,而不是提供每个顶点的颜色信息。 虽然需要额外的绘制调用,但由于不必发送所有颜色信息,因此产生的开销将远远超过速度提升。 通过对较大模型中的颜色进行分组,我看到了约18%的渲染时间缩短。

  • 您已经使用了VBO,因此已经利用了该优化。

  • 不要在任何时候停止渲染管道。 剪切读取当前状态的任何内容,例如所有glGet *调用,因为它们会影响PowerVR GPU的流程。

有其他一些事情可以做,这将带来更小的性能提升,例如在VBO中使用交错的顶点、法线和纹理数据,将数据对齐到4字节边界等,但以上这些是我发现对调整自己的OpenGL ES 1.1应用程序具有最大影响的。

这些大部分要点在苹果的iOS OpenGL ES编程指南的"处理顶点数据的最佳实践"章节中得到了很好的涵盖。


索引几何(第一条)如何与交错顶点数组配合使用?苹果公司表示,交错数组是最有效的,但我无法弄清楚它如何与索引配合工作。目前我正在使用glDrawArrays()。您能否发布一个快速的代码示例,说明如何使用VBO和glDrawElements进行渲染?谢谢。 - Davido
@Davido - 将每个顶点的信息作为分组放入VBO中(顶点,法线,纹理坐标,顶点,法线,纹理坐标...)。每个索引都指向一个顶点,因此在绘制时,将拉取相应的顶点、法线和纹理坐标。获取Molecules的代码,您可以看到交错索引绘图的示例:http://sunsetlakesoftware.com/molecules。不幸的是,我还没有在那里发布也进行颜色分级的应用程序版本,但我很快就会发布。 - Brad Larson
啊啊啊,我寻找了很久后终于记起来为什么我一开始使用 glDrawArrays 而非 glDrawElements 了。glDrawElements 不支持 GL_UNSIGNED_INT,这就有效地限制了单个索引数组的渲染顶点数量不得超过 65536。问题是,我的模型有一百万个面,索引数组中大约有 760,000 个索引。如果使用 glDrawElements,则每个数组最多只能包含 65536 个索引,这将极大地增加代码的复杂性。有没有什么好的解决方法,或者我只能使用 glDrawArrays? - Davido
好建议。我看到很多参考资料都建议使用GLshort而不是GLfloat并对值进行缩放,我知道Molecules使用GLshort来渲染,但您能否概述一下将浮点数转换为短整型以进行渲染的过程?对于新概念来说,了解整个过程总是有帮助的。 - Davido
好的,我进行了一些实验,4字节边界对性能确实有巨大影响。但是,即使在4字节边界上渲染,使用短整型仅有的优势是我的模型大小显著较小。浮点数仍然以10-11帧每秒的速度呈现,而短整型则以9-10帧每秒的速度呈现。您有任何想法吗?在使用短整型时,每个呈现帧都需要额外的glPushMatrix(),glPopMatrix(),glTranslatef()和glScalef()调用。 - Davido
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接