lwjgl開發中基於joml對opengl中環境光、點光源、聚光燈、方向光的定義。
阿新 • • 發佈:2018-12-16
一個模型受光照後最終呈現的顏色,由三種因素決定:光的種類、物體表面的材質。
對以上三種影響因素進行分類:常見的光被分為4種、物體表面的材質通常受2種因素影響(漫反射和鏡面反射)。
光的定義有很多引數可以調整,而且一個三維場景中還可以放入很多種類的光、影響材質的漫反射和鏡面反射也有很多引數可以調整。所以,最終呈現出的效果是可以有很多種情況的。
4種常見光分別為:
- 環境光:影響因素為強度、顏色。這種型別的光源來自空間中的任何地方,並以相同的方式照亮所有物體。
- 點光源:影響因素為強度、顏色、位置、衰減因素。
- 聚光燈:影響因素為強度、顏色、位置、衰減因素、方向、夾角。(聚光燈就是在點光源的基礎之上加上了方向和夾角的概念)
- 方向光:影響因素為顏色、方向、強度。
下面基於joml(Java OpenGL Math Library)對上面的光進行抽象:
環境光
環境光就是一個三維的向量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;
}