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

Opengl 使用JOGL绘制具有相同纹理的大量不同对象的最佳方法是什么,opengl,glsl,jogl,Opengl,Glsl,Jogl,以下是关于编码风格的问题。(目前使用JOGL+gl3) 如果我想使用JOGL绘制包含相同纹理的大量不同对象,并减少资源使用,那么最好将对象及其纹理分离(这意味着创建另一个名为纹理的类),还是使这些对象中的纹理保持静态 另一个问题是,如果我想绘制许多具有不同形状的分支(比如说一百个),我是否应该编写一个名为Branch的类,然后创建一百个分支实例,并在每个实例中调用方法drawIlly()?或者创建一个包含100个VAO的实例,每个实例都包含一个分支的顶点信息,并调用一次方法drawmimf()?

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

如果我想使用JOGL绘制包含相同纹理的大量不同对象,并减少资源使用,那么最好将对象及其纹理分离(这意味着创建另一个名为纹理的类),还是使这些对象中的纹理保持静态


另一个问题是,如果我想绘制许多具有不同形状的分支(比如说一百个),我是否应该编写一个名为Branch的类,然后创建一百个分支实例,并在每个实例中调用方法drawIlly()?或者创建一个包含100个VAO的实例,每个实例都包含一个分支的顶点信息,并调用一次方法drawmimf()?哪一个更好,或者还有其他选择吗?

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


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

我同意您的意见。我建议您注意VBO中元素的数量。在过去,我使用GL_MAX_ELEMENTS_VERTICES作为提示,但它不在OpenGL ES 2中(由JOGL支持),它的值在很多硬件上可能不准确。