【问题标题】:What is the best way of drawing massive of different objects with the same texture using JOGL使用 JOGL 绘制具有相同纹理的大量不同对象的最佳方法是什么
【发布时间】:2015-03-05 21:53:07
【问题描述】:

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

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

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

【问题讨论】:

    标签: opengl glsl jogl


    【解决方案1】:

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

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

    【讨论】:

    • 我同意你的评论。我建议您注意 VBO 中的元素数量。过去,我使用 GL_MAX_ELEMENTS_VERTICES 作为提示,但它不在 OpenGL ES 2(JOGL 支持)中,并且它的值在很多硬件上可能并不准确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    相关资源
    最近更新 更多