当前课程知识点:移动图形概论 > 第七章 基于物理的渲染 > 7.2 基于图像的照明 > 基于图像的照明
各位同学大家好
今天的课程我们继续来介绍基于物理的渲染
今天的主要内容将介绍基于图像照明的基本概念
和实现基于图像照明的软件实现方法
上节课我们介绍了基于物理的渲染技术
通过使用反射方程
可以很好地把光线的反射效果体现出来
但仅使用简单的光源模型
并不能实现我们之前展示的示例程序那样的效果
在那个代码中采用了基于图像的照明方式
它基于全局照明的想法
既3D场景中的一切都对物体的照明产生一定的影响
落在对象上的光不仅仅来自太阳等直接明确的光源
还来自场景中所有对象的反射光
基于图像的照明
使用一组图像来计算来自各个方向上的光
从而近似全局照明
基于物理的渲染和基于图像的照明
广泛应用于游戏行业
在上一个演示中就采用了环境贴图的形式
对现实中某个场景中的所有光信息进行计算
这种方法似乎可以带来理想的效果
但计算过于复杂
对物体的每一个点都要考虑所有方向上的光
也就是要对上节中提到的反射方程
进行半球面上的积分
因此无法在动态场景中对此进行实时计算
在实际应用中
一般使用静态预计算的基于图像的照明
这样在各种GPU甚至低端GPU上
可以实现基于物理的渲染
环境贴图存储了来自现实场景的真实光线信息
此图象可提供对象周围场景的360度视角的光照信息
因此可以同时捕捉光的强度和方向
我们在程序运行时可以轻松地对此纹理进行采样
以确定照射到对象的光
也就是我们利用环境贴图中采样到的颜色亮度信息
作为光强进行照明计算
再仔细回顾一下我们的反射方程
计算一个点上的反射光线
需要对一个半球面上的全部入射光线进行积分
虽然入射光线强度可以通过环境贴图获得
但BRDF函数参数很多
计算又复杂
再加上积分的运算
无法达到实时的要求
而可以使用的优化手段
主要有两点
一是对函数进行一定的简化
二是对其中不依赖于光线出射角度的部分
进行离线计算
减轻渲染时的计算压力
由于BRDF函数中漫反射部分只是一个常数
因此这部分的反射光线仅与物体表面的法线方向有关
因此
可以将每个法线方向上的入射光强预先计算出来
组成一个3D纹理数据
前面的环境贴图经过预计算的结果如图所示
称为辐照度图
这里只展示了环境贴图6个面中的一个
它可以直接利用texture函数进行采样
有了这个信息
计算漫反射部分就不需要积分了
而仅需要一次纹理采样
而镜面反射部分我们可以使用一种称为
“拆分 求和”的近似方法对大部分计算进行简化
拆分后的结果是这个公式
此方法将计算拆分为两个积分的乘积
因为积分运算在计算机中
一般采用求和的方式完成
所以前边把这种简化方式叫做拆分求和
这两次求和可以分别计算
然后相乘得到最终的镜面反射颜色
前一个求和部分称为预滤波环境贴图
后一个求和部分还可以继续简化
预滤波环境贴图与漫反射的辐照度图类似
只是增加了粗糙度级别
随着粗糙度的增加
镜面反射越来越分散
这意味着光滑的表面
可以完美的反射周围的环境
而非常粗糙的表面会产生模糊的
几乎是漫反射的环境图像
这里的图像示例给出了此过程
在贴图单个方向上的结果
但实际的反射纹理将是一个立方体贴图
我们可以看到随着粗糙度的增加
用来计算反射的纹理图像也会更加模糊
这里我们把不同粗糙度的图像缩放到同样大小
实际在使用的时候它们将组成一个mip贴图
分辨率依次减半
第二个求和部分经过合理的简化
可以将积分分成两部分
其中F0是菲涅尔公式里面的一个常数
可以被独立出来
这两个积分可以分别计算
输入参数都是粗糙度和法线与视角夹角
输出值分别对应F0的缩放比例和F0的偏差
拆分求和中的第二个求和
既不依赖于环境也不依赖于模型
因此对于任何实现都是一样的
它可以储存在一个2D查找表中
体现为一个纹理数据
红色分量保存的是对F0的缩放值
绿色分量保存的是F0的偏差值
这些预计算纹理的存在意味着
在运行时着色器仅需要如下几个步骤
一通过采样预滤波的环境贴图
获得拆分求和中的第一个和
二通过计算F0并应用BRDF查找表中的缩放比例和偏差
来确定第二个和
三将这两个值相乘可得到镜面反射颜色
四利用采样辐照度图以获得环境中的漫反射光
五将漫反射光乘以反照度纹理数据
以确定漫反射颜色
六乘以与金属性有关的因数以获得漫反射的比例
七将漫反射的颜色和镜面反射的颜色相加
以获取最终的像素颜色
如您所见
上述任何步骤中均不涉及复杂的计算
大部分计算已转为在纹理中预先完成
这样一来
即使在低端硬件上也可以实现基于物理的渲染
这里有两个概念
反照度纹理 金属性
它们将会在下一个小节进行介绍
好 今天的课程就到这里
谢谢大家
-1.1 课程基本情况介绍
--课程基本情况介绍
-1.2 GPU 相关基础知识
-1.3 OpenGL ES 技术发展历史
-1.4 PowerVR SDK 安装和使用
-第一章测试
-2.1 OpenGL ES 基本概念
-2.2 编写第一个图形程序
-2.3 主要 API 介绍
-第二章测试
-3.1 矢量和矩阵知识基础
-3.2 旋转与位移变换
--旋转与位移变换
-3.3 OpenGL ES 变换基础
-第三章测试
-4.1 着色器编程语言介绍
-4.2 着色器编程实例
--着色器编程实例
-第四章测试
-5.1 颜色的基本概念
--颜色的基本概念
-5.2 纹理素材的使用
--纹理素材的使用
-5.3 立方体纹理
--立方体纹理
-第五章测试
-6.1 光照的基本概念
--光照的基本概念
-6.2 光源模型
--光源模型
-6.3 使用着色器渲染颜色
-6.4 反射与折射
--反射与折射
-第六章测试
-7.1 基于物理渲染的基本概念
-7.2 基于图像的照明
--基于图像的照明
-7.3 PBR 的实现
--PBR 的实现
-第七章测试
-8.1 Vulkan 介绍
-8.2 SDK 中的实用工具介绍
-综合测试


