现在我正在做一个涉及将 splatmap 应用于生成的网格的项目。我正在尝试使用内置的地形着色器来实现这一点,但我遇到了一个涉及"FirstPass"和"AddPass"着色器的问题。
很明显这些着色器应该如何工作。应用FirstPass并处理4个纹理和一个控制(splat)纹理。如果用户应用超过 4 个纹理,AddPass(与 FirstPass 非常相似)将在编译时"添加"为另一个着色器通道。AddPass 的添加次数任意,具体取决于用户应用于地形的纹理数量(每次传递 4 个纹理)。
地形引擎是如何实现这种多通道效果的?所需的传递量可以在编译时确定,所以我认为这并非不可能......我只是不知道从这里去哪里。我认为这可能与FirstPass底部的依赖项属性有关,但我不确定。
Dependency "AddPassShader" = "Hidden/TerrainEngine/Splatmap/Standard-AddPass"
Dependency "BaseMapShader" = "Hidden/TerrainEngine/Splatmap/Standard-Base"
如果有人对此有任何见解,请告诉我。为了方便起见,我将 FirstPass、AddPass 和 TerrainEngine.cginc 着色器文件从 Unity 存档上传到 pastebin。
谢谢!
对于那些好奇的人,我自己实际上发现了答案。 在内部,地形引擎似乎使用隐藏的网格渲染器一次包含多个着色器通道。为了实现这种多通道效果,地形引擎将 FirstPass 着色器添加到实例化的材质中,并将其分配给网格渲染器中的材质字段。如果需要> 4 个纹理,则 AddPass 着色器也会添加到材质中,并追加到材质字段中。
请注意,网格渲染器会警告您在单个网格上使用多个着色器通道。可以忽略此警告,因为如果需要 4 个以上的纹理,splatmapping 需要多个着色器通道。