当前位置: 首页 > news >正文

Games101学习笔记 Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing)

Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing

  • 一、蒙特卡洛积分 Monte Carlo Integration
  • 二、路径追踪 Path tracing
    • 1.Whitted-Style Ray Tracing's Problems
    • 2.只考虑直接光照时
    • 3.考虑全局光照
      • ①考虑物体的反射光
      • ②俄罗斯轮盘赌 RR (得到正确shade函数)
      • ③射线生成(追踪足够多的path)
      • ④对光源进行采样
        • 推导
      • ⑤结束

一、蒙特卡洛积分 Monte Carlo Integration

  • 为什么:用于解决难以求解的积分问题
  • 是什么/怎么办:在x轴上随机采样积分,而不是均匀采样
    在这里插入图片描述
  • 函数 f(x) 在区间 [a,b] 上的定积分 ∫ a b f ( x ) d x \int_{a}^{b}f(x)dx abf(x)dx
  • 随机变量 X i ∼ p ( x ) X_{i} \sim p(x) Xip(x)
  • 得到蒙特卡洛积分为 F N = 1 N ∑ i = 1 N f ( X i ) p ( X i ) F_{N} = \frac{1}{N} \sum_{i=1}^{N} \frac{f(X_{i})}{p(X_{i})} FN=N1i=1Np(Xi)f(Xi)

二、路径追踪 Path tracing

1.Whitted-Style Ray Tracing’s Problems

  • 只处理镜面或者透明物体的反射和折射,在漫反射时就停止了,忽略了物体之间的反射
  • 在glossy金属材质时,不应该全部都反射
  • 但是 渲染方程是对的
    • L r ( p , ω r ) L_{r}(p, ω_{r}) Lr(p,ωr) = L e ( p , ω o ) L_{e}( p, ω_{o}) Le(p,ωo) + ∫ Ω + L r ( p , − ω i ) f r ( p , ω i , ω r ) ( n ⋅ ω i ) d w i \int_{Ω^+}^{} L_{r}( p , -ω_{i}) f_{r}( p , ω_{i} ,ω_{r}) ( n \cdot ω_{i})dw_{i} Ω+Lr(p,ωi)fr(p,ωi,ωr)(nωi)dwi

2.只考虑直接光照时

  • L o ( p , ω o ) L_{o}(p, ω_{o}) Lo(p,ωo) = ∫ Ω + L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) d w i \int_{Ω^+}^{} L_{i}( p , ω_{i}) f_{r}( p , ω_{i} ,ω_{o}) (n\cdotω_{i})dw_{i} Ω+Li(p,ωi)fr(p,ωi,ωo)(nωi)dwi 用蒙特卡罗积分求解 F N = 1 N ∑ i = 1 N f ( X i ) p ( X i ) F_{N} = \frac{1}{N} \sum_{i=1}^{N} \frac{f(X_{i})}{p(X_{i})} FN=N1i=1Np(Xi)f(Xi)
  • f(x) 是 L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) L_{i}(p,ω_{i})f_{r}(p,ω_{i},ω_{o})(n\cdotω_{i}) Li(p,ωi)fr(p,ωi,ωo)(nωi)
  • pdf(概率密度函数)是 “对半球进行采样” p ( ω i ) = 1 2 Π p(ω_{i}) = \frac{1}{2Π} p(ωi)=1
  • 得到式子 L o ( p , ω o ) L_{o}(p, ω_{o}) Lo(p,ωo) = 1 N ∑ i = 1 N L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) p ( ω i ) \frac{1}{N} \sum_{i=1}^{N} \frac{L_{i}(p,ω_{i})f_{r}(p,ω_{i},ω_{o})(n\cdotω_{i})}{p(ω_{i})} N1i=1Np(ωi)Li(p,ωi)fr(p,ωi,ωo)(nωi) 是正确的直接光照公式
    在这里插入图片描述

3.考虑全局光照

①考虑物体的反射光

在这里插入图片描述

  • Q同样也反射光线到P上(方向上也相当于P到Q点的光)
    在这里插入图片描述
  • Q 的直接光照 = Q 到 P 的反射
  • 但是这样做光线会有 指数级增长
    在这里插入图片描述
  • 假设只有一根光线时(只选择一个方向 ω i ω_{i} ωi
    在这里插入图片描述
  • 但递归需要停止,不然计算量无限增加(但又想保证质量)—— 俄罗斯轮盘赌 RR

②俄罗斯轮盘赌 RR (得到正确shade函数)

  • 通过随机概率选择是否继续追踪光线,可以有效地控制光线数量,并避免能量损失过多
  • 实现步骤
    • 设置一个概率 P
    • 以概率 P 发射光线:若随机数< P,则发射并计算光线亮度 Lo
    • 以概率 1-P 不发射光线:若随机数 ≥ P,不发射光线,认为亮度为0
    • 能量补偿:由于第三步会导致能量损失,为了弥补损失,需要将得到的光线亮度 Lo 除以 P,即 Lo/P,可以保证期望值不变
      在这里插入图片描述

③射线生成(追踪足够多的path)

  • 1.在 每个像素内均匀选择多个采样点
  • 2.并为每个采样点发射一条光线,
  • 3.然后使用路径追踪算法 计算每条光线的亮度
  • 4.将他们 平均起来得到像素最终亮度
    在这里插入图片描述

④对光源进行采样

在这里插入图片描述

  • 由于光源相对于半球来说比较小,所以 每个采样点发射的光线中,只有很少一部分会击中光源(有很少的光会从光源击中半球上被采样到的点),用均匀采样会导致浪费
  • 光源对场景的贡献亮度远远大于了其他方向,应该 更多地采样光源方向,提高效率
推导
  • 假设光源面积为 A —— pdf = 1 A \frac{1}{A} A1
  • 渲染方程在立体角上的积分 Lo = ∫ L i ⋅ f r ⋅ c o s d ω \int Li\cdot fr\cdot cos dω Lifrcosdω —— 这个积分代表场景中一点的亮度Lo 是半球上 所有方向的光线亮度和反射率的积分
  • 为了使用蒙特卡洛积分来估计场景中一点的亮度Lo,我们需要将渲染方程转化为对光源的积分
  • 数学的转化,需要找到 立体角 dω 和光源表面积 dA 之间的关系 —— 光源面积立体角方向在球面上的投影
  • 立体角的求法:球面面积法 ω = S / r 2 ω = S/r^2 ω=S/r2 —— d ω = d A c o s θ ′ ∣ x ′ − x ∣ 2 dω = \frac{dA cosθ'}{|x'-x|^2} dω=xx2dAcosθ
    在这里插入图片描述
  • 此时重写渲染方程 Lo = ∫ A L i ( x , ω i ) f r ( x , ω i , ω o ) c o s θ c o s θ ′ ∣ x ′ − x ∣ 2 d A \int_{A}^{} L_{i}( x, ω_{i}) f_{r}( x, ω_{i} ,ω_{o})\frac{cosθcosθ'}{|x'-x|^2}dA ALi(x,ωi)fr(x,ωi,ωo)xx2cosθcosθdA
  • 可以写出蒙特卡洛积分 f(x) = L i ( x , ω i ) f r ( x , ω i , ω o ) c o s θ c o s θ ′ ∣ x ′ − x ∣ 2 L_{i}( x, ω_{i}) f_{r}( x, ω_{i} ,ω_{o})\frac{cosθcosθ'}{|x'-x|^2} Li(x,ωi)fr(x,ωi,ωo)xx2cosθcosθ,pdf = 1/A

⑤结束

  • 来自于光源的进行光源采样,计算直接光照;其他非光源的就需要RR,计算间接光照
    在这里插入图片描述
  • 还得判断光源有没有被遮挡
    在这里插入图片描述
http://www.lryc.cn/news/391626.html

相关文章:

  • 数据结构概念
  • Windows 下载安装ffmpeg
  • Java AI 编程助手
  • day10:01集合
  • 03浅谈提示工程、RAG和微调
  • 硅纪元视角 | AI纳米机器人突破癌症治疗,精准打击肿瘤细胞
  • 刷代码随想录有感(125):动态规划——最长公共子序列
  • Linux和mysql中的基础知识
  • ArcGIS Pro SDK (七)编辑 12 编辑模版
  • 数据结构底层之HashMap(面经篇1)
  • 昇思学习打卡-6-基于MindSpore的GPT2文本摘要
  • 代码随想录算法训练营第2天|LeetCode977,209,59
  • Web前端开发——HTML快速入门
  • 浅谈http协议及常见的面试题
  • LabVIEW自动探头外观检测
  • 搏击与防卫笔记
  • 泰国内部安全行动司令部数据泄露
  • MATLAB算法实战应用案例精讲-【数模应用】分层聚类(附MATLAB、python和R语言代码实现)
  • 九、函数的声明和定义
  • 简洁纯文字类的Typecho主题wenso
  • 安卓请求服务器[根据服务器的内容来更新spinner]
  • c++ 联合(Union)的特性和使用
  • 大白菜U盘启动工具
  • C# 中 IEnumerable 和 IQueryable 接口之间的区别
  • centos安装yum命令及常用yum命令
  • table = collections.defaultdict(list)申请的字典的类型是什么?
  • 【虚拟机】虚拟机网络无法访问问题【已解决】
  • 大数据面试题之Spark(3)
  • 基于 Gunicorn + Flask + Docker 的模型高并发部署
  • CPU通过网络将IP camera的RTSP流(H.264编码或是H.265编码)拉回, 交给GPU解码并显示的处理流程