当前课程知识点:移动图形概论 > 第六章 光源与光照 > 6.1 光照的基本概念 > 光照的基本概念
同学们大家好
今天的课要给大家介绍一下照明
今天的主要内容
包括OpenGL ES中照明的基本概念
定向光源和点光源等模型的介绍
特别介绍漫反射照明的编程方法
在现实世界中
如果没有照明
那么一切都是黑暗的
而在我们前面的部分示例代码中
例如08号示例代码
我们没有考虑照明
依然可以看到三角形的颜色
只是无论三角形如何旋转
看上去颜色都一样
这与现实世界是有差别的
因此
如果适当的考虑照明
会增加物体显示的真实感
在OpenGL中
有关照明的计算
都需要通过评估有多少光会落到对象的特定面上来完成
而这个计算通常要使用对象的法线方向
计算照明时
必须确保使用正确的位置坐标和法线方向
只有当所有位置都位于同一坐标系统中时
才可以进行照明计算
而只要保持一致
使用哪个空间都可以
视图空间最符合用户看到或者感受到的情形
使用起来最方便
因此
一般计算照明都在视图空间进行
使用视图空间还有一个好处
即相机或眼睛位于原点处
视线的方向就是位置的坐标矢量
我们首先看一下漫反射的情况
漫反射光分量
表示被对象的材料反射的散射光
如这个图片展示的
同等强度的光
当倾斜照射时
覆盖的面积要大一些
平均下来单位面积获得的光就会少
因此看起来就会暗一些
用数学的方式来表达
就是计算光在法线方向上的投影
这可以使用点乘运算实现
也就是
模型表面的明亮度=光强矢量和法线矢量的点乘
注意
这里的两个矢量都是单位矢量
因此获得的明亮度是小于等于1的值
12号示例代码使用定向光源来演示漫反射的情况
定向光源很简单
因为指明了光源的方向
无需计算该方向
不过
这将导致照射到平面表面的光量是相同的
该照明模型
可以用来代表遥远的光源
例如太阳光的照射
这里是12号例程中顶点着色器的代码
并不完整
只保留了相关的部分
这里的输入
有顶点的法线信息inNormal
还有两个统一变量MVITMatrix
是用来进行法线变换的矩阵
LightDirection是传入的光线方向
在代码中
所有的计算
必须在统一的坐标系统中进行
我们这里使用了视图空间
首先
利用传入的法线变换矩阵计算了视图空间的法线方向transNormal
注意
这里矩阵的变量名MV
分别代表模型和视图空间变换
IT代表了逆转置
然后用dot函数计算transNormal和光线方向的点乘
注意这里传入的光线方向是指向光源的矢量
因此这里计算的时候加了负号
另外由于亮度不能是负值
这里还使用max函数
保证
计算的结果最小是0.0
传递到片段着色器的亮度数值
是对每个片段插值获得的
如果使用纹理
就可以用亮度值与查找的纹理数据相乘作为片段的最终颜色
注意
这里的纹理坐标使用texture_or_color属性变量的gb分量
对于不使用纹理的情况
就用亮度值与颜色值相乘
由于传入的颜色数据只有3维
这里补充1.0作为Alpha通道的值
运行这个示例程序
可以注意到随着模型的旋转
模型表面的亮度也会变化
这里可以留意立方体的几个表面
顶面由于与光线的角度始终不变
因此亮度也没有变化
除了前面介绍的定向光源模型
常见的模型还有点光源
点光源将向所有方向均匀辐射光强
因此
需要为对象上的每个点计算光源的方向
在视图空间
可以用光源的位置坐标与要计算的点的坐标相减
获得光源方向矢量
点光源照明模型一般用来建模近距离光源
例如灯泡的照明
另外一种常见的光源模型是聚光灯模型
聚光灯光源将采用与点光源相似的方式辐射光
但它的方向范围有限
它也是一种近距离的光源模型
例如
手持手电筒的照明
在给聚光灯光源模型建模的时候需要设定三个参数
一是光源的位置坐标
二是光源的方向向量S_dir
三是光源扩散的截至角S_angle
对于图中v点的光源方向向量L
与点光源的情况类似
可以用它的坐标和光源坐标相减获得
通过L的反向向量-L
与S_dir的点积
可以获得出射光线与S_dir的夹角
这样就可以判断其是否在出射光的光锥内
一般情况下
聚光灯光源的光强不是均匀的
S_dir方向的光强最大
随着与S_dir夹角增大
光强曾指数规律衰减
好 今天的课程就到这里
谢谢大家
-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 中的实用工具介绍
-综合测试


