opengl - 具有不同转换的批量绘图对象的最佳实践是什么?

标签 opengl graphics 3d opengl-es-2.0

我正在构思一种在 OpenGL 中通过一次绘制调用渲染尽可能多的不连贯几何体的好方法,而当每一 block 都具有不同的平移和旋转时,我所面对的墙是最好的方法,因为您没有在单个对象绘制之间更新模型 View 制服的奢侈。我在这里和其他地方读过其他一些问题,似乎人们所指出的方向是多种多样的。最好列出执行此操作的主要方法并尝试隔离最常见或推荐的方法。以下是我考虑过的想法:

[编辑:删除了对实例化的提及,因为它在这里并不真正适用]

  • 在着色器中创建矩阵变换。在这里,我将发送一个平移向量或者一个旋转角度或四元数作为属性的一部分。优点是它可以跨平台工作,包括移动设备。但是为对象中的每个顶点发送完全相同的转换数据作为属性似乎有点浪费。如果没有实例化,我将不得不在 VBO 中多次重复这些相同的向量或标量,作为交错数组的一部分,对吧?另一个缺点是我依靠着色器来做数学运算。我不知道这是否明智。
  • 与 1) 类似,但不是依靠着色器进行矩阵计算,而是在客户端进行这些计算,但仍将最终模型 View 矩阵作为 VBO 中的 16 个浮点流发送。但据我所知,如果没有实例化,我必须为 VBO 中的每个顶点重复这个相同的流,对吗?只是看起来很浪费。与上面 2) 的权衡是,我在每个顶点的 VBO 中发送了更多数据(16 个浮点数而不是 3 个浮点数向量用于平移,可能是 4 个浮点数四元数),但需要着色器做更少的工作。
  • 跳过所有上述限制,而是通过为每个对象单独绘制调用来妥协。这是我正在阅读的书中通常“教授”的内容,毫无疑问是为了简单起见。

  • 除了这些还有其他常用的方法吗?

    作为一个学术问题,我很好奇以上所有内容是否可行且“可以接受”,或者其中一个是否明显胜过其他?如果我要专门使用桌面 GL,实例化是实现这一目标的主要方式吗?

    最佳答案

    两个考虑:

    Generally speaking, if you have multiple objects, with each object using independent transforms, you use multiple draw calls. That's what they're there for. The old NVIDIA "Batch Batch Batch" presentation cited between 10,000 and 40,000 draw calls per-frame (in D3D. More in GL) for a 1GHz GPU. Nowadays, you're looking at rather more than that. So unless you're dealing with tens of thousands of individual objects, all of them being different (so no instancing), odds are good that you'll be fine.



    另一个想法:

    Take the modelview matrix calculations out of the shader entirely and just pass the vertices after multiplication. This allows a single draw call for many objects in different orientations and translations. The cost just comes at all the CPU calculations, but I suppose if that bottleneck is not as big as the bottleneck of multiple draw calls, it would be worth it.



    (取自here。)

    关于opengl - 具有不同转换的批量绘图对象的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16128808/

    相关文章:

    c++ - 绕过基类构造函数初始化,一个坏习惯?

    Java Graphics2D透明渲染

    android - Android Xfermode的解释

    matlab - 随着时间的推移绘制 3d 位置数据

    c++ - GLSL 中光线行进曲面的实现

    ruby - Gem 在 Mac OSX Lion 上安装 ruby​​-opengl

    c - 在 C 或 GLSL 中乘以矩阵?

    graphics - 更改 Google map 信息窗口关闭图标

    xcode - 我用 OpenGL 单击了哪里?

    c++ - OpenGL:Glut.h 访问冲突