计算机图形学GAMES101(十五)光线追踪(蒙特卡洛积分与路径追踪)

2023-11-15

本节涉及内容:

  • 蒙特卡罗积分
  • 路径追踪

蒙特卡罗积分

蒙特卡罗积分的核心思想还是求一个不规则图形的面积,它的做法是:首先在a和b之间找一个值xi然后求f(x)。接着以f(x)为高,ab为宽求矩形的面积,最后将所有的值求平均。当采样数量xi趋于无穷时,就近似求到了该不规则图形的面积。
在这里插入图片描述

怎么求蒙特卡罗积分

**FN**表示蒙特卡罗积分
**Xi~p(x)**表示概率分布
因为我们取xi时是在a到b之间均匀的取值,所以xi在ab上服从均匀分布。由均匀分布的概率密度函数可知 C=1/(b-a)
在这里插入图片描述
在这里插入图片描述
即p(xi)=1/(b-a)代入可得
从该式子可以看出,蒙特卡罗积分的思想:f(xi)表示图形的高度,b-a表示图形的宽度,1/N表示求平均值。这就从侧面说明了蒙特卡罗积分的核心思想。
在这里插入图片描述
求蒙特卡罗积分所需的条件:

  • 知道曲线上任何一个点的函数值,即f(xi
  • 知道采样的概率密度p(xi

路径追踪

这两个茶壶,左边这个完全光滑,是镜面反射,右边这个相对来讲没有那么光滑。在Whitted-Style Ray Tracing下,对于镜面反射的物体来讲没有什么问题,但是对于表面有些粗糙的物体,反射的光线应该朝向各个方向,如果认为还是认为沿着镜面反射方向反射,是不对的,因此这里产生了问题。
在这里插入图片描述
场景中的物体都是漫反射的,而如果用Whitted-style ray tracing,其定义当光线打到漫反射物体,那么这条光线就停下来了,那么两个物体之间的光线全部都得不到。右边是全局光照,光线打到一个漫反射物体上时,仍然继续传播直到射到我们的眼睛里,所有我们可以看到黑暗的地方。
在这里插入图片描述
因为Whitted-style ray tracing在物理上是错误的,所以需要一个之前的东西来替代它。即渲染方程
在这里插入图片描述
可以观察到渲染方程右边是一个积分,所以我们可以用蒙特卡罗积分来解。

在这一个简单场景中,我们就考虑清楚对于一个点(像素),他的直接光照是什么。

  • 有可能有其他物体会挡住光
  • 有一个相对较大的面光源
  • 观测方向:着色点到摄像机的方向ωo
  • 各个不同的进来的光(入射光方向):ωi(与Blinn-Phong一样,认为方向都是从着色点出发往外打)
    在这里插入图片描述
    对于一个着色点而言,它的光就是四面八方来的光被反射到观察点的光。(不考虑自发光)
    反射方程如下:
    在这里插入图片描述

那么怎么求这个渲染方程呢?

由蒙特卡罗积分可知要求一个积分要知道被积函数f(x)和概率密度p(x)

因为球的面积是4π,所以半球面积是2π,概率密度就是球上每一个点的均值即1/2π
在这里插入图片描述
将反射方程写成蒙特卡罗积分的形式
在这里插入图片描述

shade(p, wo)
Randomly choose N directions wi~pdf//随机选择n个采样点
Lo = 0.0
For each wi
	Trace a ray r(p, wi)
	If ray r hit the light
		Lo += (1 / N) * L_i * f_r * cosine / pdf(wi)//表示渲染方程
Return Lo

到此为止只是解决了直接光照的问题,但是我们最后的结果要是全局光照,因此再引入间接光照

因此我们需要计算由Q反射到P的光照,这个时候我们类比,就好像是在P点观察Q点,算出Q点的直接光照。Q点反射到P点的Radiance就相当于是在Q点算出的直接光照。
在这里插入图片描述
但是这样做就会产生一个问题,假如说一根光线射到一个物体上,反射出了一百根光线,然后又射到另一个物体上那就是一万根了,它是以指数级增长的,这样计算量太大了。
在这里插入图片描述
只有当N=1时计算量才时在可接受范围内,所以算法可以进行如下改进。

shade(p, wo)
Randomly choose ONE direction wi~pdf(w)   //只采样一次
Trace a ray r(p, wi)
If ray r hit the light
Return L_i * f_r * cosine / pdf(wi)
Else If ray r hit an object at q
Return shade(q, -wi) * f_r * cosine / pdf(wi)//这里进行递归,计算间接光照

当N=1时,这种追踪方式叫做路径追踪
当N!=1时,这种追踪方式叫做分布式光线追踪(计算量爆炸多)

虽然N=1会造成很大的噪声,但是穿过一个像素可以有很多条路径,然后对于这些路径求平均即可降低每条路径对于最终结果的影响。
在这里插入图片描述
下面是该方法的算法:

ray_generation(camPos, pixel)//camPos摄像机的位置,pixel待计算的像素值
Uniformly choose N sample positions within the pixel   //在这个像素内均匀的取N个不同的位置
	pixel_radiance = 0.0
	For each sample in the pixel  //对于任何一个位置都发射一条光线
		Shoot a ray r(camPos, cam_to_sample) 
		If ray r hit the scene at p  //如果打到了场景中
			pixel_radiance += 1 / N * shade(p, sample_to_cam)//计算该光线的着色
	Return pixel_radiance

但是这个递归算法并没有出口,这表示光线会弹射无数次,虽然显示生活中光线的确会经过无数次的弹射,但是计算机里面没办法模拟无数次,必须停止,如果直接规定最高弹射次数就会造成光线能量的损失,所以我们需要一种方法来停止弹射:
在这里插入图片描述

在这里插入图片描述
这种方法的算法表示:

shade(p, wo)
	Manually specify a probability P_RR //P_RR表示发射光线的概率
	Randomly select ksi in a uniform dist. in [0, 1] //ksi是[0, 1]的一个随机数
	If (ksi > P_RR) return 0.0;//如果ksi大于P_RR则表示不发出关系
	
Randomly choose ONE direction wi~pdf(w)//下面的算法和上面的一致
Trace a ray r(p, wi)
If ray r hit the light
	Return L_i * f_r * cosine / pdf(wi) / P_RR
Else If ray r hit an object at q
	Return shade(q, -wi) * f_r * cosine / pdf(wi) / P_RR

到此为止,这套算法就是正确的,而且可以计算间接光照的算法了。

虽然有了这套路径最终的方法但是并不高效,因为低SPP的画面效果很差,但是提高SPP后画面好,造成性能有负担。所以我们要解决的是在低SPP下也可以达到高SPP的画面效果。
在这里插入图片描述
之前我们实现路径追踪是在着色点朝着四面八方均匀的射出许多光线(均匀采样),当光源越来越小时能够射到光源上的光线就越少,就会使得很多光线都浪费了
在这里插入图片描述
所以我们需要找到一个更好的pdf采样方法。

如果我们直接从光源上采样,那么所有光线都不会被浪费了

假设对于着色点在光源上采样,那么对于这个面光源来讲,光源面积是A,均匀采样的PDF就是1/A

但是渲染方程是定义在半球中立体角上的,而不是在光源上的,

采样在光源上采样,积分在立体角上积分,如果要确保渲染方程还能用,就要把渲染方程写成在光源上的积分。
在这里插入图片描述
也就是说需要将渲染方程作为dA的积分 ,那么就要找到dω和dA之间的关系

因为立体角可以理解为将一块面积投影到一个单位球的表面上,所以只需要将dA投影到单位球的表面上,求出投影的面积,就得到了立体角,所以dω和dA之间的关系有如下公式:
在这里插入图片描述
把渲染方程写成在光源(dA)上的积分。那么就可以使用蒙特卡罗积分了,而且p(ω)=1/A
在这里插入图片描述
基于这种思想,改进的算法:

  • 第一部分来源于对光源的贡献,对光源采样
  • 第二部分来源于其他所有非光源的贡献(如物体反射的光),这部分还用原来哪个俄罗斯轮盘赌的方法进行计算
    在这里插入图片描述
shade(p, wo)
	//来自光源的贡献
	Uniformly sample the light at x’ (pdf_light = 1 / A)//均匀的对光源进行采用样即(1/A)
	L_dir = L_i * f_r * cos θ * cos θ’ / |x’ - p|^2 / pdf_light //写成dA形式的渲染方程
	
	//来自其他点的贡献,采用以前的俄罗斯轮盘赌方法
	L_indir = 0.0
	Test Russian Roulette with probability P_RR
	Uniformly sample the hemisphere toward wi (pdf_hemi = 1 / 2pi)
	Trace a ray r(p, wi)
	If ray r hit a non-emitting object at q  //打到了点q,确定点q不是光源(因为光源的贡献已经算出来了)
		L_indir = shade(q, -wi) * f_r * cos θ / pdf_hemi / P_RR
	Return L_dir + L_indir

左是照片,右边是通过路径追踪渲染出来的图像,几乎和现实一模一样。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机图形学GAMES101(十五)光线追踪(蒙特卡洛积分与路径追踪) 的相关文章

  • 次表面散射

    专题介绍 在实时渲染和离线渲染领域 对场景模型表面以及空间介质的精细化建模是增加场景真实感的重要手段 计算机图形学领域的许多科研工作者设计出一系列复杂精巧的技术理论 模拟出光线从宏观世界到微观粒子的变化规律 本期专题精选了近年来关于微表面模
  • Unity中UGUI的Text实现超链接点击的解决方案

    Unity实现超链接点击 功能简介 C 脚本 使用方法 Demo工程内截图 Demo地址 功能简介 1 同一个Text内可以实现多个不同字符区域的点击 2 适配了中文 英文 韩文 日文 阿拉伯语等 更多语种待测试 C 脚本 文件名 UITe
  • 判断一个点是否在圆内(三点确定一个圆)

    三角形的外接圆圆心是任意两边的垂直平分线的交点 三角形外接圆圆心叫外心
  • Unity的C#编程教程_62_语言集成查询 LINQ 详解及应用练习

    文章目录 LINQ Querys 1 Any 2 Contains 3 Distinct 4 Where Challenge Hands on with LINQ LINQ Order by Descending Challenge Fil
  • OpenGL超级宝典 纹理(一)

    文章目录 纹理 创建并且初始化纹理 更新纹理数据 从着色器中读取数据 采样器类型 控制纹理数据的读取方式 创建采样器对象和绑定到纹理单元 纹理过滤 设置过滤器 加载纹理 完整代码展示 shader vertex shader fragmen
  • 图形学基础1

    坐标系相关 uv可能会影响局部坐标系 如果light图和brdf图做卷积的时候 局部坐标系保持一致很重要 如下图 tangent是从外部模型文件进行加载的 切线空间采样并转世界坐标系 spherical to cartesian in ta
  • c#图像几何特征匹配

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks using Ope
  • GAMES101:作业3

    GAMES101 作业3 附其他所有作业超链接如下 Games101 作业0 作业0 Games101 作业1 作业1 Games101 作业2 作业2 Games101 作业3 作业3 Games101 作业4 作业4 Games101
  • OpenGL 入门 10:光源

    点光源 点光源的强度需要随着距离增加而减少 至于减少的系数公式大致如下 在这里d代表了片段距光源的距离 接下来为了计算衰减值 我们定义3个 可配置的 项 常数项Kc 一次项Kl和二次项Kq 常数项通常保持为1 0 它的主要作用是保证分母永远
  • openGL之API学习(六十三)GL_RASTERIZER_DISCARD

    glEnable GL RASTERIZER DISCARD 使用GL RASTERIZER DISCARD标志作为参数调用glEnable 函数 告诉渲染管线在transform feedback可选阶段之后和到达光栅器前抛弃所有的图元
  • 计算机图形学----光线追踪----路径追踪

    基础知识预备 概率论 概率 期望 概率 值 PDF 概率密度函数 概率密度函数 p x 在数学中 连续型随机变量的概率密度函数 在不至于混淆时可以简称为密度函数 是一个描述这个随机变量的输出值 在某个确定的取值点附近的可能性的函数 也就是结
  • 3D游戏编程与设计-游戏的本质hw1

    游戏的本质 游戏的分类 游戏热点 华为市场的排行榜前20游戏排名情况如下 畅销榜 人气榜 热门榜 TapTap榜单前20游戏排名情况 热玩榜 热门榜 App Store付费游戏与免费游戏排名前20情况 热点分析 游戏的分类 游戏的分类标准很
  • 【Unity3d】Animator和Animation组件使用注意事项

    一 Animator一般用于人物动画控制 特点是动画是持续的 可能有动作切换 Animation一般用于间断性的动画的控制 比如一个场景特效的播放 只播放一次就完了 二 实测Animation速度比Animator快10 左右 内存占用没测
  • 零基础如何入门数学建模?

    小羊简介 博客主页 小羊不会飞 年龄 20 大二在读 爱好 干饭 运动 码代码 看书 旅游 即将更新 1 手把手带你搭建个人博客网站 2 后台管理系统模块更新 感兴趣的朋友 赶紧上车吧 欢迎关注 点赞 收藏 留言 有任何疑问 欢迎留言讨论
  • 使用 Blender* 重新拓扑 VR 和游戏素材

    本文介绍如何将网格重新拓扑成一个整洁的低密度模型 然后 UV 解包该网格 以便将纹理贴添加至新模型 本文还将探讨如何使用免费工具 比如 Blender 及其 Bsurface 插件 重新拓扑雕塑的 3D 网格 查看详情
  • NeRF学习笔记(含公式、图解和过程)

    NeRF学习笔记 关注公众号 不定期分享NeRF相关文献 引言 NeRF Representing Scenes as Neural Radiance Fields for View Synthesis作为2020年ECCV的一篇论文 在用
  • CocosCreator之KUOKUO带你做小小赛车-摄像机跟随

    本次引擎2 0 5 编辑工具VSCode 目标 小小赛车 先亮素材 很简单 就两个 爱给网中的赛道 以及一个小车 好了 让我们新建工程然后把赛道放进去 调整方向与大小 然后把小车拖上去 这样 我是把赛道放大了2倍 旋转了90度 拖一拖位置
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • 【计算机图形学】PointNet文章的简单理解与运用,点云特征提取

    PointNet论文原文 PointNet Deep Learning on Point Sets for 3D Classification and Segmentation PointNet官方代码是使用tensorflow实现的 Po
  • ‘DR-GAN: Automatic Radial Distortion RectificationUsing Conditional GAN in Real-Time‘条件GAN实时径向畸变自动矫正

    这篇文章在2020年发表在IEEE Transactions on Circuits and Systems for Video Technology上

随机推荐

  • 使用httpwebrequest发送数据到网站

    怎样通过HttpWebRequest 发送 POST 请求到一个网页服务器 例如编写个程序实现自动用户登录 自动提交表单数据到网站等 假如某个页面有个如下的表单 Form
  • vue简单实现div滚动触底加载更多数据效果

    vue简单实现div滚动触底加载更多数据效果 1 html div class webTherapyAuditList div里放置一些需要滚动加载的信息 滚动函数通过 scroll触发 div 2 js 获取页面滚动距离 handleSc
  • js 获取tabel Cell 内input 的信息

    1 要建立一个清单 在网页表格内输入信息并可以获取保存 这里只写如何获取table 里单元格里input 或 textarea 的信息 2 html 的代码如下 table tr td r name td td r value1 td td
  • arcgis---填充面要素空洞

    1启动编辑 选中面要素 2构造要素选面 3绘制一个包含空洞的任意多边形 4按住shift 选择合并 属性可选择1 2 5 加载绘图工具 使用矩形工具绘制任意的图形覆盖所有图形 6将图形要素转换成面要素 7分析工具 标识 8数据管理 多部分至
  • ROS Navigation-----map_server简介

    map server包提供了一个map server ROS Node 该node通过ROS Service方式提供地图数据 该包还提供了map saver命令行utility 使用该工具可将动态创建的地图保存成文件 1 Map forma
  • 日常——js

    1 闭包 1 1 概念 闭包指 有权访问另一个函数作用域中变量的函数 1 2 优缺点 优点 闭包函数中的变量不会随着闭包函数销毁而销毁 而是要等到还在使用它的函数销毁时才会销毁 缺点 频繁使用闭包会造成内存泄漏 闭包 会将它的外部函数的作用
  • 如何获取 两个日期之间的 天数

    获取两个日期对应的时间戳 1 然后时间戳的差 24 60 60
  • 最大子序列和及序列起始位置-全负数也适用-O(N)时间复杂度

    有一个很经典的题目 给定一个整数组 求连续子序列的最大和 整数为正 负 0皆有可能 先考整数不是全负的情况 和最大的连续子序列 必然是以一个非负数开头 因为和加上一个负数 和变小 此外 和为负数的连续子序列 也不可能是目标子序列的开头的一段
  • 申请苹果个人开发者账号流程

    因为经常有人问我怎么申请苹果开发者账号 这里记录下来方便使用 准备 1 一个苹果账号 Apple ID 2 一张开通visa或master功能的信用卡 3 身份证正反面照片 4 一部苹果手机 5 一个手机号 申请流程 一 先注册一个苹果账号
  • python报错:ImportError: cannot import name ‘calinski_harabaz_score‘ from ‘sklearn.metrics‘解决方案

    报错 ImportError cannot import name calinski harabaz score from sklearn metrics 解决方案 harabaz 改为harabasz 成功解决
  • idea强制回退gitlab分支代码

    1 如果合并分支出错 执行以下两步操作 1 切换到本地分支 找到要回退到的点 2 找到本地该项目的文件目录 空白处右键选择 git bash here 将本地分支代码强推到远程库 执行命令符 git push f origin develo
  • 1.MySQL数据库的基本操作

    数据库操作过程 1 用户在客户端输入 SQL 2 客户端会把 SQL 通过网络发送给服务器 3 服务器执行这个 SQL 把结果返回给客户端 4 客户端收到结果 显示到界面上 数据库的操作 这里的数据库不是代表一个软件 而是代表一个数据集合
  • Navicat 15安装教程,强烈推荐收藏!

    Navicat是一款轻量级的用于MySQL连接和管理的工具 非常好用 使用起来方便 简洁 下面讲讲其安装的过程 1 进入navicat官网 选择Navicat for MySQL 然后点击进行下载即可 官网连接 http www navic
  • VSCode+Qt+MinGW开发环境搭建

    VSCode Qt MinGW开发环境搭建 概述 VSCode扩展性很强 插件机制让其具备不断演进的潜力 适合作为稳定的开发工具 VSCode Qt开发环境的搭建需要依赖于以下工具 VSCode Qt 其中Qt需要安装MinGW编译工具 V
  • 【python-数据分析】笔记1

    数据库vs 仓库 数据库 gt 业务存储 针对应用 仓库 gt 主题存储 针对分析 数据来源 Kaggle 阿里云天池 在python console输入 import pandas as pd df pd read csv data HR
  • 理解javascript的同步与异步模式

    你可能知道 Javascript语言的执行环境是 单线程 single thread 所谓 单线程 就是指一次只能完成一件任务 如果有多个任务 就必须排队 前面一个任务完成 再执行后面一个任务 以此类推 这种模式的好处是实现起来比较简单 执
  • Leetcode 第 43 场双周赛题解(Python)

    Leetcode 第 43 场双周赛题解 周赛日期 2020 01 09 题目1 1716 计算力扣银行的钱 难度 简单 Hercy 想要为购买第一辆车存钱 他 每天 都往力扣银行里存钱 最开始 他在周一的时候存入 1 块钱 从周二到周日
  • 《一个操作系统的实现》读书笔记--第二章--搭建工作环境

    一 熟悉Bochs虚拟机 第一章我们使用虚拟机VMware运行了该最最简单的操作系统 由于VMware虚拟机不具备调试操作系统的功能 因此对于开发操作系统的程序员来说 VMware是不完备的 故本章介绍另一款虚拟机Bochs 下面我们就介绍
  • python 连续比较_python等值和大小比较

    等值 大小比较 在python中 只要两个对象的类型相同 且它们是内置类型 字典除外 那么这两个对象就能进行比较 关键词 内置类型 同类型 所以 两个对象如果类型不同 就没法比较 比如数值类型的数值不能和字符串类型的数值或字母比较 对于py
  • 计算机图形学GAMES101(十五)光线追踪(蒙特卡洛积分与路径追踪)

    本节涉及内容 蒙特卡罗积分 路径追踪 蒙特卡罗积分 蒙特卡罗积分的核心思想还是求一个不规则图形的面积 它的做法是 首先在a和b之间找一个值xi然后求f x 接着以f x 为高 ab为宽求矩形的面积 最后将所有的值求平均 当采样数量xi趋于无