rainyeve
  • 首页
  • 编程
  • 涂鸦
  • 其他
  • 关于
2020年8月5日
编程

【Unity Shader】基于屏幕空间贴花(Screen Space Decal)的地形裂痕效果

【Unity Shader】基于屏幕空间贴花(Screen Space Decal)的地形裂痕效果
2020年8月5日
编程

之前是给Skin Mesh Render做Decal,这次是针对静态的地形,不能再使用动态生成网格的方式,因为地形有可能非常大,面数非常多,动态生成网格需要逐顶点扫描,效率非常低,而且Decal有可能发生在多个地形物体之间,生成网格就需要先把这多个物体的网格合并,又多了一个网格操作环节十分划不来。

有幸看到了 ColinLeung大神公开的Screen Space Decal Shader,在URP的前向渲染(Forward Rendering)里面虽没有GBuffer,却能利用深度图重建坐标系的方式在屏幕空间做Decal。

ScreenSpaceDecal用作劈中地板的裂痕效果

深度图重建坐标

虽然 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值

对目标layer覆写一个特定的StencilValue

其他参考

从Screen Space Shader代码中可以看出作者还顺便解决了边界拉伸的问题(Side Stretching),可以说是源自《Screen Space Decals in Warhammer 40,000: Space Marine》

边界拉伸问题

深度图重建坐标还能用来做post processing,比如网格扫描地表的效果,keijiro大神给出过这样的案例–DepthInverseProjection

Post Views: 8,817

shader SRP unity

上一篇【Multiple Camera】在UI菜单显示场景中的3D角色下一篇 【自定义Post Processing Volume】径向模糊(Radial Blur)

发表评论 取消回复

邮箱地址不会被公开。 必填项已用*标注

分类目录

  • 其他 (2)
  • 旅行 (1)
  • 涂鸦 (6)
  • 编程 (28)
Email: wuch441692@163.com