diff --git a/data/shaders/pointlight.frag b/data/shaders/pointlight.frag index cba9e2e49..d9db8a933 100644 --- a/data/shaders/pointlight.frag +++ b/data/shaders/pointlight.frag @@ -14,36 +14,34 @@ out vec4 Specular; vec3 DecodeNormal(vec2 n); -void main() { - vec2 texc = gl_FragCoord.xy / screen; - float z = texture(dtex, texc).x; - vec3 norm = normalize(DecodeNormal(2. * texture(ntex, texc).xy - 1.)); +void main() +{ + vec2 texc = gl_FragCoord.xy / screen; + float z = texture(dtex, texc).x; + vec3 norm = normalize(DecodeNormal(2. * texture(ntex, texc).xy - 1.)); + //float roughness = texture(ntex, texc).z; - vec4 xpos = 2.0 * vec4(texc, z, 1.0) - 1.0f; - xpos = invproj * xpos; - xpos /= xpos.w; - vec3 eyedir = normalize(xpos.xyz); + vec4 xpos = 2.0 * vec4(texc, z, 1.0) - 1.0f; + xpos = invproj * xpos; + xpos /= xpos.w; + vec3 eyedir = -normalize(xpos.xyz); - vec3 diffuse = vec3(0.), specular = vec3(0.); + vec4 pseudocenter = ViewMatrix * vec4(center.xyz, 1.0); + pseudocenter /= pseudocenter.w; + vec3 light_pos = pseudocenter.xyz; + vec3 light_col = col.xyz; + float d = distance(light_pos, xpos.xyz); + float att = energy * 200. / (4. * 3.14 * d * d); + float spec_att = (energy + 10.) * 200. / (4. * 3.14 * d * d); - vec4 pseudocenter = ViewMatrix * vec4(center.xyz, 1.0); - pseudocenter /= pseudocenter.w; - vec3 light_pos = pseudocenter.xyz; - vec3 light_col = col.xyz; - float d = distance(light_pos, xpos.xyz); - float att = energy * 200. / (4. * 3.14 * d * d); - float spec_att = (energy + 10.) * 200. / (4. * 3.14 * d * d); + // Light Direction + vec3 L = -normalize(xpos.xyz - light_pos); + // Half Light View direction + vec3 H = normalize(eyedir + L); - // Light Direction - vec3 L = normalize(xpos.xyz - light_pos); + float NdotL = max(0., dot(norm, L)); + float NdotH = max(0., dot(norm, H)); - float NdotL = max(0.0, dot(norm, -L)); - diffuse += NdotL * light_col * att; - // Reflected light dir - vec3 R = reflect(-L, norm); - float RdotE = max(0.0, dot(R, eyedir)); - specular += pow(RdotE, spec) * light_col * spec_att; - - Diffuse = vec4(diffuse, 1.); - Specular = vec4(specular , 1.); + Diffuse = vec4(NdotL * light_col * att, 1.); + Specular = vec4(pow(NdotH, spec) * light_col * NdotL * spec_att, 1.); } diff --git a/data/shaders/sunlight.frag b/data/shaders/sunlight.frag index 0f56d1671..101100c0f 100644 --- a/data/shaders/sunlight.frag +++ b/data/shaders/sunlight.frag @@ -36,14 +36,17 @@ void main() { } vec3 norm = normalize(DecodeNormal(2. * texture(ntex, uv).xy - 1.)); + vec3 eyedir = -normalize(xpos.xyz); // Normalized on the cpu - vec3 L = direction; + vec3 L = direction; + // Half Light View direction + vec3 H = normalize(eyedir + L); - float NdotL = max(0.0, dot(norm, L)); - vec3 R = reflect(L, norm); - float RdotE = max(0.0, dot(R, normalize(xpos.xyz))); - float Specular = pow(RdotE, 200); + float NdotL = max(0., dot(norm, L)); + float NdotH = max(0., dot(norm, H)); + + float Specular = pow(NdotH, 200) * NdotL; vec3 outcol = NdotL * col; diff --git a/data/shaders/sunlightshadow.frag b/data/shaders/sunlightshadow.frag index dc2db7199..75ecbfb10 100644 --- a/data/shaders/sunlightshadow.frag +++ b/data/shaders/sunlightshadow.frag @@ -64,14 +64,17 @@ void main() { xpos.xyz /= xpos.w; vec3 norm = normalize(DecodeNormal(2. * texture(ntex, uv).xy - 1.)); + vec3 eyedir = -normalize(xpos.xyz); // Normalized on the cpu - vec3 L = direction; + vec3 L = direction; + // Half Light View direction + vec3 H = normalize(eyedir + L); - float NdotL = max(0.0, dot(norm, L)); - vec3 R = reflect(L, norm); - float RdotE = max(0.0, dot(R, normalize(xpos.xyz))); - float Specular = pow(RdotE, 200); + float NdotL = max(0., dot(norm, L)); + float NdotH = max(0., dot(norm, H)); + + float Specular = pow(NdotH, 200) * NdotL; vec3 outcol = NdotL * col;