大气渲染学习笔记
大气散射学习笔记
学习教程基于https://zhuanlan.zhihu.com/p/548799663
类型:
外散射:因散射导致看不到的光线
内散射:观察到本不能观察到的光线
过程:
从真空到P点:
从P点到相机:
散射函数
瑞利散射:
实际上在P到A点进行了无数个衰减,那么A点的光照实际上应该是每一个点的求和
瑞利散射的定义
定义
指数衰减:
设衰减系数为β
瑞利散射是在三维空间进行的
瑞利相位函数推导:
加入密度的影响
这个衰减并不完全是指数的,也会受到大气密度的影响
简化一下写法
替换前文的简陋说法:
从C到P的透射率替换:
瑞利散射中衰减因子的替换
用于求和的量称为光学深度D(cp),这是shader里面要实际计算的东西,其余的都是乘法系数,只需计算一次
米氏散射
不会推导(
计算
散射方程
瑞利散射
瑞利散射系数定义:
瑞利散射相位函数:
米氏散射
米氏散射定义
(更便宜的做法)
米氏散射相位函数
密度函数
渲染解方程
衰减函数
考虑了臭氧层对光的衰减过程(臭氧层不会散射光,只会衰减光)
在计算时只考虑臭氧层对光线的衰减
单散射
考虑了散射和衰减的单散射公式
多重散射
嵌套多维积分可以获得高阶散射方程,但是太慢了
可以使用下面的函数来帮助实现多重散射
该函数定义了一个到达某一点p的散射k阶的光量和在方向v上的散射
k阶的聚焦函数表示聚焦在p点的光,该店的光恰好经历了k个散射事件
使用k阶函数让我们对上面的单散射函数的最终公式变形得到多重 散射最终公式:
总光强就是把瑞利散射和米氏散射的结果相加,再计算k阶散射后到达观察者的所有光
需要做的就是把单次散射和更高阶散射的结果相加
纹理存储
通过以下简化
- 地球可以被看成一个完美的球形
- 空气中的颗粒物密度只随高度变化和地理位置无关
- 由于地球与太阳之间的距离很远,所有到达大气层的光都可以视为平行光
将纹理从观察者位置(XYZ)、视图方向(XYZ)、光源方向(XYZ)组成的九个维度的查找表简化到四个自由度:高度、日天顶角、视天顶角和日视方位角
其中日视方位角影响地球对大气的阴影,这种现象由于多次散射几乎看不见了,并且还会被地形遮挡,因此去除日视方位角。于是需要对瑞利散射相位函数进行调整,不然会在太阳的米氏散射上有块状阴影,解决方法是将相位函数的评估推迟到fragment shader上
纹理化
为了能在3d纹理中回去到值,需要将三个参数转化到[0,1]的范围中
转化函数最直接的实现是使用线性参数化,但是可以通过线性参数化方程的改变来进一步提高精度
高度重映射
大气密度随海拔高度呈现指数下降,因此在低海拔地区应该有更多地参数化集中
视天顶角重映射
在低海拔地区应更集中
日天顶角重映射
虽然太阳方向在白天不会发生剧烈的变化,但是我们不需要包含低于某个阈值的太阳角度,因为夜间几乎不存在来自太阳的非散射光
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!