当前课程知识点:移动图形概论 > 第七章 基于物理的渲染 > 7.1 基于物理渲染的基本概念 > 基于物理渲染的基本概念
各位同学大家好
今天给大家介绍
目前比较主流的基于物理的渲染技术
今天的主要内容包括基于物理渲染技术的基本原理
和实现基于物理渲染的基本流程
这是最新的照明技术之一
因此了解如何在移动硬件上实现它十分有用
基于物理的渲染也就是PBR
是一组基于对象的真实材料属性
来模拟光照与对象如何发生作用的技术
这些材料属性包括反照率
也就是通常意义上的颜色
还有粗糙度和反射率等
所有这些属性都会改变光线在对象上反射的方式
这些属性通常被编码为纹理数据
着色器程序将在运行时对其采样
基于物理的渲染
可以获得非常逼真的照明效果
下面我们看一个演示
这个演示来自SDK中的示例程序
我们可以看到场景中的头盔上面有各种各样的细节
似乎可以看出各个部分不同的组成材料
有些是金属有些是橡胶
还有一些是玻璃
部分材料可以对环境反射
有些还可以自发光
各种细节的处理都非常的真实
这就是基于物理的渲染技术
可以达到的效果
基于物理的渲染技术的基本原则有以下几点
一采用基于微表面模型对物体进行建模
也就是假定物体的表面是由无数不同
朝向的微小表面所组成
二光线的入射与出射符合能量守恒定律
第三点物体表面的反射方程基于物理原理进行建模
也因此被称为基于物理的渲染
我们先来看一下反射方程
基于物理的渲染技术认为
物体表面任何一点的反射光线
都与以这个点为球心的半球方向上的全部光照有关
因此
图中P点在欧米伽零方向上的出射光线
可以用如下的公式来表示
这个公式就是反射方程
它对整个半球面进行积分
其中Li是在欧米茄i方向上的入射光强
而f_r是我们后面要介绍的双向反射分布函数
反射方程通过积分的方式
考虑全部的光照效果来计算反射光线
获得更加真实的视觉效果
双向反射分布函数
英文缩写为BRDF
简单来说
它决定了光如何从物体表面反射出来
它有三个主要参数
一个是模型上的点
另外两个分别是入射光线和出射光线
这个函数将告诉我们从一个入射方向
照射到表面上的光有多大比例
沿另外一个观察方向反射
最简单的BRDF就是常量
也就是说在任何方向上反射的光是固定强度
漫反射就属于这种情况
物体的表面在所有的方向上反射的亮度都相同
大多数的物体表面都比较粗糙
达不到镜子般的完美光滑程度
我们需要的BRDF函数应该可以根据物体表面的粗糙度
来改变光线反射的效果
在前面的演示中
我们使用了Cook-Torrance微面镜面反射模型
它基于微表面模型
就是把粗糙的表面近似为一系列的微面
这些位面可以视为表面上很小的凸起和凹陷
可以像镜子一样绕其局部表面法线完美的反射光线
其中每一个微面的表面法线的方向有所不同
这意味着入射光将根据其照射的微面
沿略微不同的方向反射
微面表面法线的分布将根据表面的粗糙度而变化
这里的粗糙度是物体属性的一个重要参数
物体表面越粗糙
其表面法线的变化范围越大
镜面反射的分量变得越分散
对于非常粗糙的表面镜面反射开始近似散射光
微面模型可以模拟大量微面的镜面反射的累积影响
为了便于计算
BRDF可以分成漫反射部分
与镜面反射部分
其中漫反射部分为常量
其中的π是积分归一化因子
而镜面反射部分采用Cook-Torrance模型
拥有D F G三个组成部分
分别对不同的物理性质进行建模
其中D参数是微表面的分布模型
它决定了有多少微表面与半程向量的方向相同
这个模型的输入参数是半程向量 法向量和粗糙度
它的输出是镜面反射部分的相对面积
这个图展示了不同粗糙度的球体
在D参数影响下的反射效果
粗糙度0.1时高光面积很小
粗糙度1.0时变为完全的漫反射
G参数是粗糙度的几何模型
粗糙度高会使得微表面互相遮挡
它的输入包括光线的方向
视线方向 法线方向和粗糙度
它的输出是被遮挡微表面的相对面积
这个图展示了不同粗糙度
在G参数影响下的光照效果
当粗糙度比较高时
由于遮挡的效果使得物体表面会显得更暗一些
F参数根据菲涅尔反射方程建模
它基于物理上的菲涅尔效应
不同的入射角度的光
其反射率会有不同
入射光与法线夹角越小反射率越低
与法线夹角越大
其反射率会越大
例如你站在湖边低头看脚下的水
你会发现水是透明的
反射不是特别强烈
如果你看远处的湖面
你会发现水并不是透明的
反射非常强烈
回到这个模型
它的输入参数有F0
视线方向和法向量
它的输出是反射光线与折射光线的比率
F0是反射表面的一个属性
称为垂直入射的镜面反射率
它是体现材料属性的重要参数
可以用rgb3个分量表示
例如这里列出了材料为铜
或者塑料的不同F0值
如果场景中有多个点光源
那么根据反射方程
积分退化为叠加
只需将多个光源的反射情况分别计算
然后加在一起就可以了
下节课我们将继续介绍全局光照的情况
好 今天的课程就到这里
谢谢大家
-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 中的实用工具介绍
-综合测试
