OpenGL 渲染測試 2:材質

參考: https://learnopengl-cn.github.io/02 Lighting/03 Materials/

本貼意義: 只是記錄一些參考鏈接中的重點

材質

現實世界中有各種各樣的物體,它們對光的反射都各不相同(漫反射參數與鏡面反射參數不同)
如果我們想在 OpenGL 中模擬多種類型的物體,我們必須爲每個物體分別定義一個材質(material)屬性
這裏值得注意的是可以在 shader 中創建整個的結構體

#version 330 core
struct Material {
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    float shininess;
}; 

uniform Material material;

void main()
{    
    // 環境光
    vec3 ambient = lightColor * material.ambient;
    // 漫反射 
    vec3 diffuse = lightColor * (diff * material.diffuse);
    // 鏡面光
    vec3 specular = lightColor * (spec * material.specular);  
}

這樣一來我們就可以通過 uniform 變量 material 訪問這些屬性
但是結構體只是作爲 uniform 變量的一個封裝,想要填充這個結構體的話仍需要對每個單獨的 uniform 進行設置

lightingShader.setVec3("material.ambient",  1.0f, 0.5f, 0.31f);
lightingShader.setVec3("material.diffuse",  1.0f, 0.5f, 0.31f);
lightingShader.setVec3("material.specular", 0.5f, 0.5f, 0.5f);
lightingShader.setFloat("material.shininess", 32.0f);

光的屬性

之前我們看到,如果更改不同光線的強度(環境,漫反射,鏡面反射),結果也會有很大差距
因此我們可以用同樣的方式來修改光源的漫反射和鏡面反射強度

struct Light {
    vec3 position;
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
};

uniform Light light;

通常來說,環境光較低,漫反射光線稍亮,而鏡面反射的光線強度通常爲 1.0
片段着色器中

vec3 ambient  = light.ambient * material.ambient;
vec3 diffuse  = light.diffuse * (diff * material.diffuse);
vec3 specular = light.specular * (spec * material.specular);

程序設置

lightingShader.setVec3("light.ambient",  0.2f, 0.2f, 0.2f);
lightingShader.setVec3("light.diffuse",  0.5f, 0.5f, 0.5f); // 將光照調暗了一些以搭配場景
lightingShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f); 

顏色
如果需要,我們也可以對光源的顏色做更細緻的調整

struct Light {
    vec3 position;
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;

	vec3 ambientColor;
	vec3 diffuseColor;
	vec3 specularColor;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章