Unity体积光

本文探讨了在Unity的High Definition Render Pipeline (HDRP)中实现体积光的挑战,包括CustomPass不支持Lit导致的ShadowMap采样问题,以及HDRP体积光的大致流程。作者分享了一个基于内置管线的体积光项目,并讨论了可能的解决方案,如放弃降采样或直接在场景中处理。文章指出,HDRP虽然效果优秀,但在体积光计算方面仍有待完善。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

foglight

写在前面

  • 因为我们的毕设决定用HDRP,所以在内置管线做的体积光已经没太大用了
  • 参考Michal巨巨的项目,当初征求大佬许可,大佬很慷慨
    在这里插入图片描述
  • 尝试移植到HDRP,因为CustomPass目前不支持light,导致没有办法采样shadowmap计算衰减,目前打算用自带的顶着,或者放弃降采样功能,直接在场景里做,但我觉得没有必要了。
  • HDRP中LightEvent已经不会触发了,目前只能指望下面这几个节点了
    Points
  • 感觉HDRP还称不上完整

项目分享

内置管线版:
https://github.com/Claymoreno1/volumelight


大体流程

如果抛开光源种类直接但差异,比如我们half resource,Michal大佬的流程是:
深度图降采样(OnPreRender) → DrawMesh(OnLightEvent) → 升采样+与CameraTarget混合(OnRenderImage)
在HDRP中事情变得麻烦:
深度图降采样(After Depth and Normal) → DrawMesh(?) → 升采样+与CameraTarget混合(After Post Process)。
乍一看感觉没啥,实际上你得把这一件事情分成几个CustomPass或者CustomPass+PostEffect。这些也没什么,但是CustomPass 【暂时(用的HDRP 7.17)】不支持Lit,也就是说没有办法直接对ShadowMap采样,这对于FogLight来说是致命的,下图是我按照这个流程在HDRP中做的
在这里插入图片描述
我没有办法做出物体遮挡住光线的效果。我甚至想自己做光源摄像机每帧取景,但这未免也太贵了,重复工作。另一个想法是放弃降采样功能,直接在场景里做,目前为止是可行的。


基于HDRP的具体流程

scaleFactor 0.5 点光源 为例

  1. 创建RT和CB
    对Unity提出表扬,RTHandles确实省了一些事,你不在需要在Update()中检查刷新RT的大小,希望早日去掉实验标志;
  2. 在After Depth and Normal Point 注入Custom Pass
    在这里输出一张降低分辨率的深度图,巨巨进行了一些处理,大体就是对当前前像素点周边采样,当“采样点对齐这个像素”的时候采用周边采样点的最小深度,其他用最大深度。双边模糊类的方法。
  3. 找一个合适的节点DrawMesh
    反正在哪你也拿不到ShadowMap,我是在上一步完成之后直接画的。
    这里不要用Shader/HDRP/CustomPass,那两个函数完全不够用,多Pass也不方便。
    建议现在连连看里把输入的图和需要的坐标连出来,Show Generated Code。
    这部分具体实现在下一部分。
  4. 升采样+叠加到屏幕上
    升采样同样也是类双边模糊的方法。
    叠加有两种做法
    第一种:DrawMesh绘制一个三角形,覆盖屏幕,只写Color不写深度
    第二种:分出去到Before Po
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值