Unity 地形引擎如何添加任意数量的着色器通道?

How does the Unity terrain engine add an arbitrary amount of shader passes?

现在我正在从事一个涉及将 splatmaps 应用于生成的网格的项目。我正在尝试使用内置的地形着色器来实现这一点,但我 运行 遇到了一个涉及 "FirstPass" 和 "AddPass" 着色器的问题。

很清楚这些着色器应该如何工作。应用 FirstPass 并处理 4 个纹理和一个控制(splat)纹理。如果用户应用超过 4 个纹理,AddPass(与 FirstPass 非常相似)在编译时作为另一个着色器通道 "added"。 AddPass 添加任意次数,具体取决于用户应用到地形的纹理数量(每次通过 4 个纹理。)

地形引擎是如何实现这种多通道效果的?所需的遍数可以在编译时确定,所以我不认为这是不可能的......我只是不知道从这里去哪里。我觉得可能跟FirstPass底部的Dependency属性有关系,但我不确定。

Dependency "AddPassShader" = "Hidden/TerrainEngine/Splatmap/Standard-AddPass"
Dependency "BaseMapShader" = "Hidden/TerrainEngine/Splatmap/Standard-Base"

如果有人对此有任何见解,请告诉我。为方便起见,我已将 FirstPass, AddPass, and TerrainEngine.cginc 个着色器文件从 Unity 存档上传到 pastebin。

谢谢!

对于那些好奇的人,其实我自己找到了答案。 在内部看起来地形引擎使用隐藏的 MeshRenderer 一次包含多个着色器通道。为了实现这种多通道效果,TerrainEngine 将 FirstPass 着色器添加到实例化的 Material 并将其分配给 MeshRenderer 中的 material 字段。如果需要 > 4 个纹理,则 AddPass 着色器 添加到 Material 并附加到 materials 字段。

请注意,MeshRenderer 会警告您在单个网格上使用多个着色器通道。可以忽略此警告,因为如果需要超过 4 个纹理,splatmapping 需要多个着色器通道。