c++ - 为什么实例化数组比 glDrawElement 慢?

标签 c++ opengl glsl

在我的程序中我想画很多球体。 1st 我为球体创建顶点和索引,然后将它们绑定(bind)到 voa/vbo/ibo。 之后我创建了 1000 个随机模型矩阵。 现在我有两种绘制网格的方法。

  1. 只需循环 1000 次调用 glDrawElements 的 ModelMatrices 列表。其中矩阵 MVP 在 CPU 上计算并像统一一样发送到着色器。
  2. 将所有矩阵绑定(bind)到额外的 VBO 并将它们发送到着色器,就像“in”一样 多变的。然后使用 glDrawElementsInstanced 调用一次。

在测试程序中我绘制了 1000 个球体(大约 2000 万个顶点) 当我使用第一种方法时,我得到大约 27FPS,而第二种方法将性能降低到 19FPS。理论上,第二种方法应该比第一种方法获得更好的性能。

这是代码。

我认为瓶颈是顶点着色器 (VP * ModelMatrix) 中的乘法,因为它需要为每个(网格中的顶点)*1000 完成。

什么可以升级,我做错了什么?

最佳答案

实例化并不总是胜利。您必须分析这种优化,看看它是否值得进行。

一般来说,如果您要渲染大量包含少量顶点(20,000 可能太多了。多看 100 -3000 左右)。此外,您的每个实例数据不必要地大;当您可以轻松地使用 vector 和四元数时,您会使用矩阵。

实例化的目的是减少CPU 开销。特别是 CPU 每次绘制调用开销和状态更改。总共有 2000 万个顶点,1000 次绘制调用和状态更改的 CPU 开销很可能不是您最大的问题。

关于c++ - 为什么实例化数组比 glDrawElement 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12795986/

相关文章:

android - OpenGL、Android 和 Galaxy S3

javascript - 从片段着色器恢复像素数据会导致意外行为

c++ - 我应该将 C++ 应用程序链接到间接使用的共享库吗

c++ - 如何判断 v8 isolate 实例使用了太多内存?

c++ - Microsoft Visual C 运行时中未处理的异常

c++ - 当 z <= 0 时 glm::lookAt 垂直相机翻转

c++ - 模板特化中的额外方法

java - 处理过多的 popMatrix 调用

c++ - 遵循 C++/OpenGL 教程(导入图像)的问题

c++ - 渲染成 3D 纹理