0

在 Unity 中,当我们编写具有多个通道的自定义着色器时,它们是否会执行:

For each triangle do:
    For each pass do:
        Draw the pass

或者:

For each Pass do:
    For each triangle do:
        Draw the pass

如果网格中有多种材质,绘制的面是否按材质分组?

4

1 回答 1

0

问题 1

第二种变体:在 Unity 中,当我们编写具有多个通道的自定义着色器时,它们是否会执行:

For each Pass do:
    For each triangle do:
        Draw the pass

问题2

如果网格中有多种材质,绘制的面是否按材质分组?

是的。

解释

基本上,所有渲染(在 OpenGL 和 Direct3D 中)都是通过以下方式完成的:

  1. 设置渲染参数(着色器、矩阵、缓冲区、纹理等);
  2. 绘制一组图元(这称为绘制调用);
  3. 对所有需要渲染的图形重复这些步骤。

并且以下启发式规则是适用的:场景中调用的绘制调用越少越好(对于性能)。因此,为了满足此规则(不减少绘制的图元数量),您希望在每个绘制调用中拥有更多数量的图元。这反过来又使 Unity 与您的第一个问题的第二个变体一起使用变得显而易见。并且还解释了为什么 Unity 按材质对面进行分组(因为它最大限度地减少了绘制调用次数)。

于 2014-06-08T02:01:53.657 回答