用 Unity URP ShaderGraph 平替 SurfaceShader
最近我在用 Unity URP 做体素系统渲染,我想写一个shader,提供gbuffer几何数据,而不接管后续的高级效果渲染。对于这种需求,Unity之前Built-in RP的SurfaceShader则可以完美解决 - 他只需要你提供片段的几何数据。然而,URP相比于Built-in RP有着很多难以忽视的优处,[根据权威来源描述 待补充 尚不清楚] 包括更先进的架构设计 性能,和可自定义管线的灵活性。
然而,URP只支持
自己写整个管线的着色器(如果要做BPR 光照阴影等 自己做很繁琐又不如unity做的靠谱)
或用 ShaderGraph (只需提供gbuffer数据 接下来交由URP BPR管线,但是对于这种复杂的shader,用节点简直是噩梦 会堆成一堆乱麻 难以看懂和编辑)
所以这就很迷惑。不过幸运的是,ShaderGraph里有一个 Custom Function 节点,允许你指向一个 HLSL 文件 里面可以自由编写函数和hlsl代码,节点给你的主函数一系列输入和输出。

自此,功能上基本可以替代 SurfaceShader,同时 增加了更多简洁性(只需要一个hlsl文件 一个“入口”函数,而不需要考虑shaderlab等繁琐事务)。和灵活性 (与节点搭配)
附:Eldaria Unity 的体素表面截图,每个区块支持100+种材质。图:根据表面高度的材质混合。ShaderGraph + HLSL 的 URP BPR渲染。

不过,可能会有这个疑问:你为何不用ShaderGraph做这套shader?因为这个shader相对较为复杂,如果用节点 将可能是一个噩梦 巨多节点堆成乱麻 难以阅读和修改。
我更习惯用glsl、hlsl代码,在复杂的同时 那些表达式和处理过程 又可以简洁直观的呈现。而且很通用,可以到处移植。如果是节点 几个表达式就要一堆节点 想改一下又要点来点去。而且移植性可能不太可靠 特别是对于这种核心shader。