一、定义材质Material类
Material::Material(Shader* _shader, glm::vec3 _diffuse, glm::vec3 _specular, glm::vec3 _ambient, float _shininess):
shader(_shader),
diffuse(_diffuse),
specular(_specular),
ambient(_ambient),
shininess(_shininess)
{
}
二、在fragmentShader中定义材质对象
uniform Material material;
三、通过Uniform传递材对象
1、为了便于传值,在Shader类中对uniform进行封装
void Shader::SetUniform3f(const char* paramNameString, glm::vec3 param)
{
glUniform3f(glGetUniformLocation(ID, paramNameString), param.x, param.y, param.z);
}
void Shader::SetUniform1f(const char* paramNameString, float param)
{
glUniform1f(glGetUniformLocation(ID, paramNameString), param);
}
2、在渲染循环中传递material对象
myMaterial->shader->SetUniform3f(“material.ambient”, myMaterial->ambient);
myMaterial->shader->SetUniform3f(“material.diffuse”, myMaterial->diffuse);
myMaterial->shader->SetUniform3f(“material.specular”, myMaterial->specular);
myMaterial->shader->SetUniform1f(“material.shininess”, myMaterial->shininess);
四、在fragmentShader中使用Material
· vec3 lightDir = normalize(lightPos - FragPos);
vec3 reflectVec =reflect(lightDir,Normal);
vec3 cameraVec = normalize(cameraPos - FragPos);
//specular
float specularAmount = pow(max(dot(reflectVec,cameraVec),0.0f),material.shininess);
vec3 specular = material.specularspecularAmountlightColor;
//deffuse
vec3 diffuse =material.diffuse * max(dot(lightDir,Normal),0.0f)*lightColor;
//ambient
vec3 ambient = material.ambient*ambientColor;
FragColor = vec4((ambient+diffuse+specular)*objColor,1.0f);