learnOpenGL 2.2 材质

130 阅读1分钟

设置材质

在着色器中建立结构体如下

#version 330 core
struct Material {
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    float shininess;
}; 

uniform Material material;

在渲染中设置材质的实际值,环境光反射和漫反射都和物体本身颜色有关,因此设置成物体的颜色。镜面反射只与光源颜色有关,所以设置成单位向量,再乘以镜面反射强度0.5

lightingshader.setVec3("material.ambient", 1.0f, 0.5f, 0.31f);
lightingshader.setVec3("material.diffuse", 1.0f, 0.5f, 0.31f);
lightingshader.setVec3("material.specular", 0.5f, 0.5f, 0.5f);
lightingshader.setFloat("material.shininess", 32.0f);

光的属性

同样在着色器中建立结构体

struct Light {
    vec3 position;

    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
};

我们让灯光的颜色随时间变化,因为三种光线颜色都是光源的颜色,不过强度不同。

glm::vec3 lightcolor;
lightcolor.x = sin(glfwGetTime() * 2.0f);
lightcolor.y = sin(glfwGetTime() * 0.7f);
lightcolor.z = sin(glfwGetTime() * 1.3f);
lightingshader.setVec3("light.specular", lightcolor);
lightingshader.setVec3("light.diffuse", 0.5f*lightcolor);
lightingshader.setVec3("light.ambient", 0.1f*lightcolor);

最后在着色器中将两部分结合使用

void main()
{
 vec3 ambient=light.ambient*material.ambient;
 vec3 norm=normalize(normal);
 vec3 lightdir=normalize(light.position-fragpos);
 float diff=max(dot(norm,lightdir),0);
 vec3 diffuse=diff*light.diffuse*material.diffuse;
 vec3 viewdir=normalize(viewpos-fragpos);
 vec3 reflectdir=normalize(reflect(-light.position,norm));
 float spe=pow(max(dot(viewdir,reflectdir),0),material.shininess);
 vec3 specular=spe*material.specular*light.specular;
 vec3 result=ambient+diffuse+specular;
 FragColor=vec4(result,1.0f);
 }