当前课程知识点:移动图形概论 > 第六章 光源与光照 > 6.3 使用着色器渲染颜色 > 使用着色器渲染颜色
各位同学大家好
今天的课程将介绍
影响物体颜色的外界条件
今天的主要内容将介绍
影响物体颜色的光照环境等多种因素
和如何有效的利用这些因素
对物体颜色进行计算
在我们之前的课程中
已经介绍了漫反射和镜面反射
这些都是经典光照模型的一部分
在经典光照模型中
物体的总光量是由环境光 漫反射和镜面反射
三部分叠加而来的
我们前面的示例代码中
没有考虑环境光
那会带来什么问题呢
看一下运行效果
当视角转到光源的垂直方向时
可以看到
物体的背光表面是纯黑色的
没有照明也就看不到任何颜色
而真实的环境会在各个方向存在照明
即使在光源的阴影里也能看到淡淡的色彩
为了实现类似的效果
就可以在光源模型中增加环境光
这个环境光可以简化为
是没有方向 均匀的照明
有了环境光就不会出现纯黑的表面
视觉效果会更好一些
另外
实际的光源还可以是有颜色的
当用带有颜色的光照射物体的时候
不光物体的表面亮度会变化
颜色也会有相应的变化
例如
使用红色的光源照射白色物体的时候
物体的表面也会呈现出红色
这个颜色的变化可以由各种光强分量来改变
环境光
漫反射和镜面反射都可以具有不同的颜色
之前的示例代码中都简单的认为这些光是白光
这是前面的点光源顶点着色器代码
在统一变量中
增加了光源的颜色变量
LightColor
将漫反射颜色
DiffuseLight发送到片段着色器
而不是仅仅发送亮度
diffuseLight是这个程序漫反射增加的部分
它用光源的颜色与漫反射光强相乘
增加了光源颜色的属性
这是上节课介绍的点光源片段着色器代码
这里计算 diffuseLight 漫反射光的时候
除了增加了光源的颜色
还加上了环境光的分量
这个分量通过ambient统一变量传入
在计算高光的时候
也利用了光源的颜色属性
之前的代码使用vec4(1.0) 替换 lightColor变量
相当于光源是纯白色
在计算光源强度的时候
另外一个需要考虑的因素就是衰减
对象离光源越远
落在对象上的光的强度就越弱
为了真实地模拟光源
需要适当地计算每个光源的衰减情况
定向光源通常不使用衰减因数
因为光源比较遥远
可以认为在整个场景中强度没有变化
同学们可能还记得在物理课上学过光的能量
同光源距离的平方成反比
但在实际环境中由于存在环境反射等多种作用
通常在着色器代码中使用的公式是屏幕上展示的这个
其中Ac是常量衰减因子
AI是线性衰减因子
Aq是二次衰减因子
而dist是点与光源之间的距离
在程序中 这三个衰减因子是常数
通过统一变量传递给着色器
在计算片段最终颜色的时候
还可以考虑物体的材料属性
我们之前用到的材料颜色
可以认为是一种材料属性
如果考虑到材料表面会有不同的镜面反射率
通过类似的方法可以把反射率数据作为一种特殊的纹理传入着色器
对每个片段计算与反射率相关的反射数据
这样会获得更加真实的显示效果
这种情况下
片段的颜色就由屏幕上这个公式来计算
镜面反射的部分增加了新的系数
经典光照模型在大部分情况下可以高效的完成令人满意的图形渲染效果
但由于它的算法比较简单
还是具有很多的局限性
比如没有考虑物体的影子
当场景中存在多个物体时
部分物体的光照可能会被遮挡
另外环境光的建模也过于简单
比如红色物体在光源的照射下会反射红光
那么它旁边的物体也会呈现一些红色
这在经典模型中也没有考虑
第三点是在经典模型下
物体都过于平滑
显得不够真实
还有
就是没有对自发光物体进行建模
对于自发光物体仅仅提高亮度还不够
还必须增加一些光晕效果
才更加符合实际情况
好 今天的课程就到这里
谢谢大家
-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 中的实用工具介绍
-综合测试

