参考:这里
这一章节主要是对上一章节中物体材质属性封装,看片元着色器和程序代码。
//set shader uniform value
cubeShader.use();//设置uniform值之前要先激活shader
cubeShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);
cubeShader.setVec3("material.ambient", 1.0f, 0.5f, 0.31f);
cubeShader.setVec3("material.diffuse", 1.0f, 1.0f, 1.0f);
cubeShader.setVec3("material.specular", 0.5f, 0.5f, 0.5f);
cubeShader.setFloat("material.shininess",32.0f);
cubeShader.setVec3("light.position", lightPos);
cubeShader.setVec3("viewPos", camera.Position);
lightShader.use();
lightShader.setVec3("lightColor", glm::vec3(1.0f, 1.0f, 1.0f));
lightShader.setVec3("objectColor", glm::vec3(1.0f, 1.0f, 1.0f));
//render loop
while (!glfwWindowShouldClose(window))
{
float currentFrame = glfwGetTime();
deltaTime = currentFrame - lastFrame;
lastFrame = currentFrame;
//input
processInput(window);
//render
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//set shader uniform value
cubeShader.use();
//需要变化的放到循环里设置
cubeShader.setVec3("viewPos", camera.Position);
glm::vec3 lightColor;
lightColor.x = sin(glfwGetTime() * 2.0f);
lightColor.y = sin(glfwGetTime() * 0.7f);
lightColor.z = sin(glfwGetTime() * 1.3f);
glm::vec3 diffuseColor = lightColor * glm::vec3(0.5f); // 降低影响
glm::vec3 ambientColor = diffuseColor * glm::vec3(0.2f); // 很低的影响
cubeShader.setVec3("light.ambient", ambientColor);
cubeShader.setVec3("light.diffuse", diffuseColor);
顶点着色器:和上节一样
片元着色器:
#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;
};
uniform Light light;
uniform Material material;
in vec3 normal;
in vec3 fragPos;
uniform vec3 lightColor;
uniform vec3 lightPos;
uniform vec3 viewPos;
void main()
{
vec3 worldNormal=normalize(normal);
vec3 lightDir=normalize(light.position-fragPos);
vec3 viewDir=normalize(viewPos-fragPos);
//环境光
vec3 ambient=light.ambient*material.ambient;
//漫反射
float dif=max(dot(worldNormal,lightDir),0.0);
vec3 diffuse=light.diffuse*dif*material.diffuse;
//高光
vec3 reflectDir=reflect(-lightDir,worldNormal);
float spe=pow(max(dot(viewDir,reflectDir),0.0),material.shininess);
vec3 specular=light.specular*spe*material.specular;
vec3 finalColor=ambient+diffuse+specular;
fragColor=vec4(finalColor,1.0);
}