mirror of
https://github.com/JoeyDeVries/LearnOpenGL.git
synced 2026-01-30 20:13:22 +08:00
48 lines
1.4 KiB
GLSL
48 lines
1.4 KiB
GLSL
#version 330 core
|
|
out vec4 FragColor;
|
|
|
|
in vec2 TexCoords;
|
|
|
|
uniform sampler2D gPosition;
|
|
uniform sampler2D gNormal;
|
|
uniform sampler2D gAlbedo;
|
|
uniform sampler2D ssao;
|
|
|
|
struct Light {
|
|
vec3 Position;
|
|
vec3 Color;
|
|
|
|
float Linear;
|
|
float Quadratic;
|
|
};
|
|
uniform Light light;
|
|
|
|
void main()
|
|
{
|
|
// retrieve data from gbuffer
|
|
vec3 FragPos = texture(gPosition, TexCoords).rgb;
|
|
vec3 Normal = texture(gNormal, TexCoords).rgb;
|
|
vec3 Diffuse = texture(gAlbedo, TexCoords).rgb;
|
|
float AmbientOcclusion = texture(ssao, TexCoords).r;
|
|
|
|
// then calculate lighting as usual
|
|
vec3 ambient = vec3(0.3 * Diffuse * AmbientOcclusion);
|
|
vec3 lighting = ambient;
|
|
vec3 viewDir = normalize(-FragPos); // viewpos is (0.0.0)
|
|
// diffuse
|
|
vec3 lightDir = normalize(light.Position - FragPos);
|
|
vec3 diffuse = max(dot(Normal, lightDir), 0.0) * Diffuse * light.Color;
|
|
// specular
|
|
vec3 halfwayDir = normalize(lightDir + viewDir);
|
|
float spec = pow(max(dot(Normal, halfwayDir), 0.0), 8.0);
|
|
vec3 specular = light.Color * spec;
|
|
// attenuation
|
|
float distance = length(light.Position - FragPos);
|
|
float attenuation = 1.0 / (1.0 + light.Linear * distance + light.Quadratic * distance * distance);
|
|
diffuse *= attenuation;
|
|
specular *= attenuation;
|
|
lighting += diffuse + specular;
|
|
|
|
FragColor = vec4(lighting, 1.0);
|
|
}
|