之前是给Skin Mesh Render做Decal,这次是针对静态的地形,不能再使用动态生成网格的方式,因为地形有可能非常大,面数非常多,动态生成网格需要逐顶点扫描,效率非常低,而且Decal有可能发生在多个地形物体之间,生成网格就需要先把这多个物体的网格合并,又多了一个网格操作环节十分划不来。
有幸看到了 ColinLeung大神公开的Screen Space Decal Shader,在URP的前向渲染(Forward Rendering)里面虽没有GBuffer,却能利用深度图重建坐标系的方式在屏幕空间做Decal。
深度图重建坐标
虽然 Screen Space Decal Shader代码给出的注释已经非常详细,但从原理上理解的话我找到了几乎完美匹配代码的解释–《通过深度图重建坐标》(出自chengkehan/Jim’s GameDev Blog),其中重要的区别是Decal Shader重建的坐标系是基于Object Space而不是World Space
用Stencil做动态遮罩
因为是在屏幕空间用一个Cube筛取顶点做Decal,对于一些动态物体若不小心进入到Cube范围,就很有可能出现一些遮罩异常的现象,此时可以用Stencil Test来剔除掉不想被Decal的物体
unity的SRP自带的Render Objects RendererFeature,能很方便地用来覆写目标对象的Stencil值
其他参考
从Screen Space Shader代码中可以看出作者还顺便解决了边界拉伸的问题(Side Stretching),可以说是源自《Screen Space Decals in Warhammer 40,000: Space Marine》
深度图重建坐标还能用来做post processing,比如网格扫描地表的效果,keijiro大神给出过这样的案例–DepthInverseProjection