Phong着色算法将模拟光对模型中每个顶点的影响。所以这个算法没法考虑阴影,它只会计算应用于每个顶点的光线,而不考虑顶点是否位于阻挡光线的物体后面。但是,正因为如此,这是一种非常简单快速的算法,可以提供非常好的效果。
关于光的种类可以参考这篇文章OpenGL的环境光、点光源、聚光灯、方向光、材质的定义,本文主要介绍点光源、聚光灯、方向光在Phong算法下物体的效果。
Phong算法中影响光照的三个因素
- 环境光(Ambient):可以理解为现实中的白天的室内,白天在室内我们能看的见物体,但是并没有感知光线的方向,其实是因为太阳离我们太远了,导致我们周围的光线强度都是一样的。
- 漫反射(Diffuse):面向光源的表面更亮。
- 镜面反射(Specular):模拟光在抛光或金属表面的反射
其实最终我们就是要计算出一个影响颜色的因子,在执行片段着色器程序时用这个变量fragColor
去乘以该因子,进而根据接收的光线将颜色设置得更亮或更暗。将场景中对其他光的影响因素环境光、漫反射、镜面反射分别叫做A、D、S,则计算那个影响颜色的因子可以用下面公式来表示。
- 如果模型没有纹理,将按照下面这个公式去算: