UnityShader 基于物理的体积光(丁达尔光线)

UnityShader 基于物理的体积光(丁达尔光线)本文探讨了如何通过光照深度贴图实现体积光 但传统方法的精细度不足

大家好,欢迎来到IT知识分享网。

体积光在现实世界中也叫丁达尔光
1
体积光在网上也有很多个版本,但是大多数是 以 光照贴图作为 参考最想进行比较。 这样的尽管可以很轻松方便的实现出 体积光,但是他的硬伤确实 精细度太低了,完全无法复原出 体积光该有的 朦胧的感觉。(如下)https://blog.csdn.net/weixin_32938207/article/details/113035729

实现效果如下

黄昏

清晨

光线模拟

丁达尔光线物理原理

丁达尔光是什么
在这里插入图片描述

丁达尔效应的发现

自定义太阳
我们获取深度图的第一个方式 就是通过摄像机获取他的深度贴图,这是我们要注意性能的效果,但是获取深度贴图是一个比较耗时的操作,我们不能直接通过depthTextureMode获取深度图,毕竟代价很大,所以我们需要自己申请两个rendertexture,用来存储从GPU传过来的深度贴图和颜色贴图

 void Start() { 
    colorRT = new RenderTexture(Screen.width, Screen.height, 24, RenderTextureFormat.Default); depthRT = new RenderTexture(Screen.width, Screen.height, 0, RenderTextureFormat.Depth); } private void OnPreRender() { 
    cam.SetTargetBuffers(colorRT.colorBuffer, depthRT.depthBuffer); } 

自定义太阳视椎体平面提取

若通过解析方法计算射线与探照灯的投影锥体表面交点,需要首先得到该锥形体的平面方程。Gribb 等人提出了通过投影矩阵快速得到投影平锥体6个平面方程的方法[5],这里简单介绍一下其思路。

那么 p 在裁剪空间下的坐标为

p 在 NDC 空间下的坐标可以通过下式计算

不妨以左裁剪平面为例,其平面方程在 NDC 空间下为 x_{NDC} = -1 ,即

即是一个平面的标准方程 Ax + By + Cz + D = 0 的向量形式 (A, B, D, D) dot (x, y, z, 1) = 0 ,而平面的法向量即是 n=(A, B, C) ,也可以直接从该式得到,但该式并没有考虑法向量的正负方向。

采样频率

但是很不幸的消息是,做过对应的早点随机采样之后,梯度的效果会消失,但是随之而来的确实黑白不同的颗粒感,如上图所以。

总结

性能方面的消耗还是有的 ,毕竟需要向真实世界的渲染效果方向努力,所以作为给硬件擦屁股的优化指标,也要把我折磨的快疯掉了(不断的在性能优化 和 渲染效果取最优解)。 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/135484.html

(0)
上一篇 2025-07-04 16:10
下一篇 2025-07-04 16:20

相关推荐

发表回复

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

关注微信