在我的应用程序中,我通过 OpenGL ES Api 绘制了很多立方体。所有立方体的尺寸相同,只是它们位于不同的空间坐标。我可以想到两种绘制它们的方法,但我不确定哪种方法最有效。我不是OpenGL专家,所以我决定在这里问。
方法1,也就是我现在使用的方法:由于所有立方体的尺寸都相同,所以我只计算了一次顶点缓冲区、索引缓冲区、法线缓冲区和颜色缓冲区。在刷新场景期间,我遍历所有立方体,对同一组缓冲区执行 bufferData(),然后使用 drawElements() 调用绘制立方体的三角形网格。由于每个立方体位于不同的位置,因此我在绘制之前翻译了 mvMatrix。为每个立方体执行 bufferData() 和 drawElements()。在这种方法中,我可能节省了大量内存,因为不是每次都计算缓冲区。但我打了很多 drawElements() 电话。
方法 2 是:将所有立方体视为遍布场景的一组多边形。计算每个多边形(实际上是多边形内的三角形)的顶点、索引、颜色、法线缓冲区,并在一次调用 bufferData() 时将它们推送到显卡内存。然后通过一次调用 drawElements() 来绘制它们。这种方法的优点是,我只调用了一次 bindBuffer 和 drawElements。缺点是,我使用大量内存来创建缓冲区。
我对 OpenGL 的经验非常有限,从性能的角度来看,不知道上述哪种方法更好。
我在 WebGL 应用程序中使用它,但这是一个通用的 OpenGL ES 问题。