零基礎學習OpenGL(二)--材質、光照貼圖
接上節:
我們給物體定義了一個材質的屬性,這裡包含了 環境光照(Ambient Lighting),漫反射光照(Diffuse Lighting),鏡面光照(Specular Lighting)和反光度(Shininess)。
struct Material
{
vec3 ambient;
vec3 diffuse;
vec3 specular;
float shininess;
};
void main()
{
// 環境光
vec3 ambient = lightColor * material.ambient;
// 漫反射
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = lightColor * (diff * material.diffuse);
// 鏡面光
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
vec3 specular = lightColor * (spec * material.specular);
vec3 result = ambient + diffuse + specular;
FragColor = vec4(result, 1.0);
}
上面這段程式碼我們在上節已經詳細講過。我們看到整個光照都有作用在環境光,散射光,鏡面光上,但是現實中這三個的影響肯定是不一樣的,不全部都是作用最大的影響,我們可以把lightColor分出來:
struct Light
{
vec3 position;
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
然後用光的影響分量去計算:
vec3 ambient = light.ambient * material.ambient;
vec3 diffuse = light.diffuse * (diff * material.diffuse);
vec3 specular = light.specular * (spec * material.specular);
光照貼圖
物體在不同的部件上都有不同的材質屬性,而不是一個材質可以表示的,所以擴充套件。引入漫反射貼圖和鏡面光貼圖,這樣可以更加精準的控制漫反射分量和鏡面光分量。通俗點講, 就是物體每個點上的鏡面光照和漫反射的程度是不一樣的,我們可以用貼圖上的每個畫素表示。
漫反射貼圖:使用一張覆蓋物體的影象,讓我們可以逐片段索引獨立的顏色值。這張圖表現了物體所有漫反射顏色的紋理。
vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));
vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));
鏡面光貼圖:鏡面光貼圖上的每個畫素都可以由一個顏色向量來表示。
vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));