设置材质
在上一节中我们了解了不同的材质对光的的变现是不同的,通过定义一个结构来表示材质对光的敏感性。在这一节中我们将定义的材质应用到程序中。
着色器的开发
顶点着色器可以沿用之前的,修改的是片段着色器。
1. 定义材质属性
//材质属性定义
struct Material {
vec3 ambient;
vec3 diffuse;
vec3 specular;
float shininess;
};
uniform Material material;
2. 应用材质属性
// Ambient
vec3 ambient = lightColor * material.ambient;
// Diffuse
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0f);
vec3 diffuse = lightColor * (diff * material.diffuse);
//Specular
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
vec3 speclular = lightColor * (spec * material.specular);
vec3 result = ambient + diffuse + speclular;
color = vec4(result, 1.0f);
3. 在代码中设置材质属性的值
GLS中的结构体没有什么特别之处,填充结构体时设置结构体中的各个元素的uniform值即可:
m_pShader->setVec3("material.ambient", 1.0f, 0.5f, 0.31f);
m_pShader->setVec3("material.diffuse", 1.0f, 0.5f, 0.31f);
m_pShader->setVec3("material.specular", 0.5f, 0.5f, 0.5f);
m_pShader->setFloat("material.shininess", 32.0f);
4. 运行效果
网友评论