1. 程式人生 > >OpenGL的環境光、點光源、聚光燈、方向光、材質的定義。

OpenGL的環境光、點光源、聚光燈、方向光、材質的定義。

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

對以上三種影響因素進行分類:常見的光被分為4種、物體表面的材質通常受3種因素影響(漫反射、鏡面反射、表面紋理)。

光的定義有很多引數可以調整,而且一個三維場景中還可以放入很多種類的光、影響材質的漫反射和鏡面反射也有很多引數可以調整。所以,最終呈現出的效果是可以有很多種情況的。

4種常見光分別為:

  • 環境光:影響因素為強度顏色。這種型別的光源來自空間中的任何地方,並以相同的方式照亮所有物體。
  • 點光源:影響因素為強度顏色位置衰減因素
  • 聚光燈:影響因素為強度
    顏色位置衰減因素方向夾角。(聚光燈就是在點光源的基礎之上加上了方向和夾角的概念)
  • 方向光:影響因素為顏色方向強度

在這裡插入圖片描述

下面基於joml(Java OpenGL Math Library)對上面的光進行抽象:

在對各種光進行抽象時,有一些屬性被定義為向量,有一些屬性被定義為float型別的常數,是由於光的數學定義。

環境光

環境光就是一個三維的向量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;
}