一个模型受光照后最终呈现的颜色,由三种因素决定:光的种类、物体表面的材质。
对以上三种影响因素进行分类:常见的光被分为4种、物体表面的材质通常受3种因素影响(漫反射、镜面反射、表面纹理)。
光的定义有很多参数可以调整,而且一个三维场景中还可以放入很多种类的光、影响材质的漫反射和镜面反射也有很多参数可以调整。所以,最终呈现出的效果是可以有很多种情况的。
4种常见光分别为:
- 环境光:影响因素为强度、颜色。这种类型的光源来自空间中的任何地方,并以相同的方式照亮所有物体。
- 点光源:影响因素为强度、颜色、位置、衰减因素。
- 聚光灯:影响因素为强度、颜色、位置、衰减因素、方向、夹角。(聚光灯就是在点光源的基础之上加上了方向和夹角的概念)
- 方向光:影响因素为颜色、方向、强度。
下面基于joml(Java OpenGL Math Library)对上面的光进行抽象:
在对各种光进行抽象时,有一些属性被定义为向量,有一些属性被定义为float类型的常数,是由于光的数学定义。
-
光的数学定义可以参考这篇文章
WebGL笔记(二)_光 -
关于这些光是如何结合模型顶点和法向量在着色器中进行计算的,参考这篇文章OpenGL中环境光、漫反射、镜面反射对光线的影响
环境光
环境光就是一个三维的向量Vector3f类型的变量,可以直接传给着色器程序。
点光源
public class PointLight {
//点光源的颜色
private Vector3f color