查了一段时间,结论:Unity在延时渲染会占用Stencil Buffer的大部分掩码用于光照遮罩,可用部分较少,推荐不用。
有大佬使用成功了,方法是和Unity占用的部分岔开,根据各个版本的延时渲染使用解决方式不同
原文:
Unity 已经使用模板缓冲区来支持光照层遮罩。过去几年中,他们在延迟渲染期间禁用了越来越多的用户自定义模板设置,以至于目前在延迟渲染相关着色器上定义的任何模板设置都会被忽略。
内部延迟着色器可能只使用第一遍,因为他们从未考虑过有人想要多遍。
基本上,你在这里运气不佳,你无法用模板和多次传递来完成你想要做的事情。
执行此操作的方法是渲染到其中一个未使用的 gbuffer 通道来存储要使用的照明技术索引,并在内部延迟着色着色器中使用 if 条件。从技术上讲,只有普通 gbuffer 的 alpha 是免费的,它是一个 2 位通道,因此您可以存储 0.0、0.33、0.67 和 1.0。如果您需要超过 4 个值,您可以根据自己的喜好修改 gbuffer 的内容,要么全部修改(假设您替换了游戏中的所有标准着色器),要么在设置该 alpha 通道时修改。另一种替代方法是渲染到自发光 gbuffer 的 alpha,并在延迟着色完成之前使用命令缓冲区将该通道复制到新纹理。它是延迟着色要渲染到的渲染纹理,因此如果您不复制它,就无法从中读取。
参考资料:
https://github.com/daniel-ilett/shaders-impossible-geom
https://discussions.unity.com/t/solved-kinda-the-5th-bit-stencil-buffer-deferred/771205/3
https://discussions.unity.com/t/stencil-and-deferred-rendering/771332/4