欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

openGL之材质

程序员文章站 2022-07-04 10:20:54
...

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