图形学(8)Path Tracing Algorithm
蒙特卡罗算法#
注意到对于一个连续随机变量 ,则 的期望 。
若要求积分 ,令随机变量 ,则 即为所求,即有
Path Tracing#
用蒙特卡洛解渲染方程即可,但有以下几点问题亟待解决:
- 每次计算积分要进行多少次采样
- 在封闭环境对渲染方程求解会导致无限递归
对于问题一,由于每次采样 次,反射 次后有 条射线,复杂度指数级增长,故在 Path Tracing 算法中每次只追踪一条射线,。
对于问题二,可以采取俄罗斯轮盘赌的方法,每次追踪有 的概率继续追踪, 的概率结束追踪,若后续追踪得出的正确答案为 ,则进行俄罗斯轮盘赌后实际计算得到的结果期望是 ,故要除掉一个 保证算法结果的期望是正确的。
令函数 shade(p,wo)
表示计算点 p
在 wo
方向的亮度(颜色),有伪代码:
shade(p,wo)
L_emit = self emit
L_indir = 0.0
Test Russian Roullete with probability P_RR
Sample the hemisphere with PDF pdf_hemi and generate a ray r
Trace the ray r
if ray r hit a object at q
L_indir = shade(q,-r) * brdf * cosine / pdf_hemi / P_RR
return L_emit + L_indir
直接光采样#
蒙特卡洛的期望是正确的,但是不同的概率密度函数可以使蒙特卡罗更快的收敛,是我们在相同时间内得到质量更好的图像。事实上概率密度函数和被积函数越相似,收敛越快。
注意到由光源直接到 shading 处的贡献是很大的,我们把这一部分从渲染方程里面拆出来:
如果光源很小,那么在 上进行蒙特卡罗是很浪费的:很多采样射线不经过光源,导致收敛很缓慢。注意到蒙特卡罗的概率密度函数是任取的,我们直接在光源上采样:
所以有
用蒙特卡洛积分即可。举个例子,对于亮度恒定为 ,面积为 的面光源照射到 的理想漫反射物体上,进行一次均匀的蒙特卡罗采样得到的积分结果为
shade(p,wo)
L_indir = 0.0
L_dir = 0.0
For all light
Sample the Light with PDF pdf_light
L_dir += L_i * f_r * cos theta * cos theta' / d ^ 2 / pdf_light
Test Russian Roullete with probability P_RR
Sample the hemisphere with PDF pdf_hemi and generate a ray r
Trace the ray r
if ray r hit a object at q
L_indir = shade(q,-r) * brdf * cosine / pdf_hemi / P_RR
return L_emit + L_indir
标签:
Computer Graphic
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具