实时渲染学习(七)全局光照:光线追踪、路径追踪与GI技术进化编年史

2023-10-30

参考博文【《Real-Time Rendering 3rd》 提炼总结】(八) 第九章 · 全局光照:光线追踪、路径追踪与GI技术进化编年史

前言

本章知识概览:

  • 全局光照的基本概念
  • 全局光照的算法主要流派
  • 全局光照技术进化编年史
  • 光线追踪 Ray Tracing
  • 路径追踪 Path Tracing
  • 光线追踪、路径追踪、光线投射的区别
  • 环境光遮蔽 Ambient Occlusion

一、全局光照

全局光照(Global Illumination,简称 GI), 或被称为间接光照(Indirect Illumination)。使用全局光照能够有效地增强场景的真实感。
全 局 光 照 = 直 接 光 照 ( D i r e c t L i g h t ) + 间 接 光 照 ( I n d i r e c t L i g h t ) 全局光照 = 直接光照(Direct Light) + 间接光照(Indirect Light) =(DirectLight)+(IndirectLight)

尽管实际应用中只有漫反射全局照明的模拟算法被称为全局照明算法,但理论上说由于反射、折射、阴影的模拟都需要考虑光源对物体的直接作用和物体之间的相互作用,因此也属于全局光照的范畴。

二、全局光照的主要算法流派

主要流派:

  • Ray tracing 光线追踪
  • Path tracing 路径追踪
  • Photon mapping 光子映射
  • Point Based Global Illumination 基于点的全局光照
  • Radiosity 辐射度
  • Metropolis light transport 梅特波利斯光照传输
  • Spherical harmonic lighting 球谐光照
  • Ambient occlusion 环境光遮蔽
  • Voxel-based Global Illumination 基于体素的全局光照
  • Light Propagation Volumes Global Illumination
  • Deferred Radiance Transfer Global Illumination
  • Deep G-Buffer based Global Illumination

其中,光线追踪又分为递归式光线追踪、分布式光线追踪和蒙特卡洛光线追踪等;路径追踪又分为蒙特卡洛路径追踪、双向路径追踪、能量再分配路径追踪等。

三、全局光照技术进化编年史

3.1 光线投射 Ray Casting

从每个像素射出一条射线(每像素从眼睛投射射线到场景中),找到挡住射线路径的最近物体,视平面上每个像素的颜色取决于可见光表面产生的亮度。
光线投射示意

3.2 光线追踪 Ray Tracing

在光线投射基础上加入光与物体表面的交互,让光线在物体表面沿着反射、折射以及散射方式继续传播,直到与光源相交。也称为经典光线追踪方法、递归式光线追踪方法或者Whitted-style光线追踪方法。
每像素从眼睛投射射线到场景中,找到与该光线相交的最近物体的交点。(1)若该点处的表面是散射面,计算光源直接照射该点产生的颜色;(2)若该点处的表面是镜面或折射面,则继续向反射或折射方向追踪另一条光线。如此递归,知道光线射出场景或到达预设的最大递归深度。
经典光线追踪示意

3.3 分布式光线追踪 Distributed Ray Tracing

将蒙特卡洛方法引入光线追踪领域,将经典光线追踪算法扩展为分布式光线追踪算法,也称为随机光线追踪算法,可以模拟金属光泽、软阴影、景深和运动模糊等效果。

【补充】蒙特卡洛方法,参照蒙特卡洛光线追踪

3.3.1 反向光线追踪

传统正向光线追踪的基本思想:从光源出发,正向追踪每一条光线在场景中的传递过程。正向追踪计算了大量对当前屏幕颜色不产生贡献的信息,极大影响了效率。因此引入反向光线追踪。
反向光线追踪的基本思想:从相机(而不是光源)出发,向投影屏幕发出光线,然后追踪该光线的传递过程。若该光线经过若干次反射、折射打到光源上,则认为该光线是有用的并递归计算其颜色,否则丢弃该光线。实际上,该过程是真实光线投影的逆过程,同样也会产生浪费,并且只适用于静态渲染。

3.3.2 蒙特卡洛光线追踪

理论基础:
传统的逆向光线追踪算法表面属性的单一且不考虑漫反射。改进:认为一个表面的属性可以是混合的,有20%的概率发生反射,30%的概率发生折射,50%的概率发生漫反射。然后通过多次计算光线跟踪,每次按照概率决定光线的反射属性,这样在就把漫反射也考虑进去了。
逆向光线追踪的改进方法:本质就是通过大量的随机采样来模拟半球积分。这种方法在光照细节上可以产生真实度很高的图像,但是图像质量有比较严重的走样,而且效率极其低下。

蒙特卡罗光线追踪本身也是一种逆向光线跟踪。其本质是通过概率理论,把半球积分方程进行近似简化,使之可以通过少量相对重要的采样来模拟积分。相对于普通光线追踪,蒙特卡罗光线追踪引入了更复杂的漫反射模型,从而增加了需要跟踪的光线数量。但是又通过采样算法减少了需要跟踪光线,所以其核心效率取决于采样模型。

3.4 渲染方程 The Rendering Equation

渲染方程描述了场景中光能传输达到稳定状态以后,物体表面某个点在某个方向上的辐射率(Radiance)与入射辐射亮度等的关系。渲染方程根据光的物理学原理,以及能量守恒定律,完美地描述了光能在场景中的传播。很多真实感渲染技术都是对它的一个近似。

3.5 路径追踪 Path Tracing

路径追踪方法是第一个无偏(Unbiased)的渲染方法。路径追踪的基本思想是从视点发出一条光线,光线与物体表面相交时根据表面的材质属性继续采样一个方向,发出另一条光线,如此迭代,直到光线打到光源上(或逃逸出场景),然后用蒙特卡洛的方法,计算其贡献,作为像素的颜色值。
路径追踪会避开贡献小的路径,而在贡献大的路径附近做更多局部的探索。

3.6 双向路径追踪 Bidirectional Path Tracing

双向路径追踪(Bidirectional Path Tracing)的基本思想是同时从视点、光源打出射线,经过若干次反弹后,将视点子路径( eye path) 和光源子路径( light path) 上的顶点连接起来(连接时需要测试可见性),以快速生成很多路径。这种方法能够产生一些传统路径追踪难以采样到的光路,所以能够很有效地降低噪声。

3.7 梅特波利斯光照传输 Metropolis Light Transport

与双向路径追踪相比, MLT方法 更加鲁棒,能处理各种复杂的场景。比如说整个场景只通过门缝透进来的间接光照亮,此时传统的路径追踪方法因为难以采样到透过门缝的这样的特殊路径而产生非常大的噪声。

四、光线追踪 Ray Tracing

光线追踪跟踪从眼睛发出的光线而不是光源发出的光线,所得结果类似于光线投射与扫描线渲染方法的结果,但是具有更好的光学效果。
光线追踪的最大缺点是性能问题,独立看待每条光线,每次均需要重新计算,计算量非常巨大。传统光线追踪产生的并不一定是真实效果图,只有在非常近似或者完全实现渲染方程的时候才能实现真正的真实效果图像。
伪代码:

for each pixel of the screen
{
	Final color = 0;
      	Ray = { starting point, direction };
      	Repeat
	{
		for each object in the scene
          	{
                 	determine closest ray object/intersection;
          	}
	        if intersection exists
      	        {
             		for each light in the scene
             		{
                    		if the light is not in shadow of anotherobject
                    		{
                           			addthis light contribution to computed color;
                    		}
		        }
	       }
      	       Final color = Final color + computed color * previous reflectionfactor;
      	       reflection factor = reflection factor * surface reflectionproperty;
      	       increment depth;
      } until reflection factor is 0 or maximumdepth is reached
}

五、路径追踪 Path Tracing

从视点发出一条光线,光线与物体表面相交时根据表面的材质属性继续采样一个方向,发出另一条光线,如此迭代,直到光线打到光源上(或逃逸出场景),然后用蒙特卡洛方法,计算光线的贡献,作为像素的颜色值。而使用蒙特卡洛方法对积分的求解是无偏的,只要时间足够长,最终图像能收敛到一个正确的结果。
路 径 追 踪 = 光 线 追 踪 + 蒙 特 卡 洛 方 法 路径追踪 = 光线追踪+ 蒙特卡洛方法 =线+

六、Ray Casting ,Ray Tracing,Path Tracing区别

  • 光线投射 Ray Tracing:实际上是一个框架,符合该框架的都叫Ray Tracing。从视点发射光线,与物体相交就根据规则反射、折射或吸收。遇到光源或者走太远就停住。一般来说运算量不小。
  • 光线追踪 Ray Casting:是Ray Tracing的第一步,发射光线,与物体相交。
  • 路径追踪 Path Tracing:是Ray Tracing + 蒙特卡洛法。在相交后会选一个随机方向继续跟踪,并根据BRDF计算颜色。

七、环境光遮蔽 Ambient Occlusion

环境光遮蔽(Ambient Occlusion,简称AO)是全局光照明的一种近似替代品,可以产生重要的视觉明暗效果,通过描绘物体之间由于遮挡而产生的阴影, 能够更好地捕捉到场景中的细节,可以解决漏光,阴影漂浮等问题,改善场景中角落、锯齿、裂缝等细小物体阴影不清晰等问题,增强场景的深度和立体感。

后记

本章内容的重点是光线投射、光线追踪和路径追踪,介绍了全局光照技术的发展历程,涉及的算法简单介绍了其原理,算法变形和细节没有过多介绍,时间问题我也没有过多探索,通过本章的学习我对全局光照技术有了大体的认识,具体算法细节留到需要用的时候再做深入探索。

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

实时渲染学习(七)全局光照:光线追踪、路径追踪与GI技术进化编年史 的相关文章

  • 图形学数学基础之基本蒙特卡罗尔积分(Monte Carlo Integration)

    作者 i dovelemon 日期 2017 07 29 来源 CSDN 主题 Monte Carlo Integration 引言 好久没有写博客了 最近一直在忙于工作 同时GLB库中关于PBR的渲染算法 一直卡住 无法实现下去 不过在这
  • openGL之API学习(八)glutSwapBuffers

    glutSwapBuffers函数是OpenGL中GLUT工具包中用于实现双缓冲技术的一个重要函数 该函数的功能是交换两个缓冲区指针 通常 我们所看到的窗体 文字 图像 从根本上来说都是 画 出来的 比如 制作一个简单的五子棋 我们可能先要
  • 图形学变换——平移、旋转和缩放

    图形学变换 一 概述 二 平移 二 旋转 三 缩放 一 概述 在齐次坐标中 所有的仿射变换都可以使用如下形式的 4 x 4 矩阵来表示 点 p x y z
  • 有关eigen库的一些基本使用方法

    矩阵 向量初始化 include
  • openGL之API学习(五十二)透视分割 透视除法的执行位置

    根据文章https blog csdn net hankern article details 89220736 的分析 透视分割 又叫透视除法 执行的位置在栅格化阶段
  • 线性代数基础(变换)

    本文中的图片 公式等来自 GMAES101 在此向作者表达真挚的感谢 一 为什么要引入齐次坐标 平移变换不能用一个矩阵来表示 它不是线性变换 在缩放或者旋转等变换操作后 需要单独用一个向量来表示 这样表示起来就不方便了 根据以上约定 会有以
  • 图形学/OpenGL/3D数学/Unity

    1 场景管理的数据结构 总结 游戏开发最常用的空间数据结构是四叉 八叉树和BVH树 而BSP树基本上只能应用于编辑器上 k d树则只能用在特殊问题应用场景 2 帧同步与状态同步 https gameinstitute qq com comm
  • GAMES101-现代计算机图形学学习笔记(4)作业3

    前言 上篇作业2 本篇将更新作业3相关内容 作业3相关链接 games的作业3链接 我的源码 作业3简述 插值计算 各种shader实现 作业3相关知识笔记 Barycentric Coordinates Blinn Phong Lambe
  • OpenGL渲染结果发生了奇怪的拉伸和奇怪的彩条

    部分代码如下 Load create texture and generate mipmaps int width height unsigned char image SOIL load image 1 jpg width height
  • openGL之API学习(七十三)opengl与Direct3D(D3D)

    架构上 在架构上其实两者没有什么区别 只是D3D的runtime是在OS里 对于不同硬件来说都是一样的 而OpenGL的runtime直接是和驱动合为一体的 但这并不会造成性能有所差别 shader上 OpenGL 的原生shading l
  • 计算机图形学GAMES101(三)变换(模型、视图、投影)

    补充内容 R 是逆时针方向旋转的矩阵 R 是顺时针方向旋转的矩阵 可以发现R T R 1 像这样的矩阵叫做正交矩阵 以后如果要求往相反的方向旋转相同角度的变换 R 只需要求正向旋转的矩阵然后转置就可以了 本节涉及内容 仿射变换 线性变换 平
  • openGL之API学习(四)纹理操作

    纹理操作代码流程 向着色器传递纹理单元 glUniform1i gSampler 0 向GPU上传纹理数据 GLuint m textureObj glGenTextures 1 m textureObj 生成一个纹理对象 一个纹理对象有多
  • 图形学笔记《Fundamentals of Computer Graphics 4th Edition》——【1】Introduction

    Graphics Areas major areas other areas maybe not core areas Major Applications Graphic APIs Graphics Pipeline Numerical
  • openGL之API学习(六十七)glTexParameter glTextureParameter

    设置纹理对象的参数 这两个函数其实是一个功能 void glTexParameterf GLenum target GLenum pname GLfloat param target Specifies the target to whic
  • webgl学习之路(三)——透视投影矩阵的推导过程

    关于透视投影矩阵的讲解 网上有不少教程 但是有一点大家基本上都没有讲清楚 就是z轴坐标 这里的Z轴相当于景深 的推导过程 基本上是一笔带过 下面先从头开始讲推导过程 再慢慢说Z轴的推导过程 透视投影如下图 透视投影的过程如下 所观察的物体在
  • 3D数学基础——向量与矩阵变换

    向量相乘 1 点乘 两个向量的点乘等于他们的数乘结果乘以两个向量之间家教的余弦值 v k v k cos cos v k v k 通过点乘的结果计算两个非单位向量的夹角 2 叉乘 叉乘只在3d空间中有定义 他需要两个不平行向量作为输入 生成
  • 计算机图形学GAMES101(十五)光线追踪(蒙特卡洛积分与路径追踪)

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

    正交变换 左边是缩放变换 右边是平移变换 对图形进行正交变换需要 先平移 再缩放 但是做矩阵乘法时 先相乘的矩阵放在右边 后相乘的矩阵放在左边 视口平移 Translate M ortho trans lt lt 1 0 0 r l 2 0
  • BRDF详解

    光照模型主要分为三类 测量模型 经验模型和基于物理的分析模型 在计算机图形学中介绍的光照模型为经验模型中的Phong模型 也就是本人理解的 根据点距光源的位置 入射角度等信息计算的 反射强度 包括漫反射强度 镜面反射强度 但是Phong模型
  • 利用cygwin编译cholmod以获得在windows上可用的库lib

    原文http blog parlin me complie cholmod to get library for win64 记录要点 cygwin好好装 希望哪位神人能够提供一个好用的cygwin国内mirror 编译cholmod的时候

随机推荐

  • 如何根据波特率计算设备每秒传输多少字符

    前言 1 微机原理要进行期末考试了 要准备 预习 了 今天看到关于波特率和字符传输的知识 感觉这个在实际项目中可能会使用到 2 因为之前我在学习韦东山老师的课程的时候 他通过波特率计算出了字符传输速度 然后迅速定位到了问题 所以我就将这个知
  • day08 字符串

    LeetCode 344 翻转字符串 注 此处是 left lt right 因为当left 和 right处于同一位置时 无需进行原地翻转 package algor trainingcamp author lizhe version 1
  • SEAndroid学习

    概要 SEAndroid 基于SELinux实现 SELinux 的目标就是实现对Linux 系统上的操作做精细化安全管理 为了达到精细化安全管理无非就限制一些主体访问对某些资源执行某些操作 在SEAndroid里面主体一般是进程 客体一般
  • Flutter 之 Stepper

    Flutter 之 Stepper Stepper 组件在移动端应用中经常被使用 它可以让用户通过一系列步骤来完成一个复杂的操作 Flutter 中的 Stepper 组件提供了一个简单的方式来实现这个功能 如何使用 Stepper 组件
  • 进程管理(四):详解死锁

    0 死锁 死锁 当若干个进程竞争系统资源或相互通信而处于永久阻塞状态时 若无外力作用 这些进程都将无法正常向前推进 这些进程中的每一个进程均无限地等待此组进程中的某个其他进程占有的 自己永远无法得到的资源 这种现象即为死锁 举例 某系统中只
  • GitHub高效搜索技巧

    文章目录 一 搜索技巧 1 排序搜索结果 按交互排序 按反应排序 按作者日期排序 按提交者日期排序 按更新日期排序 2 搜索范围 2 1 搜素存储库 按存储库名称 描述或 README 文件的内容搜索 在用户或组织的仓库中搜索 按存储库大小
  • 软件开发外包平台有哪些?收集的一些备用

    软件开发外包平台有哪些 作为开发者收集的一些备用 方便一些开发者业余接点外包业务 严格来说一般软件开发外包平台属于软件协同产业供应链平台 但是有些软件外包平台有一个部分是和软件外包相似的 就是软件行业的服务商可以入驻平台成为产品经理 然后进
  • android从内部存储写入、安装apk提示解析包错误,或者提示Permission Denied,文件不可用解决办法...

    做应用商店 下载apk 考虑一种情况 如果没有sd卡的情况下就将apk下载到 Internal Cache目录下 下载都正常 但是在安装的时候提示Permission Denied data data mypackage apps app
  • android手表怎样刷机,碉堡了!智能手表也能一键刷机

    5月18日 刷机精灵发布了最新版本V3 27 下载地址 宣布独家支持LG 智能手表G Watch R一键刷机 可刷入百度DuWear和官方ROM 而此前刷机精灵已成功支持三星V700 土曼智能手表一键刷机 后续也将扩展到Moto360等更多
  • 如何在Keras中训练大型数据集

    https www toutiao com a6670173759829180936 在本文中 我们将讨论如何使用Keras在不适合内存的大数据集上训练我们的深度学习网络 介绍 深度学习算法优于所有其他算法 能够在大多数问题上产生最先进的结
  • Ubuntu Android Studio快捷方式创建

    Ubuntu Android Studio快捷方式创建 环境需求 1 Ubuntu 系统 2 JDK已安装 3 Android Studio已安装 一 创建 编辑Studio desktop文件 1 1 在根目录下执行以下命令 sudo v
  • SpringCloud第一版知识点梳理

    本次文章目录结构如下 1 初识Spring Cloud 1 1 目标 1 2 讲解 1 2 1 技术架构演变 1 2 2 SpringCloud简介 1 3 小结 2 微服务调用 2 1 目标 2 2 讲解 2 2 1 RPC和HTTP 2
  • C++之把流对象当做函数参数传递

    一 编译不通过的代码 File Name main cpp Author zjw Email zjw 0722 163 com Create Time 2015年04月09日 星期四 17时36分02秒 include
  • PyCharm:ModuleNotFoundError: No module named 'selenium'

    今天搭了下selenium环境 遇到了不少坑 幸好爬出来了 火狐63 03 32位 selenium 3 141 0 python 3 7 1 首先介绍下selenium的安装 忘记截图 就文字描述了 1 命令行输入 pip install
  • UE4 场景中的物体高亮显示

    本片博文介绍怎么是场景中的物体进行高亮显示 这里首先要创建一种材质 材质创建如下图所示 大体方法是复制你想高亮的那个物体 然后材质用自己新建的材质 然后把自己创建的物体和原来的物体重合就可以做出物体高亮的效果 感觉这个比用后期盒子处理的要简
  • 神策数据微信小程序 SDK 架构解析

    一 前言 神策数据微信小程序 SDK 1 是一款轻量级用于微信小程序端的数据采集埋点 SDK 包含代码埋点 全埋点功能 其中 全埋点功能通过代理微信小程序原生 App Page Component 接口及相应生命周期函数来实现 下面将以 S
  • selenium webdriver安装和版本不匹配问题

    这篇文章主要是因为系统版本如 92 0 4515 159在webdriver中没有对应版本 chromedriver下载 https npm taobao org mirrors chromedriver 1 在chromedriver下载
  • AngularJs学习笔记--bootstrap

    AngularJs学习笔记系列第一篇 希望我可以坚持写下去 本文内容主要来自 AngularJS 文档的内容 但也加入些许自己的理解与尝试结果 一 总括 本文用于解释Angular初始化的过程 以及如何在你有需要的时候对Angular进行手
  • react+ts项目搭建

    create react app地址 https create react app bootcss com docs getting started npx create react app my app template typescri
  • 实时渲染学习(七)全局光照:光线追踪、路径追踪与GI技术进化编年史

    参考博文 Real Time Rendering 3rd 提炼总结 八 第九章 全局光照 光线追踪 路径追踪与GI技术进化编年史 前言 本章知识概览 全局光照的基本概念 全局光照的算法主要流派 全局光照技术进化编年史 光线追踪 Ray Tr