图形学笔记(十四)光线追踪4——蒙特卡洛(Monte Carlo)积分、路径追踪详细过程(Whitted-Style的问题于RR(俄罗斯轮盘赌)算法、Ray Generation)、照片级真实感渲染

本文主要是介绍图形学笔记(十四)光线追踪4——蒙特卡洛(Monte Carlo)积分、路径追踪详细过程(Whitted-Style的问题于RR(俄罗斯轮盘赌)算法、Ray Generation)、照片级真实感渲染,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

图形学笔记(十三)光线追踪3——双向反射分布函数BRDF(反射方程、递归方程)、辐射度量学基础radiometry、立体角、Radiant Energy、Flux、Irrdiance、Radiance
图形学笔记(十五)材质和外观 —— 菲涅尔项、常见材质(微表面材质、各向同性与各向异性)、BSDF、BRDF的性质、测量BRDF

文章目录

  • 1 蒙特卡洛(Monte Carlo)积分
    • 1.1 用处
    • 1.2 方法
      • 1.2.1 基本思想
      • 1.2.2 过程
      • 1.2.3 例子
  • 2 路径追踪(Path Tracing)
    • 2.1 动机:改进Whitted-Style Ray Tracing
      • 2.1.1 Whitted-Style Ray Tracing存在的问题
      • 2.1.2 Whitted-Style Ray Tracing问题的解决办法
    • 2.2 使用Monte Carlo积分解渲染方程的积分
      • 2.2.1 步骤
      • 2.2.2 路径追踪解决光线数量爆炸
      • 2.2.3 Ray Generation
    • 2.3 使用俄罗斯轮盘(RR)解决递归算法停不下来
      • 2.3.1 RR方法概述
      • 2.3.2 RR方法改进后的路径追踪算法
    • 2.4 提高Path Tracing的效率
    • 2.5 Path Tracing的特点
  • 3 Raytracing的概念区分

1 蒙特卡洛(Monte Carlo)积分

1.1 用处

蒙特卡洛(Monte Carlo)积分目的是解决定积分,但是它难以积分(不定积分不好求)。
在这里插入图片描述

1.2 方法

1.2.1 基本思想

在积分域内不断采样,获得y值,不断的与ab范围获得一个个长方形,然后把所有长方形的面积相加求平均。

1.2.2 过程

对于给定函数 f ( x ) f(x) f(x)的定积分,定义蒙特卡洛(Monte Carlo)积分。

首先有定积分
∫ a b f ( x ) d x \int^b_af(x)dx abf(x)dx
然后不断的取样,对于每个取样点有 X i ∼ p ( x ) X_i \sim p(x) Xip(x)
最后获得每个采样点的 f ( x i ) f(x_i) f(xi)值,作为长方形的高,然后按照下面的式子相加评分就获得了Monte Carlo方程。
在这里插入图片描述更通用的形式:
∫ a b f ( x ) d x = 1 N ∑ i = 1 N f ( X i ) p ( x i ) X i ∼ p ( x ) \int^b_af(x)dx=\frac{1}{N}\sum^N_{i=1}\frac{f(X_i)}{p(x_i)} \quad X_i\sim p(x) abf(x)dx=N1i=1Np(xi)f(Xi)Xip(x)

注意

  • N越大,得到的结果越精确。
  • 在x上积分就一定要在x上取样。

1.2.3 例子

假如有一个均匀分布的变量。
X i ∼ p ( x ) X_i \sim p(x) Xip(x)
在这里插入图片描述

计算a到b的积分,有
∫ a b p ( x ) d x = 1 = > ∫ C d x = 1 = > C = 1 b − a \int_a^bp(x)dx=1 => \int Cdx=1=>C=\frac{1}{b-a} abp(x)dx=1=>Cdx=1=>C=ba1
如果使用Monte Carlo积分来计算,有如下方程:

F N = b − a N ∑ i = 1 N f ( X i ) F_N=\frac{b-a}{N}\sum^N_{i=1}f(X_i) FN=Nbai=1Nf(Xi)

2 路径追踪(Path Tracing)

2.1 动机:改进Whitted-Style Ray Tracing

Whitted-Style Ray Tracing对光线进行了如下假设:

  • 总是进行镜面反射和折射
  • 光线在漫反射面停止跳跃

2.1.1 Whitted-Style Ray Tracing存在的问题

问题1 如下是Mirror reflection和Glossy reflection,但是对于打到Glossy的物体上的光线,传播的路径不能与Specular完全相同
在这里插入图片描述
问题2 对于漫反射物体,如果光线传播到它的表面上,那么还是会有光线传播的,不应该停止

在这里插入图片描述

color bleeding:面的颜色流到其他的面上去。 就像上方右图高长方体的左面被全局光照映照出红色。

2.1.2 Whitted-Style Ray Tracing问题的解决办法

Whitted-Style Ray Tracing是错的,但是渲染方程是正确的。
L o ( p , ω 0 ) = L e ( p , ω o ) + ∫ Ω + L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) d ω i L_o(p,\omega_0)=L_e(p,\omega_o)+\int_{\Omega^+}L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n·\omega_i)d\omega_i Lo(p,ω0)=Le(p,ωo)+Ω+Li(p,ωi)fr(p,ωi,ωo)(nωi)dωi

但是此方程涉及

  • 解半球的积分
    解决方法:使用Monte Carlo积分解渲染方程的积分。
  • 递归
    解决方法:使用俄罗斯轮盘法来结束递归。

2.2 使用Monte Carlo积分解渲染方程的积分

2.2.1 步骤

目的:渲染下面场景的一像素的直接光照。
在这里插入图片描述
ω o \omega_o ωo:观测方向,从着色点到观测方向。
ω i \omega_i ωi:各个不同的入射的方向。

先忽略渲染方程的发光项:
L o ( p , ω 0 ) = ∫ Ω + L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) d ω i L_o(p,\omega_0)=\int_{\Omega^+}L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n·\omega_i)d\omega_i Lo(p,ω0)=Ω+Li(p,ωi)fr(p,ωi,ωo)(nωi)dωi

  1. 由Monte Carlo积分 ∫ a b f ( x ) d x = 1 N ∑ i = 1 N f ( X i ) p ( x i ) X i ∼ p ( x ) \int^b_af(x)dx=\frac{1}{N}\sum^N_{i=1}\frac{f(X_i)}{p(x_i)} \quad X_i\sim p(x) abf(x)dx=N1i=1Np(xi)f(Xi)Xip(x)
  2. 寻找f(x)
    f ( x ) = L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) f(x)=L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n·\omega_i) f(x)=Li(p,ωi)fr(p,ωi,ωo)(nωi)
  3. 寻找pdf
    p ( ω i ) = 1 2 π p(\omega_i)=\frac{1}{2\pi} p(ωi)=2π1
  4. 得到方程
    L o ( p , ω o ) ≈ 1 N ∑ i = 1 N L i ( p , ω i ) f r ( p , ω i , ω o ) ( n ⋅ ω i ) p ( ω i ) L_o(p,\omega_o) \approx \frac{1}{N}\sum^N_{i=1}\frac{L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)(n·\omega_i)}{p(\omega_i)} Lo(p,ωo)N1i=1Np(ωi)Li(p,ωi)fr(p,ωi,ωo)(nωi)
  5. 引入间接光照(即来源于物体反射的光照):在p点收到的Q点反射来的光照相当于,以p为观测点,Q为着色点的着色结果,所以有L_i=shade(q,-wi)。
    在这里插入图片描述

对于只考虑直接光照,获得算法如下,

shade(p,wo)随机选择wi~pdf的N个方向Lo=0.0for 每个wi追踪一个光线r(p,wi)if 光线打到了光源Lo += (1/N)*L_i*f_r*cosine / pdf(wi)else if r达到了一个物体上的q点Lo += (1/N)* shade(q,-wi)*f_r*cosine / pdf(wi)			Return Lo

2.2.2 路径追踪解决光线数量爆炸

使用上面的方法,由于光线跳跃多次,光线的数量会爆炸(有递归): r a y s = N b o u n c e s rays=N^{bounces} rays=Nbounces

解决方法 令N=1,即每次只选取wi~pdf的一个方向。

路径追踪就是上面N=1的算法 ,即每次路径追踪只是随机选择一个方向反射。

shade(p,wo)随机选择wi~pdf的1个方向追踪一个光线r(p,wi)if 光线r打到了光源Return L_i*f_r*cosine / pdf(wi)else if r达到了一个物体上的q点Return shade(q,-wi)*f_r*cosine / pdf(wi)			

但是噪声会很大。但是只要对每个像素trace more paths并求它们radiance的平均就可以减少噪声。如下所示。

在这里插入图片描述

2.2.3 Ray Generation

为了减少噪声,所以每个像素要生成多个光线,进行多次路径追踪,光线生成算法如下。

ray_generation(camPos,pixel)在像素中平均的选取N个采样点pixel_radiance = 0.0For 对于像素中的每个采样点射出一条光线r(camPos,cam_to_sample)如果光线击中了场景中的p点pixel_radiance += 1 / N * shade(p, sample_to_cam)Return pixel_radiance

2.3 使用俄罗斯轮盘(RR)解决递归算法停不下来

问题 虽然现实中的光源跳跃也不会停,但是不停的话递归就无法结束。

解决方案 Russion Roulette(RR)俄罗斯轮盘赌。

2.3.1 RR方法概述

设定一个概率,0<P<1。

  • 有概率P,射出光线并且返回着色结果 L o / P L_o / P Lo/P
  • 有概率1-P不射出光线,并返回结果0

用这种方法,仍然可以期望得到值 L o L_o Lo
E = P ∗ ( L o / P ) + ( 1 − P ) ∗ 0 = L o E=P*(L_o/P)+(1-P)*0=L_o E=P(Lo/P)+(1P)0=Lo

2.3.2 RR方法改进后的路径追踪算法

进行如上改进后,得到的代码如下。

shade(p,wo)手动指定一个概率 P_RR在均匀分布[0,1]范围内随机选择ksi。if(ksi>P_RR) return 0.0;随机选择wi~pdf的1个方向追踪一个光线r(p,wi)if 光线r打到了光源Return L_i*f_r*cosine / pdf(wi) / P_RRelse if 光线r达到了一个物体上的q点Return shade(q,-wi)*f_r*cosine / pdf(wi)	/ P_RR

这样就能保证递归可以停止。

2.4 提高Path Tracing的效率

问题 经过以上改进,现在路径追踪算法是正确的了,但是它不高效

在这里插入图片描述
如下图所示,如果均匀的四面八方采样,对于很多光线只有极少数打到光源,大部分都被浪费掉了。
在这里插入图片描述

所以我们直接在光源上采样,pdf=1/A,但是渲染方程的积分是在立体角上进行的 L o = ∫ L i f r c o s d ω L_o=\int Li fr cos d\omega Lo=Lifrcosdω

在这里插入图片描述

由于Monte Carlo方程要求在哪里积分就在哪里取样,所以只要 d ω d\omega dω转变成对dA积分即可。

我们得到立体角和光源面积微分 d A dA dA的关系如下:
d ω = d A cos ⁡ θ ′ ∣ ∣ x ′ − x ∣ ∣ 2 d\omega=\frac{dA \cos \theta '}{||x'-x||^2} dω=xx2dAcosθ

然后重写渲染方程:
L o ( x , ω o ) = ∫ A L i ( x , ω i ) f r ( x , ω i , ω o ) cos ⁡ θ cos ⁡ θ ′ ∣ ∣ x ′ − x ∣ ∣ 2 d A L_o(x,\omega_o)=\int_AL_i(x,\omega_i)f_r(x,\omega_i,\omega_o)\frac{\cos\theta\cos\theta'}{||x'-x||^2}dA Lo(x,ωo)=ALi(x,ωi)fr(x,ωi,ωo)xx2cosθcosθdA

现在我们认为着色结果来源于两部分:

  1. 光源的贡献(直接采样光源,无需RR)
  2. 其他反射(indirect,需要RR)

优化后将这两部分结合的代码如下。
在这里插入图片描述
再考虑另一个问题,如果光源和着色点之间被物体遮挡,则直接返回0。
在这里插入图片描述至此Path Tracing算法完成。

2.5 Path Tracing的特点

缺点 路径追踪不好处理点光源。

优点 Path Tracing可以做到照片级真实感PHOTO-REALISTIC(如下所示)。
在这里插入图片描述

3 Raytracing的概念区分

早期

  • Ray tracing==Whitted-style ray tracing

现代

  • 包含所有光线传播方法的集合
  • (单向/双向)path tracing
  • 光子映射 Photon mapping
  • Metropoils light transport
  • VCM / UPBR

这篇关于图形学笔记(十四)光线追踪4——蒙特卡洛(Monte Carlo)积分、路径追踪详细过程(Whitted-Style的问题于RR(俄罗斯轮盘赌)算法、Ray Generation)、照片级真实感渲染的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/375800

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,