首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对于具有不同变换的批处理图形对象,最佳实践是什么?

对于具有不同变换的批处理图形对象,最佳实践是什么?
EN

Stack Overflow用户
提问于 2013-04-21 15:10:57
回答 2查看 6K关注 0票数 18

我正在构思一种很好的方法,在OpenGL中用一次绘图调用来渲染许多不相交的几何体,当每一块都有不同的平移和旋转时,我遇到的墙是最好的方法,因为你没有在单个对象绘制之间更新统一的模型视图的奢侈。我在这里和其他地方读到了一些其他的问题,似乎人们所指的方向是相当不同的。最好列出完成此操作的主要方法,并尝试隔离最常见或推荐的方法。以下是我考虑过的一些想法:

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

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

除了这些之外,还有其他常见的方法吗?

作为一个学术问题,我很好奇上述所有方法是否都是可行的和“可接受的”,或者其中一个显然是胜过其他人的?如果我只使用桌面GL,实例化是实现这一目标的主要方式吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-27 12:10:48

两个考虑因素:

一般来说,如果有多个对象,每个对象都使用独立的变换,则可以使用多个

调用。这就是他们在那里的目的。旧的NVIDIA“批处理批处理”演示文稿引用了每帧10,000到40,000个绘制调用(在D3D中。GL中的更多信息),用于1 1GHz。如今,你看到的远不止这些。所以,除非你在处理成千上万个独立的对象,它们都是不同的(所以没有实例化),否则你很可能会很好。

另一个想法是:

将模型视图矩阵计算完全从着色器中取出,并在相乘后仅传递顶点。这允许对不同方向和平移的多个对象进行单个绘制调用。成本来自所有CPU计算,但我认为如果瓶颈不像多个绘制调用的瓶颈那么大,那么它将是值得的。

(摘自here。)

票数 15
EN

Stack Overflow用户

发布于 2014-05-29 09:53:52

这里有一个替代的想法:

为每个顶点提供一个通过属性传入的对象ID。然后在顶点着色器中,使用此ID在存储变换矩阵的纹理中进行查找。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16128808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档