设置材质
在着色器中建立结构体如下
#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);
}