參考: 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;
};