当前课程知识点:移动图形概论 > 第六章 光源与光照 > 6.4 反射与折射 > 反射与折射
各位同学大家好
今天要给大家介绍
图形渲染中的反射和折射
今天的主要内容包括
对镜面反射的建模
也就是反射现象
还有对透明介质的建模
对应折射光的计算
反射也就是镜面反射
与我们前边讨论过的高光不同
这里是纯粹的镜面反射
也就是说要对镜子的表面进行建模
物理世界中
玻璃和金属都有镜面反射的特质
是非常常见的材料
在数学上表示反射
可以用入射矢量
相对于入射点的法线方向
改变自己的方向
在屏幕上的例子中
向量e是入射光
r是出射光
它们相对于法向矢量n的夹角
都是θ
这是几何光学中的基本的反射定理
根据刚才介绍的反射原理
从相机到物体顶点的向量e
是视线向量
n是顶点的法线
这样可以得到反射向量r
由于完全的镜面反射
相机中从这个顶点处看到的颜色
就是向量r所指的方向看到的颜色
而这正好可以和立方体纹理相对应
根据反射向量r
就可以将其
用作立方体贴图的3D纹理坐标
在屏幕上展示的示意图中
r矢量照射3D纹理的负x面
图中用红色方块表示
利用这种计算方法
我们就可以在物体对应的顶点
渲染出环境的反射效果了
我们来看一下具体的着色器代码
这里是顶点着色器的例子
输入的属性有顶点的位置和法线
统一变量包括
模型 视图 投射 矩阵
mvp matrix
模型视图矩阵mv matrix
模型视图逆转置矩阵mvit matrix
输出变量只有用来做3D纹理坐标的
反射向量reflect dir
顶点位置
照常通过模型视图投射矩阵变换到场景中
回顾法线变换的知识
法线通过模型视图逆转置矩阵
进行变换
以确保法线方向正确
然后用normalize进行了归一化
接着通过使用模型 视图矩阵
变换顶点位置
这样可使所有的计算都在视图空间
也就是相机空间中
因为相机位于原点处
这个向量同时也是视线向量
最后在视图空间下
根据法线方向
计算反射的视线向量
然后将其发送到片段着色器
在片段着色器获取3D纹理
并进行照明的后续计算
回顾一下这里用到了
着射器程序函数
reflect
它用于计算入射向量l
绕法线向量n的反射向量
其中法线向量n
必须为单位长度
这也是前面代码中
使用normalize原因
片段着色器的代码就比较简单了
它的输入有立方体贴图3D纹理
cubemap
还有来自片段着色器的反射向量
reflect dir
具体代码只有使用
texture cube函数
利用反射向量计算此片段的颜色
在16号示例程序中
片段着色器的编写
与前面的代码有些不同
首先有关反射的计算
都在视线空间进行
光照的计算则在视图空间进行
在光照中反射部分
叠加了反射和高光两个分量
而在其他的部分
还加入了光线衰减的因素
算是综合了前面介绍的全部知识
下面看一下运行的效果
可以看到三角形在旋转过程中
高光点的移动
反射面转过来之后
可以看到除了反射了周围的环境
还加入了高光
而且高光的面积
明显要小于非镜面表面的高光面积
代码中通过增加额外的幂指数计算
来获得这个效果
折射是指光线经一种物质
进入另一种物质时
发生偏折的现象
物理的概念大家应该都比较熟悉
用向量来表示
就是图中展示的
入射向量e
相对于分界面的法向量n
进行折射
根据设定的折射率
得到折射向量r
我们这里使用的折射率是相对折射率
可以根据两种材料的折射率比值
计算得出
例如光从空气进入玻璃
那么折射率为
1.0除以1.52为0.658
计算完折射向量r后
就可以将其用作
立方体贴图的3D纹理坐标
按照与反射相同的方式
对物体的表面进行渲染
这里列出了
计算折射的顶点着色器代码
与前面的事例相比
这里增加reflect dir变量
作为折射方向矢量
reflect dir的计算
使用了reflect函数
使用空气到玻璃的折射率
0.658计算反射方向
再来回顾一下
着色器程序中
reflect函数的定义
给定入射向量l
法线向量n
和相对折射率θ
使用这个函数
可以获取折射向量
其中法线向量n
也同样必须为单位长度
与之对应的片段着色器程序
和反射情况的基本相同
只是输入的变量名
变成了折射向量
好 今天的课程就到这里
谢谢
-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 中的实用工具介绍
-综合测试