当前课程知识点:移动图形概论 > 第七章 基于物理的渲染 > 7.3 PBR 的实现 > PBR 的实现
同学们大家好
今天我们继续介绍基于物理渲染的实现细节
今天的主要内容包括
实现基于物理的渲染用到的素材和素材的基本使用方法
演示中使用的素材可以分为四个不同的类别
一模型及相关纹理
二环境贴图纹理
三双向反射分布函数查找表
四全局照明纹理
大部分信息存储在纹理图像中
大大降低了着色器程序的复杂度
下面我们分别看一下这些素材
在我们的示例程序中
使用的最主要的素材就是头盔的模型
它是被渲染对象的网格结构
包括所有顶点的信息
接下来我们看一下反照率纹理
它是对象的正常基色或漫反射光下的颜色
这意味着
此纹理信息不包含任何阴影或定向光源信息
可以把它看做是对象在正常白光下的颜色
原始的素材是一个二维的正方形纹理数据
这里把它按照纹理贴图的方式
覆盖在模型表面
看起来更直观一些
这是粗糙度纹理
它用来描述物体表面的粗糙度或光滑程度
在基于物理的渲染中
粗糙度决定了物体表面如何发生镜面反射
同样我们把它作为单通道的颜色
作为纹理数据
覆盖在了模型的表面
回顾之前介绍过的BRDF函数
粗糙度对其中的DFG参数都有影响
在计算反射光线时会多次用到
金属性纹理决定应将材料看做是绝缘体还是导体
诸如木头和陶瓷之类的绝缘体
倾向于吸收和散射光从而产生漫反射
而诸如金属之类的导体则产生镜面反射
金属性可以是二值数据
也可以是0到1之间的一个系数
因此金属性决定了
应如何将漫反射光和镜面防射光的计算相结合
自发光纹理包含了物体表面上
任何自发光光源的信息
这类光源可以是LED和LCD显示器
在着色器程序运行完所有复杂的PBR数学运算之后
只需将自发光的分量添加到最终像素的颜色中
就可以实现自发光的效果
法线纹理用于描述物体表面的细节信息
它将法线向量的三个分量
作为颜色编码到纹理数据中
由于法向量都是基于表面的局部方向来定义
主要朝向是z轴方向
因此作为颜色表示时
其第三个分量也就是蓝色分量比较明显
整体看起来是一个蓝色的纹理数据
它可以用来描述原模型中没有定义的细节
可以通过法向量的方式表现对象上的凸起或凹陷
在获得漫反射产生的照明分量时
将使用从此纹理采样的表面法线信息来进行计算
使用法线纹理的方式可以降低模型的复杂度
如果没有法线纹理
更多的细节也就意味着更多的顶点
利用法线纹理可以定义每个像素的法线方向
增加了模型的细节信息
从这个对比图可以看出
使用500个三角形的简单模型
通过使用法线纹理之后
可以获得与使用
400万个三角形的同样模型的精细效果
环境光遮蔽纹理用来表达对象的不同区域
在环境光下的亮度
环境光遮蔽可以根据模型的几何结构预先计算
如果同样强度的光从各个方向照射到对象
则对象较外露的部分亮一些
而较封闭或遮蔽的区域暗一些
通常通过从对象表面上的点
向各个方向上投射光线来计算阴影量
光照射到对象另一部分的比例越大
该点将在环境光遮蔽下显得越暗
在光照处理的最后增加对此纹理的利用
可以大大提高渲染效果
这里列出了前面介绍过的全部模型相关数据
它们是 Khronos 工作组在网站上公开的开源模型
可以用来对算法进行验证
这个模型的名称是Damaged Helmet
接下来看环境贴图
环境贴图存储来自现实场景中的真实照片
既可以用来做3D纹理
也可以用来计算
后面的辐照度贴图和预滤波环境贴图
辐照度图通过环境贴图来计算
它记录了每个方向上的照度
可以对漫反射的情况进行计算
通过3D纹理可以很容易地进行采样
预滤波环境贴图是镜面反射计算中的第一项求和部分
代表镜面反射部分的光照信息
它根据粗糙度的不同
有不同级别的mip贴图
也可以作为3D纹理进行采样
BRDF查找表是镜面反射计算中第二项求和部分
可以使用粗糙度和视角对查找表进行采样
以确定F0的缩放比例和偏差
在着色器程序中
F0与缩放比例相乘
然后加上偏差计算求和的结果
最后我们看一看源代码中
这些数据分别对应哪些文件
在SDK中这些文件分布在不同的地方
但都在examples的assets目录下
我这里把它集中到一个目录里
其中bldflut是BRDF的查找表
DamagedHelmet是3D模型
然后名字中带Albedo的是反照率纹理
带emissive的是自发光纹理
带nomal的是法线纹理
名字中包含occlusionRoughnessMetallic那个是环境光遮蔽
粗糙度和金属性
三个标量数据组成的一个纹理
misty开头的三个文件分别是环境贴图
辐照度图和预滤波环境贴图的纹理
剩下的文件中
Satara开头的三个文件是另外一组环境贴图
sphere.pod是一个球体模型
cpp代码是程序源码
另外还包含四个着色器程序代码
同学们课后可以通过阅读这些代码
来了解程序实现的具体细节
好 今天的课程就到这里
谢谢大家
-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 中的实用工具介绍
-综合测试



