OpenGL学习26——Blinn-Phong光照模型

2021-08-01  本文已影响0人  蓬篙人

Blinn-Phong Shading Model

vec3 lightDir = normalize(lightPos - FragPos);
vec3 viewDir = normalize(viewPos- FragPos);
vec3 halfwayDir = normalize(lightDir + viewDir);
float spec = pow(max(dot(normal, halfwayDir), 0.0), shininess);
vec3 specular = lightColor * spec;
#version 330 core
out vec4 FragColor;

uniform bool blinn;
uniform vec3 lightPos;
uniform vec3 viewPos;

in vec2 TexCoords;
in vec3 Normal;
in vec3 FragPos;

uniform sampler2D texture1;

void main()
{
    vec3 objectColor = vec3(texture(texture1, TexCoords));

    float ambientStrength = 0.05;
    vec3 ambient = ambientStrength * objectColor;

    vec3 norm = normalize(Normal);
    vec3 lightDir = normalize(lightPos - FragPos);
    float diff = max(dot(norm, lightDir), 0.0);
    vec3 diffuse = diff * objectColor;

    vec3 viewDir = normalize(viewPos - FragPos);
    float spec = 0.0;
    if(blinn)
    {
        vec3 halfwayDir = normalize(lightDir + viewDir);  
        spec = pow(max(dot(Normal, halfwayDir), 0.0), 32.0);
    }
    else
    {
        vec3 reflectDir = reflect(-lightDir, Normal);
        spec = pow(max(dot(viewDir, reflectDir), 0.0), 8.0);
    }
    vec3 specular = spec * vec3(0.3);

    vec3 result = (ambient + diffuse + specular);

    FragColor = vec4(result, 1.0);
}
bool blinn = false;
bool blinnKeyPressed = false;

...

void processInput(GLFWwindow* window)
{
    ...

    if (glfwGetKey(window, GLFW_KEY_B) == GLFW_PRESS && !blinnKeyPressed)
    {
        blinn = !blinn;
        blinnKeyPressed = true;
    }
    if (glfwGetKey(window, GLFW_KEY_B) == GLFW_RELEASE)
    {
        blinnKeyPressed = false;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读