openGL之材质
程序员文章站
2022-07-04 10:20:54
...
struct Material{
vec3 ambient; // 环境光照分量
vec3 diffuse; // 漫反射光照分量
vec3 specular; // 镜面反射分量
float shininess; // 反光度分量
};
我们知道每种光照分量都会有一个强度分量,将强度分量包装成光源的材质
光源可以用如下属性包装以调节光照模型:
struct Light{
vec3 positin; //光源位置
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
顶点着色器代码不变
VertexShaderCode
片段着色器的代码为:
#version 330 core
out vec4 FragColor;
struct Material{
vec3 ambient; // 环境光照分量
vec3 diffuse; // 漫反射光照分量
vec3 specular; // 镜面反射分量
float shininess; // 反光度分量
};
struct Light{
vec3 position; //光源位置
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
in vec3 FragPos;
in vec3 Normal;
uniform vec3 viewPos;
uniform Material material;
uniform Light light;
void main()
{
// ambient
vec3 ambient = light.ambient * material.ambient;
// diffuse
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(light.position - FragPos);
float diff = max(dot(norm, lightDir), 0.0f);
vec3 diffuse = light.diffuse * (diff * material.diffuse);
// specular
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0f), material.shininess);
vec3 specular = light.specular * (spec * material.specular);
vec3 result = ambient + diffuse + specular;
FragColor = vec4(result, 1.0f);
}
上一篇: 第十二章 Traits - 12.1 trait 怎样工作
下一篇: OpenGl之纹理