1. 程式人生 > >lwjgl開發中基於joml對opengl中環境光、點光源、聚光燈、方向光的定義。

lwjgl開發中基於joml對opengl中環境光、點光源、聚光燈、方向光的定義。

一個模型受光照後最終呈現的顏色,由三種因素決定:光的種類、物體表面的材質

對以上三種影響因素進行分類:常見的光被分為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;
    
}