使用 JOGL 绘制具有相同纹理的大量不同对象的最佳方法是什么

What is the best way of drawing massive of different objects with the same texture using JOGL

以下问题是关于编码风格的。 (目前使用 JOGL + gl3)

如果我想用 JOGL 绘制大量包含相同纹理的不同对象,并减少资源使用,最好将对象及其纹理分开(意味着创建另一个 class 命名纹理),或者使这些对象中的纹理静态?

另一个问题是,如果我想画很多不同形状的分支(比如一百个),我是否应该写一个class命名的分支,然后创建一百个分支实例并调用方法drawMyself () 在他们每个人中?或者创建一个包含一百个 VAO 的实例,每个 VAO 包含一个分支的顶点信息并调用方法 drawMyself() 一次?哪个更好或者还有其他选择?

对于第一个问题,您只需要一个纹理数据实例。将其上传到 VRAM 后,可以从应用程序的内存中释放它以保存 space。从 OpenGL 的角度来看,您可以在开始绘制之前简单地绑定一次纹理,然后绘制使用相同纹理的每个对象。这本质上是一种将绘制调用批处理在一起的方法,这是一种提高渲染性能的非常常用的技术。

对于第二个问题,您应该减少方法调用和 VAO。尽管 Hotspot JVM 非常擅长对您的代码进行 JIT,但每个方法调用仍会导致一些开销,更不用说 OpenGL 调用的开销了。最好的情况是,如果你预先知道你的顶点并且它们不会在每帧的基础上改变,那么构建一个具有交错顶点属性的单个静态 VBO,然后调用一次绘制以获得最佳性能。