Global IIIumination(GI)全局光照原理(一)3D空间全局光照

一、Global IIIumination(GI)全局光照基本概念

在这里插入图片描述
渲染方程告诉我们,全局光照=自发光+直接光+间接光。前两者很好求得,解全局光照就变成了先求解间接光。

在这里插入图片描述
理论上光可以在空间内无数次反弹,但在实时渲染中通常我们所说的间接光照只计算一次反弹。
在这里插入图片描述
如上图,我们可以把一切被直接光源照射到的物体当成新的光源(次级光源),从相机出发射线到P,P所接受的间接光照就是Q点反弹的光。
在这里插入图片描述
如上图只有直接光照,物体没被照射的地方就是黑的如P点。这些被照射的地方(小太阳)我们可以把它当成次级光源。
在这里插入图片描述
那么P点受到的光照就是从所有次级光源反弹给它的光照。

二、主流的全局光照方法:

3D空间方法:
在这里插入图片描述
屏幕空间方法:
在这里插入图片描述

三、Reflective shadow maps(RSM)反射阴影贴图 全局光照

如何确定次级光源?
在这里插入图片描述
这里我们用reflective shadow maps(RSM)反射阴影贴图来确定哪些物体被直接光源照亮,也就是确定次级光源。
为了计算辐射量,我们有个基本假设:
任何次级光源都是漫反射,因此向外的辐射都是均匀的。

辐射度量学:
在这里插入图片描述
Radiant Intensity辐射强度:从光源发出的光
Irradiance辐照度:落在A表面的光
Radiance辐射率:光沿着射线传播 的辐射功率。
在这里插入图片描述
反射阴影贴图比起阴影贴图不仅只存了Depth深度,还存了world coordinate世界坐标, normal法线, flux通量等。
在这里插入图片描述
RSM效果,通常手电筒的全局光照喜欢用RSM。
RSM优点就是好实现,缺点等同于shadow map:有多少直接光源就需要多少个reflective shadow maps;不去算间接光照可见性检查会有很多失真;假设任何次级光源都是漫反射也是不符合物理的。

四、Light Propagation Volumes (LPV)光线传播体积 全局光照

LPV由CryEngine在《孤岛危机》中首次引入,其原理就是将场景划分成Volume格子,计算次级光源反射出的光(红色箭头)有多少进入到格子P(黄色)?
在这里插入图片描述

1.第一步,RSM找到次级光源,如图小太阳:

在这里插入图片描述

2.注入,即将次级光源注入到每个Volume格子:

a.引擎上一般用3维纹理划分格子
b.找到每个格子包围的虚拟光源(次级光源发出的)
c.虚拟光源加起来得出每个格子的定向辐射量
d.SH球谐函数做压缩 SH来描述此格子里的光照信息

球谐光照:

球谐光照的实质是通过球谐函数的特性将预先计算好的球谐系数还原为光照信息:
通过球谐函数将场景的环境光Cubemap,例如天空球贴图、Volume格子、计算出球谐系数
需要光照信息的时候,再通过球谐函数和系数,还原出光照信息
通过设定球谐函数的级数,可以获得更高的还原度
通常游戏引擎渲染中,只需要三阶,即9个系数,也称SH9
在这里插入图片描述

3.传播,每个volume格子向它相邻的6个面传播到其他6个格子里,整体迭代四五次后趋于稳定。

在这里插入图片描述

4.最后一步 渲染,对于任意一个shading point 找到它所在的Volume格子,取格子内的SH光照进行光照着色。

在这里插入图片描述
但这样有个问题:如图P点是次级光源,无论如何都照亮不了对背面的q点,但因为我们把空间划分成Volume格子,而格子内的光辐射是同样的,那么q点经过错误计算也会被照亮,如图:
在这里插入图片描述
LPV这种缺陷叫做:光泄漏 。是由于格子比物体大照成的,可以通过动态自适应格子大小来解决。

五、Voxel Global Illumination(VXGI)体素全局光照

在这里插入图片描述
VXGI体素全局光照和RSM一样也是一个两趟Pass算法,LPV算4趟算法。VXGI和RSM有主要以下区别:

  • RSM的次级光源是像素(物体微小表面),而VXGI的次级光源被划分成了一个一个格子,而是有层级结构的格子(八叉树实现),我们称为体素。
  • RSM采样的是3D场景中的次级光源,VXGI则是由摄像机发射出射线打到shading point反射到哪些体素来确认间接光照。
    在这里插入图片描述

1.VXGI第一趟Pass:

被主光源直接照射的同样也是次级光源,区别于RSM的像素(物体微小表面)次级光源,VXGI是由八叉树分隔的立方体格子,每个格子记录次级光源的分布和格子内的表面的法线分布。
在这里插入图片描述

1.VXGI第二趟Pass:

如果shading point是光滑的表面,那么反射就是一个圆锥体
根据(不断增长的)圆锥体大小查询格子层次结构(体素)的光照信息
在这里插入图片描述
如果shading point是漫反射表面,那就反射多个圆锥体,找到对应范围内的格子体素进行相加:
在这里插入图片描述

相关推荐

  1. 【iOS ARKit】光照效果--光源

    2023-12-08 17:14:01       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 17:14:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 17:14:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 17:14:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 17:14:01       20 阅读

热门阅读

  1. 【android开发-20】android中notification的用法讲解

    2023-12-08 17:14:01       30 阅读
  2. [python高级编程]:01-数据结构

    2023-12-08 17:14:01       42 阅读
  3. 机器学习算法汇总--GBDT、XGBoost等

    2023-12-08 17:14:01       40 阅读
  4. c++的排序算法

    2023-12-08 17:14:01       29 阅读
  5. [linux] git lfs install 安装lfs

    2023-12-08 17:14:01       38 阅读
  6. redis的工具类详细

    2023-12-08 17:14:01       30 阅读
  7. 98765

    2023-12-08 17:14:01       34 阅读