交换效果的实际成本


16

我在项目中使用XNA,在那些论坛上有时会看到这样的事实,即将效果交换为网格的成本相对较高,这让我感到惊讶,因为我认为交换效果只是复制替换着色器程序的一种情况以及适当的参数

我想知道是否有人可以确切解释此过程的成本?并在可能的情况下“相对”放置上下文?

例如,说我想使用一个短着色器来帮助拾取,我会:

  1. 更改每个对象上的效果,计算出唯一的颜色以识别它,并将其提供给着色器。
  2. 将所有对象绘制到内存中的渲染目标。
  3. 从目标获取颜色,并使用它来查找所选对象。

完成该过程所需的总时间中有哪些部分将用于交换着色器?我的直觉是,无论着色器多么简单,再次渲染场景都将比过程的任何其他部分慢一个数量级,那么为什么还要关注效果?

Answers:


21

您描述的问题不是“特殊”问题。改变GPU上的效果并没有特别慢。更改效果,效果参数(包括转换),纹理,各种渲染状态以及仅发送多个绘制命令所带来的问题是,必须将另一批发送到GPU

批次受CPU限制每帧只能使用数千*

这取决于CPU以及您正在执行的其他工作,但是假设您每帧获得约1000个批处理。如果每批渲染一个对象,则在遇到问题之前可以在屏幕上绘制约1000个对象。

如果突然添加拾取,并且必须将所有对象渲染两次,则只能绘制500个对象。

(因此,如果您只有少量对象,那么不必担心!)

为了减少所使用的批次数量,您基本上必须“聪明”一点。做到这一点的典型方法是将多个对象巧妙地组合为一个批处理。特别是,查找“ 实例化 ”。也许您可以使用实例号为着色器中的每个对象分配唯一的颜色。

另一种技术(特别适合于拾取)是在软件中剔除渲染的对象,以使您不渲染任何未触摸所拾取像素的东西。

这是NVidia的整个演示幻灯片,标题为“批,批,批:这实际上是什么意思?”。(PDF),其中包含漂亮的图形和可解释此内容的内容。它还列出了一些减少批处理数量的技术。


同意!感谢您的解释和建议,我现在阅读的内容更加有意义。也感谢NVidia的演示文稿,即时通讯现在就读了,非常有帮助。
sebf 2011年

1
更新了指向“批次,批次,批次”文件的链接:ce.u-sys.org/Veranstaltungen/…–
Marton

1
谢谢马顿,我已经将新链接编辑到了帖子中:)
安德鲁·罗素
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.