unity-shader-后处理-景深

unity-shader-后处理-景深


相关资料


前置条件

  1. 相机开启深度渲染, GetComponent<Camera>().depthTextureMode |= DepthTextureMode.Depth;
  2. 需要写入深度缓冲的必须是 不透明 物体. 也就是 shader tags 为 Tags { "RenderType"="Opaque" }
  3. 保证场景中希望写入深度图的gameobj,它们上色的shader必须有 FallBack "Diffuse"代码块,否则深度图不会将他的深度数据写入

参考

  • 项目内的 DepthOfFiled.cs

流程

  1. 显示用高斯模糊 横向,竖向 各模糊一次. 模糊到一个 rt 上
  2. 把模糊后的 rt 丢到 shader 中, 在 frag 中 根据 深度图 中的深度值, (0 ~1 空间) 给原图, 和 模糊图 做个混合.

踩坑

  • 为什么有些物体在写入不了深度中? 即使物体的shader中指定 "RenderType"="Opaque"

    目前知道的是 使用 unity 中的 standard shader 就可以写入到深度缓冲区中.

    加入 fallback 就可以写入到深度了. FallBack "Diffuse"

    原因是: 简单来说内置深度数据来自shadow map计算时使用的一个特殊pass,我们必须设置这个pass才能让内置depth buffer完成数据填充,**FallBack “Diffuse”在这个时候就起到了作用,貌似自己写的其他pass时不会在获取内置深度时调用。大坑一个,所以自己写的shader结构应该保留FallBack “Diffuse”**: