openGL之材质

2.3 材质基础


材质是对上一节 光照模型的扩充
每种材质对光产生的反应不同,因此在上一节光照理论的基础上加上另一个属性 反光度就构成了 材质的所有属性:

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);
}

你可能感兴趣的:(openGL学习之路,openGL,材质)