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

news2025/1/16 19:56:25

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.coloradmin.cn/o/1895209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 文件上传和下载指南:从基础到进阶

文章目录 引言1. 环境配置2. 文件上传2.1 配置文件上传路径2.2 创建上传服务2.3 创建上传控制器 3. 文件下载3.1 创建下载服务3.2 创建下载控制器 4. 前端页面4.1 文件上传页面4.2 文件下载页面 5. 技术分析结论 🎉欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o …

Dns被莫名篡改的逆向分析定位(笔记)

引言:最近发现用户的多台机器上出现了Dns被莫名修改的问题,从系统事件上看并未能正常确定到是那个具体软件所为,现在的需求就是确定和定位哪个软件具体所为。 解决思路: 首先到IPv4设置页面对Dns进行设置:通过ProcExp…

@react-google-maps/api实现谷歌地图中添加多边围栏,并可编辑,编辑后可获得围栏各个点的经纬度

先上一张效果图 看看是不是大家想要的效果~ ❤️ 由于该功能微微复杂一点,为了让大家精准了解 我精简了一下地图代码 大家根据自己的需求将center值和paths,用setState做活就可以了 1.第一步要加入项目package.json中或者直接yarn install它…

假设性文档嵌入 HyDE:大模型 + 对比学习,从关键词相似度搜索到语义搜索

假设性文档嵌入 HyDE:大模型 对比学习,从关键词相似度搜索到语义搜索 提出背景流程图解法拆解类比1. 单一文档嵌入空间的搜索2. 指令跟随型语言模型(InstructLM)的引入3. 生成文档的嵌入编码 提出背景 论文:https://…

2024亚太杯中文赛数学建模B题【洪水灾害的数据分析与预测】思路详解

2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛 B题 洪水灾害的数据分析与预测 附件 train.csv 中提供了超过 100 万的洪水数据,其中包含洪水事件的 id、季风强度、地形排水、河流管理、森林砍伐、城市化、气候变化、大坝质量、淤积、农业实践、侵蚀、无效防灾、…

一文搞懂 java 线程池:ScheduledThreadPool 和 WorkStealingPool 原理

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

Google Gemini:大上下文窗口是杀手级功能吗?

在八个月前,一封泄露的谷歌电子邮件透露,谷歌正努力超越其人工智能竞争对手。谷歌不仅没有围绕其人工智能产品的护城河——换句话说,没有建立起商业优势——也没有可以改变现状的秘诀。就在他们努力解决这个问题的同时,他们也看到…

SpringSecurity中文文档(Servlet Password Storage)

存储机制(Storage Mechanisms) 每种支持的读取用户名和密码的机制都可以使用任何支持的存储机制: Simple Storage with In-Memory AuthenticationRelational Databases with JDBC AuthenticationCustom data stores with UserDetailsServic…

2024/07/04

1、梳理笔记(原创) 2、终端输入一个日期&#xff0c;判断是这一年的第几天 scanf("%d-%d-%d",&y,&m,&d); 闰年2月29天&#xff0c;平年2月28天 #include<stdio.h> int main(int argc, char const *argv[]) {int y0,m0,d0;printf("please ente…

KBL610-ASEMI无人机专用整流桥KBL610

编辑&#xff1a;ll KBL610-ASEMI无人机专用整流桥KBL610 型号&#xff1a;KBL610 品牌&#xff1a;ASEMI 封装&#xff1a;KBL-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;6A 功率(Pd)&#xff1a;中小功率 芯片个数&#xff1a…

【每天学会一个渗透测试工具】SQLmap安装教程及使用

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 ✨SQLmap简介 Sqlmap是一款开源的渗透测试工具 &#x1f680;下载及安装 下载地址&#xff1a;http://sqlmap.org/ windo…

黑马点评DAY4|整体项目介绍、短信登录模块

项目整体介绍 项目功能介绍 项目结构 该项目前后端分离架构模式&#xff0c;后端部署在Tomcat服务器&#xff0c;前端部署在Niginx服务器上&#xff0c;这也是现在企业开发的标准做法。PC端首先向Niginx发起请求&#xff0c;得到页面的静态资源&#xff0c;页面再通过ajax向服…

【UE5.3】笔记7 控制Pawn移动

使用A、D键控制角色左右移动 打开我们的BP_Player蓝图类&#xff0c;选择事件图表&#xff0c;添加我们的控制事件 右键&#xff0c;搜索A keyboard&#xff0c;选择A,如下图&#xff0c;D也是 添加扭矩力 首先我们要把我们的player上的模拟物理选项打开&#xff0c;这样我们…

Windows系统安装MySQL8.0.38

MySQL 8.0 相对于 MySQL 5.7 来说有几个显著的区别和改进&#xff0c;以下是一些主要的区别&#xff1a; JSON 数据类型和函数改进&#xff1a; MySQL 8.0 引入了更多的 JSON 支持&#xff0c;包括 JSON 数据类型、JSON 函数和操作符。这使得存储和查询 JSON 数据更加方便和高效…

sql语句练习注意点

1、时间可以进行排序&#xff0c;也可以用聚合函数对时间求最大值max&#xff08;时间&#xff09; 例如下面的例子&#xff1a;取最晚入职的人&#xff0c;那就是将入职时间倒序排序&#xff0c;然后limit 1 表&#xff1a; 场景&#xff1a;查找最晚入职员工的所有信息 se…

MySQL-作业1

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo 二、创建表 1、创建一个名称为db_system的数据库 2、在该数据库下创建两张表&#xff0c;具体要求如下&#xff1a; 员工表 user …

贵的智能猫砂盆值得买吗?包含百元、千元的高性价比品牌推荐!

对于养猫的上班族来说&#xff0c;智能猫砂盆真的是越早买越好&#xff0c;普通猫砂盆用这么久下来能把我们这些上班的都累死&#xff0c;每次一回到家就能闻到猫屎的臭味&#xff0c;一看就收获猫砂盆里满满当当的猫屎&#xff0c;在外面要上班&#xff0c;在家里也要给猫上班…

C语言数据类型和变量(三)

目录 1.赋值操作符 1&#xff09;连续赋值 2&#xff09;复合赋值符 2.单目操作符&#xff1a;、- -、&#xff08;正号&#xff09;、- &#xff08;负号&#xff09; 1&#xff09;和-- 2&#xff09; 和 - 3.强制类型转换 4.printf&#xff08;&#xff09;函数 1…

用for语句实现九九乘法表

① #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int main() {for (int i 1; i < 9; i){for (int j 1; j < i; j){printf("%d*%d%d\t", j, i, i * j);}printf("\n");}return 0; } ② #define _CRT_SECURE_NO_WARNINGS #include &…

美特CRM anotherValue FastJson反序列化RCE漏洞复现

0x01 产品简介 MetaCRM是一款智能平台化CRM软件,通过提升企业管理和协同办公,全面提高企业管理水平和运营效率,帮助企业实现卓越管理。美特软件开创性地在CRM领域中引入用户级产品平台MetaCRM V5/V6,多年来一直在持续地为客户创造价值,大幅提升了用户需求满足度与使用的满意…