【GAMES202】Real-Time Global Illumination(in 3D)—实时全局光照(3D空间)

news2024/10/5 20:23:19

一、SH for Glossy transport

1.Diffuse PRT回顾

上篇我们介绍了PRT,并以Diffuse的BRDF作为例子分析了预计算的部分,包括Lighting和Light transport,如上图所示。 包括我们还提到了SH,可以用SH的有限阶近似拟合球面函数,然后计算。

这里和上篇的推导方式不太一样,我们上篇是把Lighting项用SH分解然后交换积分和求和符号,最后变成了两个向量的点乘。而这次我们把Lighting项用SH分解,把Light transport项也用SH分解,最后得到了两个求和,以及右边的两个基函数的乘积再积分(product integral) ,感觉不太一样?从O(n)变成了O(n2)?

这里就可以用到SH的性质,正交性,显然两个基函数的product integral的操作正如同把一个基函数投影到另一个基函数上一样,类比于三维空间中把x轴投影到y轴,结果是0,除非是把x轴投影到x轴,那么结果是1,由此我们知道,只有Bp和Bq是相同基函数的情况下,右边这个东西才不等于0而是等于1。

由此也就相当于两个一维向量组成的矩阵,但只有矩阵对角线上有值,那么仍然是O(n),我们的上篇的推导仍然成立。

2.Glossy PRT

接下来看Glossy的情况,我们之前说Diffuse的PRT好做是因为,Diffuse的BRDF是一个常数,而Glossy的BRDF显然不是一个常数,它是一个完整的四维的函数。 

这里我们仍然把Lighting投影到SH上,然后把Light transport也投影到SH上,但是最后得到的结果就不是简单的两个向量的点乘了,Ti变成了T(o),原因正是因为BRDF此时不再是常数了,此时任给一个方向o,我们都可以得到一个BRDF和相应的T(o),也就是说,不同的o得到的向量不同,也就是说我们最后得到的不再是一个向量Ti,而是一个函数T(o)。

换个角度理解,我们知道Diffuse的反射是和视角无关的,而Glossy则不同,Glossy和视角方向是有关的,这也符合最后得到的结果L(o)是一个关于观察方向o的函数。 

那我们怎么处理呢?原本的四维被我们投影到二维的SH上变成了二维的Light transport,那我们可不可以再做一次投影呢?答案是可以,只不过这时候transport就不再是一个向量了,而是一个矩阵,如上图所示。最后的结果自然是一个关于观察方向o的函数L(o)了,也就是一个向量。

当然Glossy的PRT也有代价,首先是预计算的存储,如果想用前五阶的SH拟合,那就是25*25=625个基函数的计算结果。其次因为不再是向量与向量相乘,而是向量与矩阵相乘,计算的开销也会增加。正常情况下人们通常会用3,4,5阶的SH,相应的高频BRDF使用的阶数就高一些。

对于特别高频的情况(接近镜面反射),一般会采用其它的基函数来投影,因为SH表达高频的效果很差,或者另一种解决思路就是直接采样就可以了,因为镜面反射已经知道了是如何反射的。

3.PRT for Interreflections and Caustics

PRT同样可以做Interreflection,也就是自身反射自身的效果。

我们先总结一下传播路径,如上图所示,其中LE表示光源(Light)直接到达眼睛(Eye),LGE自然表示光源(Light)打到Glossy的物体,再进入眼睛(Eye),一个通用的表达L(D|G)*E,因为物体要么是Diffuse的要么是Glossy(Specular可以当作特殊的Glossy)的,*代表可以反射多次,然后进入人的眼睛。

如上图的茶壶所示,在多了一次光线的bounce之后,壶身可以反射到自身的壶嘴,那自然bounce越多反射的也就越多,也就越接近真实的光线传播。

另一种常见的传播路径,Caustics(焦散),通常用LS*(D|G)*E表示,它表示光源先打到Specular也就是非常光滑的表面上,再打到Diffuse物体上再传到眼睛被看到。如上图的金属环。

通过观察我们可以发现任何的Transport path都可以被分成Lighting和Light transport两部分,也就是L和除L外的东西。也就是说无论Light transport多复杂我们都可以用PRT的方式进行预计算。

回顾一下Ti项的预计算,我们之前提到了可以把如图中所示的式子当作一种投影,而另一种理解思路,我们发现这个式子很像渲染方程,唯一不同的是Li变成了基函数,那我们可以就可以理解成用这些不同基函数形式的光照去照亮整个物体,如图所示,只不过每个光照会有些奇怪罢了,但是把它们合在一起,仍然是正确的完整的光照。(红色为+,蓝色为-,黑色为0) 

对于不同的BRDF,我们只要能把light transport表示出来,都可以通过预计算来实时渲染。即使为如上图所示的右下角的茶壶,不同的位置上有不同的BRDF,此时虽然任何一个顶点的BRDF仍是四维,但整个物体变成了六维的函数,但是我们仍然可以通过PRT计算。 

4.PRT的局限

⦿ 球谐函数只适合于描述低频的函数,描述高频要用很高阶的基函数

⦿ 因为预计算,所以只适用于静态场景。材质,场景都不能发生改变

⦿ 大量的预计算数据需要存储和读取0

二、Wavelet—小波

⦿ Wavelet

⦿ Zonal Harmonics

⦿ Spherical Gaussian (SG)

⦿ Piecewise Constant

事实上,在SH之后,人们研究了许多基函数,用来表示其他函数,如上面所列举的一部分。

我们简单介绍其中的一种,Wavelet—小波,并且小波有很多种,这里我们介绍的是2D Haar小波。与SH相同,它也是一系列基函数,但不同的是,SH定义在球面上,而它定义在图像块上,并且不同的小波定义域不同,如图中只有黑白的地方才是定义域,并且小波支持全频率的表示。其次,与SH不同的是,我们用SH近似的时候是取了SH有限阶的基函数去近似,而小波不同,我们把函数投影到小波的每个基函数上,会发现有些基函数的系数接近0,这样我们就可以定义一个系数大小,小于一定值的基函数丢掉就可以了。

自然的,由于小波定义在图像块上,那自然不能用Sphere map来做光照,而是改用Cubemap,并且对Cubemap的每张图单独做小波变换,大致思路为一张图划分为四块,左上角存储低频信息,然后其余为高频信息的小波变换保留下来的非0系数项,接着依次不断划分,如上图所示。

可以看到,小波还原出来的效果比SH好一些,包括高频的阴影。

但小波有一个缺点,就是它不支持光源的旋转,而不像SH的简单的旋转性质。 

三、Real-Time Global Illumination (in 3D)

[Ritschel et al., The State of the Art in Interactive Global Illumination]

全局光照在真实感渲染中有着举足轻重的作用,如果没有全局光照,场景中会出现许多死黑的地方,所以做全局光照是必然的,回顾我们在GAMES101里的Blinn-Phong模型,它的全局光照是做法是把间接光照ambient当成一个常数,然后假设场景所有地方所受间接光相同并且和Normal也没有任何关系,但显然,这是非常不准确的做法。 

[Image courtesy of Prof. Henrik Wann Jensen]

在实时渲染中,人们指的全局光照中的所谓间接光照,指的就是光线比直接光照多弹射一次的间接光照,而不是弹射很多次的,如上图所示。

Reflective Shadow Maps (RSM)

(1)Idea

[Image courtesy of Prof. Henrik Wann Jensen]

那么回顾我们在GAMES101里面提到的,在P点考虑接受的光照,有从光源接收到的的直接光照那就是光源的直接光照,有从Q点接收到的间接光照,那也就是Q点接收光源的光后反射到自己的光就好像Q点也是一个光源一样。

所以实际上我们并不区分哪些是直接照到的,哪些是反射来的,而是把Q当作次级光源来计算。

如上图所示,太阳标记表示被直接光照照到的部分,它们在下一次弹射的时候将被当作次级光源去照亮其它物体。 

如上图,p点接收不到光源的直接光照,但可以接收到第一次获得的次级光源的光照,然后被照亮。

(2)Key Observations 

有了思路,我们需要解决中间的一些问题

• 首先,我们怎么知道光源直接照到了哪些地方呢?

显然我们一下就可以想到借助Shadow Map。这个时候从Shadow Map上的每个像素对应的场景中的Area都会被当成次级面光源去照亮点p。

• 其次,我们怎么知道一个次级面光源对着色点(点p)的光照贡献呢

对光源直接采样

我们想到在GAMES101介绍蒙特卡洛积分对半球采样的时候,我们当时说因为会导致浪费许多路径,所以我们改写了渲染方程,把对立体角的积分改成了对光源上面积dA的积分,直接采样光源避免了浪费。而在这里我们同样可以采取这种方法,在p点对所有有贡献的次级光源采样即可。

但这里有一个问题,我们在p点求各个次级光源的贡献,实际上我们是以p点作为了观察点,而不是我们的Camera,所以我们如果不知道出射方向,那就没法计算着色了。但是这里我们会做一个假设,我们假设所有的反射物(reflector)都是Diffuse的,这样就和观测方向没有关系,我们从p点还是从Camera看都是相同的。但注意,我们不需要假设接收物都是也是Diffuse的,也就是说虽然次级光源被我们认为是Diffuse,但是点p并不需要认为是Diffuse的。

对光源面积积分的渲染方程

如上图所示是我们之前提到的改写后的渲染方程,从立体角积分变成了对面积的积分,其实如果我们如果知道了Shadow Map上的一个像素对应的面积就可以直接计算了,不需要积分dA。 现在需要知道的就是,从q点打到p点的Radiance是多少,也就是上图所示的Li(q→p)项。

由于之前假设的q点是Diffuse的,那么q点的BRDF就很好求,就是ρ/π ,我们之前推导过。那出射的Radiance自然就是BRDF乘以Irradiance,Irradiance直接用光源的Φ除以单位面积dA就可以了。并且dA可以消掉,于是得到最终的公式结果如上图白框所示。(这里的白框里的公式是Paper的原公式,可以看到闫令琪老师非常自信的把它的4次方改成了2次方,并且说Paper上绝对写的是错的立flag吃键盘,据闫令琪老师说这个错的原因在于无脑加了一次平方衰减,而实际上这个衰减的假设是错的)

这里仍然存在这问题,首先我们发现改写后的渲染方程的Visibility项无法得到,我们不可能对每个次级光源和着色点之间都生成一张Shadow Map来判断可见性,于是人们直接放弃了Visibility项,就认为是可见的。

(3)Tips

RSM仍然有一些可以优化的点,比如我们之前提到的次级光源的Visibility项,以及根据法线判断哪些光源根本不可能对着色点有贡献,比如上图的在桌子上的次级光源(x-1,x-2)就不可能对x点有贡献。其次我们之前看到了,改写渲染方程有距离平方衰减项,所以一定距离范围外的次级光源我们自然也没必要考虑,因为太小了。

离着色点一定距离范围外的次级光源不考虑?我们自然不能对每个着色点p把Shadow Map上所有次级光源遍历计算距离再排序,再删除,这是很大的工程量,于是有了RSM另外一个大胆的假设。

我们目的是找到在世界坐标下距离着色点p距离近的一些点。于是我们把p点投影到Shadow Map上,然后在Shadow Map上离点p近的像素/深度接近的像素,我们就认为在世界坐标下距离也接近。这样就可以有效的加速这一过程。当然查询可能仍然很慢,我们可以随机采样,至于采样点的选取,采样点的数量,采样的权重分布,这些都可以借鉴PCSS等之前提到过的其它方法,这里因实际情况而有所不同,但我们可以知道的是,这种方法可以有效加速RSM。

(4)Summary

RSM相比于普通的Shadow Map多存储了什么呢?那无非是我们之前说思路的时候用到的哪些信息。Depth深度,这是Shadow Map原本就存储的。除此之外还有,世界坐标来判断距离(算Shading的时候需要使用),反射物的法线(计算cos项),光源的辐射通量。

GDC Vault - In-Game and Cinematic Lighting of The Last of Us

RSM的效果被用在手电筒上非常不错,而且因为手电筒覆盖范围较小,不需要太大的RSM,开销比较小 。

RSM的优点是比较容易实现,因为它本身其实就是Shadow Map。

那缺点也很容易想到,Shadow Map有的缺点它也有。有多少个直接光源就需要多少个RSM,所以多光源开销大。 其次我们说了,无法考虑Visibilty项,于是不考虑,所以不够真实。还有,RSM做了很多假设包括:反射物都是Diffuse,SM近似的世界空间坐标距离,这些都会对渲染质量有一定影响。最后RSM的采样率和质量的平衡问题,这是所有采样方法都有的问题。

参考

GAMES202_Lecture_07 (ucsb.edu)

Lecture7 Real-time GLobal Illumination (in 3D)_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/957479.html

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

相关文章

【进阶篇】MySQL的SQL解析原理详解

文章目录 0. 前言1. SQL解析过程1. 词法分析2. 语法分析4. 语法分析树5. MySQL语法分析树生成过程6. 核心数据结构及其关系7. SQL解析的应用 2. 参考文档 0. 前言 你是否已经深入了解了MySQL中 SQL解析过程,以及解析过程中每个环节扮演的具体角色?你是否…

Windows SQLYog连接不上VMbox Ubuntu2204 的Mysql解决方法

Windows SQLYog连接不上VMbox Ubuntu2204 的Mysql解决方法 解决方法: 1、先检查以下mysql的端口状态 netstat -anp|grep mysql如果显示127.0.0.1:3306 则说明需要修改,若为: : :3306,则不用。 在**/etc/mysql/mysql.conf.d/mysqld.cnf**&am…

软件测试之黑盒测试、白盒测试分别是什么?有什么区别?

软件开发过程中,为了保证软件质量和稳定性,必须进行全面而细致的测试工作,而黑盒测试和白盒测试正是两种常用的测试方法。 一、黑盒测试 黑盒测试是一种基于软件外部功能的测试方法。测试人员对待测试的软件系统,就像一个黑匣子…

uniapp-秋云图表 ucharts echarts 对比与关系

科普: 秋云图表库,包含二种配置属性对应二种js配置文件。 一种是 :echarts.js,一种是 : ucharts。 二者的配置属性不一样! ucharts和echarts对比 ucharts和echarts都是用于数据可视化的开源JavaScript库,它…

【高危】Apache Airflow Spark Provider 反序列化漏洞 (CVE-2023-40195)

zhi.oscs1024.com​​​​​ 漏洞类型反序列化发现时间2023-08-29漏洞等级高危MPS编号MPS-qkdx-17bcCVE编号CVE-2023-40195漏洞影响广度广 漏洞危害 OSCS 描述Apache Airflow Spark Provider是Apache Airflow项目的一个插件,用于在Airflow中管理和调度Apache Spar…

自动化机器学习Auto-Sklearn安装和使用教程

安装和使用 Auto-Sklearn Auto-sklearn 提供了开箱即用的监督型自动机器学习。从名字可以看出,auto-sklearn 是基于机器学习库 scikit-learn 构建的,可为新的数据集自动搜索学习算法,并优化其超参数。因此,它将机器学习使用者从繁琐的任务中解放出来,使其有更多时间专注于…

django/CVE-2017-12794XSS漏洞复现

docker搭建漏洞复现环境 漏洞原理看帮助文档 # Django debug page XSS漏洞(CVE-2017-12794)分析Django发布了新版本1.11.5,修复了500页面中可能存在的一个XSS漏洞,这篇文章说明一下该漏洞的原理和复现,和我的一点点评…

一种借助MYSQL递归CTE生成所有组合情况的实现方法

需求说明 有如下表和数据: Nname1户口2查询机构数过多3危险驾驶4多头用信 需要输出name里的所有组合情况,即单个值,两两组合,三个组合、四个组合。结果为2的n次方-1中情况,这里是15。 预期结果为: Com…

【OpenCV入门】第四部分——阈值

文章结构 阈值概述阈值处理函数二值化阈值处理二值化阈值处理反二值化处理 零处理低于阈值零处理超出阈值零处理 截断处理自适应处理Otsu方法 阈值概述 在PhotoShop里头,有一个工具可以快速抠出一幅图像中的轮廓,这个工具就是阈值。OpenCV也提供了阈值&…

springboot实战(二)之将项目上传至远程仓库

目录 环境: 背景: 操作: 1.注册码云账号 2.创建仓库 步骤: 1.注册完码云账号后,点击加号,新建仓库 2.输入项目名称和介绍,点击创建 3.复制仓库地址,你可以选择https协议或者…

ClickHouse进阶(五):副本与分片-2-Distributed引擎

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 📌订阅…

ssm+vue宠物领养系统源码和论文

ssmvue宠物领养系统源码和论文103 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 本课题是根据用户的需要以及网络的优势建立的一个宠物领养系统,来满足用宠物领养的需求。 本宠物领养系统…

抖音短视频账号矩阵seo分发系统--开发源代

1.抖音矩阵号/抖音短视频SEO矩阵系统开发及开发者思路分享: 短视频获客系统开发原型支持短视频智能批量剪辑、短视频多账号管理定时发布,短视频排名查询及优化,智能客服私信回复等,那么短视频seo系统开发时需要开发哪些功能呢?今天…

全能图片转文字:多功能图片转换工具

全能图片转文字是一款功能丰富的图片转文字软件,通过OCR文字识别技术能够轻松识别图片中的文字信息,并快速提取转换成文本格式。除了支持图片转文字,全能图片转文字还可以完成音频转文字、视频转文字、截图转文字等操作,轻松满足日…

时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比

时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 1.时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测; 2.单变量时间序列数…

春秋云镜 CVE-2018-20604

春秋云镜 CVE-2018-20604 lfdycms任意文件读取 靶标介绍 雷风影视CMS是一款采用PHP基于THINKPHP3.2.3框架开发,适合各类视频、影视网站的影视内容管理程序,该CMS存在缺陷,可以通过 admin.php?s/Template/edit/path/web………*…*1.txt 的方…

【ES系列】(一)简介与安装

首发博客地址 首发博客地址[1] 系列文章地址[2] 为什么要学习 ES? 强大的全文搜索和检索功能:Elasticsearch 是一个开源的分布式搜索和分析引擎,使用倒排索引和分布式计算等技术,提供了强大的全文搜索和检索功能。学习 ES 可以掌握如何构建复…

STM32实现FFT,求取幅度频谱

STM32实现FFT,求取幅度频谱 FFT不太对劲的理解 FFT的原理比较复杂,因为32使用FFT不用去管算法是如何运作的,我在这里就进行简单的介绍了。 因为是简单介绍,就只介绍下幅度频谱图,不考虑相位频谱图。 ​ FFT可以将一个…

管理类联考——逻辑——形式逻辑——汇总篇——知识点突破——综合推理

角度——重难点 综合推理条件优先级口诀 事实问题优先看,数量不定先计算。 半事实条件可分类,重复元素是关键。 题干如果多假言,就要优先做串联。 题干只有一假言,否后或者找矛盾。 特殊条件优先看,其他条件放后边。

Mybatis 插入、修改、删除

前面几篇我们介绍了使用Mybatis查询数据,并且也了解了如何在Mybatis中使用JDK的日志系统打印日志;本篇我们继续介绍如何使用Mybatis完成数据的插入、修改和删除。 如果您对查询数据和Mybatis集成JDK日志系统不太了解,建议您先进行了解后再阅…