OpenGL的環境光、點光源、聚光燈、方向光、材質的定義。
阿新 • • 發佈:2018-11-16
一個模型受光照後最終呈現的顏色,由三種因素決定:光的種類、物體表面的材質。
對以上三種影響因素進行分類:常見的光被分為4種、物體表面的材質通常受3種因素影響(漫反射、鏡面反射、表面紋理)。
光的定義有很多引數可以調整,而且一個三維場景中還可以放入很多種類的光、影響材質的漫反射和鏡面反射也有很多引數可以調整。所以,最終呈現出的效果是可以有很多種情況的。
4種常見光分別為:
- 環境光:影響因素為強度、顏色。這種型別的光源來自空間中的任何地方,並以相同的方式照亮所有物體。
- 點光源:影響因素為強度、顏色、位置、衰減因素。
- 聚光燈:影響因素為強度
- 方向光:影響因素為顏色、方向、強度。
下面基於joml(Java OpenGL Math Library)對上面的光進行抽象:
在對各種光進行抽象時,有一些屬性被定義為向量,有一些屬性被定義為float型別的常數,是由於光的數學定義。
-
光的數學定義可以參考這篇文章
WebGL筆記(二)_光 -
關於這些光是如何結合模型頂點和法向量在著色器中進行計算的,參考這篇文章OpenGL中環境光、漫反射、鏡面反射對光線的影響
環境光
環境光就是一個三維的向量Vector3f型別的變數,可以直接傳給著色器程式。
點光源
public class PointLight {
//點光源的顏色
private Vector3f color;
//點光源的位置
private Vector3f position;
//點光源的強度
private float intensity;
//點光源的衰減
private Attenuation attenuation;
}
//點光源的定義裡面提到的光衰減定義:這個物件的三個係數,只是為了著色器中在計算衰減時更加方便和靈活。
//這三個引數完全可以抽象為一個係數,只要著色器算出的最終顏色上乘以該係數即可。
//這只是大多數情況下的光衰減定義。
public static class Attenuation {
//連續係數
private float constant;
//線性係數
private float linear;
//衰減係數
private float exponent;
}
聚光燈
由於聚光燈是基於點光源的基礎上,所以聚光燈的定義可以將點光源作為自身的一個屬性。
//聚光燈
public class SpotLight {
//點光源
private PointLight pointLight;
//方向
private Vector3f coneDirection;
//錐形體的夾角
private float cutOff;
}
方向光
//方向光的定義
public class DirectionalLight {
//顏色
private Vector3f color;
//方向
private Vector3f direction;
//強度
private float intensity;
}
光源彙總:
在一個三維場景中,前面提到的光源可以同時放在一個場景中、點光源和鐳射燈也可以被放入場景中很多次,所以可以對三維場景中的全部光源進行整體抽象。可以如下:
//場景內全部的光
public class SceneLight {
//環境光
private Vector3f ambientLight;
//點光源陣列
private PointLight[] pointLightList;
//聚光燈陣列
private SpotLight[] spotLightList;
//方向光
private DirectionalLight directionalLight;
}
材質(漫反射和鏡面反射)
public class Material {
//如果被環境光照射呈現的顏色
private Vector4f ambientColour;
//漫反射係數(4維向量)
private Vector4f diffuseColour;
//鏡面反射係數(4維向量)
private Vector4f specularColour;
//反射率
private float reflectance;
//模型表面的紋理
private Texture texture;
}
//材質物件中的紋理抽象Texture
public class Texture {
//呼叫glGenTextures()函式返回的值
private final int id;
//紋理圖片的寬度
private final int width;
//紋理圖片的高度
private final int height;
}