diff options
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl')
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl | 106 |
1 files changed, 54 insertions, 52 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl index a1a5fab03af..d0a365f5a3e 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl @@ -11,32 +11,32 @@ /* ------------ Diffuse ------------- */ -float direct_diffuse_point(LightData ld, ShadingData sd) +float direct_diffuse_point(vec3 N, vec4 l_vector) { - float dist = length(sd.l_vector); - vec3 L = sd.l_vector / dist; - float bsdf = max(0.0, dot(sd.N, L)); + float dist = l_vector.w; + vec3 L = l_vector.xyz / dist; + float bsdf = max(0.0, dot(N, L)); bsdf /= dist * dist; return bsdf; } /* infinitly far away point source, no decay */ -float direct_diffuse_sun(LightData ld, ShadingData sd) +float direct_diffuse_sun(LightData ld, vec3 N) { - float bsdf = max(0.0, dot(sd.N, -ld.l_forward)); + float bsdf = max(0.0, dot(N, -ld.l_forward)); bsdf *= M_1_PI; /* Normalize */ return bsdf; } /* From Frostbite PBR Course - * Analitical irradiance from a sphere with correct horizon handling + * Analytical irradiance from a sphere with correct horizon handling * http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf */ -float direct_diffuse_sphere(LightData ld, ShadingData sd) +float direct_diffuse_sphere(LightData ld, vec3 N, vec4 l_vector) { - float dist = length(sd.l_vector); - vec3 L = sd.l_vector / dist; + float dist = l_vector.w; + vec3 L = l_vector.xyz / dist; float radius = max(ld.l_sizex, 0.0001); - float costheta = clamp(dot(sd.N, L), -0.999, 0.999); + float costheta = clamp(dot(N, L), -0.999, 0.999); float h = min(ld.l_radius / dist , 0.9999); float h2 = h*h; float costheta2 = costheta * costheta; @@ -61,15 +61,15 @@ float direct_diffuse_sphere(LightData ld, ShadingData sd) /* From Frostbite PBR Course * http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf */ -float direct_diffuse_rectangle(LightData ld, ShadingData sd) +float direct_diffuse_rectangle(LightData ld, vec3 N, vec3 V, vec4 l_vector) { vec3 corners[4]; - corners[0] = sd.l_vector + ld.l_right * -ld.l_sizex + ld.l_up * ld.l_sizey; - corners[1] = sd.l_vector + ld.l_right * -ld.l_sizex + ld.l_up * -ld.l_sizey; - corners[2] = sd.l_vector + ld.l_right * ld.l_sizex + ld.l_up * -ld.l_sizey; - corners[3] = sd.l_vector + ld.l_right * ld.l_sizex + ld.l_up * ld.l_sizey; + corners[0] = l_vector.xyz + ld.l_right * -ld.l_sizex + ld.l_up * ld.l_sizey; + corners[1] = l_vector.xyz + ld.l_right * -ld.l_sizex + ld.l_up * -ld.l_sizey; + corners[2] = l_vector.xyz + ld.l_right * ld.l_sizex + ld.l_up * -ld.l_sizey; + corners[3] = l_vector.xyz + ld.l_right * ld.l_sizex + ld.l_up * ld.l_sizey; - float bsdf = ltc_evaluate(sd.N, sd.V, mat3(1.0), corners); + float bsdf = ltc_evaluate(N, V, mat3(1.0), corners); bsdf *= M_1_2PI; return bsdf; } @@ -83,35 +83,37 @@ float direct_diffuse_unit_disc(vec3 N, vec3 L) #endif /* ----------- GGx ------------ */ -vec3 direct_ggx_point(ShadingData sd, float roughness, vec3 f0) +vec3 direct_ggx_point(vec3 N, vec3 V, vec4 l_vector, float roughness, vec3 f0) { - float dist = length(sd.l_vector); - vec3 L = sd.l_vector / dist; - float bsdf = bsdf_ggx(sd.N, L, sd.V, roughness); + roughness = max(1e-3, roughness); + float dist = l_vector.w; + vec3 L = l_vector.xyz / dist; + float bsdf = bsdf_ggx(N, L, V, roughness); bsdf /= dist * dist; /* Fresnel */ - float VH = max(dot(sd.V, normalize(sd.V + L)), 0.0); + float VH = max(dot(V, normalize(V + L)), 0.0); return F_schlick(f0, VH) * bsdf; } -vec3 direct_ggx_sun(LightData ld, ShadingData sd, float roughness, vec3 f0) +vec3 direct_ggx_sun(LightData ld, vec3 N, vec3 V, float roughness, vec3 f0) { - float bsdf = bsdf_ggx(sd.N, -ld.l_forward, sd.V, roughness); - float VH = max(dot(sd.V, normalize(sd.V - ld.l_forward)), 0.0); + roughness = max(1e-3, roughness); + float bsdf = bsdf_ggx(N, -ld.l_forward, V, roughness); + float VH = dot(V, -ld.l_forward) * 0.5 + 0.5; return F_schlick(f0, VH) * bsdf; } -vec3 direct_ggx_sphere(LightData ld, ShadingData sd, float roughness, vec3 f0) +vec3 direct_ggx_sphere(LightData ld, vec3 N, vec3 V, vec4 l_vector, float roughness, vec3 f0) { - vec3 L = normalize(sd.l_vector); - vec3 spec_dir = get_specular_dominant_dir(sd.N, reflect(-sd.V, sd.N), roughness); - vec3 P = line_aligned_plane_intersect(vec3(0.0), spec_dir, sd.l_vector); + vec3 L = l_vector.xyz / l_vector.w; + vec3 spec_dir = get_specular_reflection_dominant_dir(N, V, roughness); + vec3 P = line_aligned_plane_intersect(vec3(0.0), spec_dir, l_vector.xyz); - vec3 Px = normalize(P - sd.l_vector) * ld.l_radius; + vec3 Px = normalize(P - l_vector.xyz) * ld.l_radius; vec3 Py = cross(Px, L); - vec2 uv = lut_coords(dot(sd.N, sd.V), sqrt(roughness)); + vec2 uv = lut_coords(dot(N, V), sqrt(roughness)); vec3 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rgb; vec4 ltc_lut = texture(utilTex, vec3(uv, 0.0)).rgba; mat3 ltc_mat = ltc_matrix(ltc_lut); @@ -123,22 +125,22 @@ vec3 direct_ggx_sphere(LightData ld, ShadingData sd, float roughness, vec3 f0) /* counter clockwise */ vec3 points[8]; - points[0] = sd.l_vector + Px; - points[1] = sd.l_vector - Pxy2; - points[2] = sd.l_vector - Py; - points[3] = sd.l_vector - Pxy1; - points[4] = sd.l_vector - Px; - points[5] = sd.l_vector + Pxy2; - points[6] = sd.l_vector + Py; - points[7] = sd.l_vector + Pxy1; - float bsdf = ltc_evaluate_circle(sd.N, sd.V, ltc_mat, points); + points[0] = l_vector.xyz + Px; + points[1] = l_vector.xyz - Pxy2; + points[2] = l_vector.xyz - Py; + points[3] = l_vector.xyz - Pxy1; + points[4] = l_vector.xyz - Px; + points[5] = l_vector.xyz + Pxy2; + points[6] = l_vector.xyz + Py; + points[7] = l_vector.xyz + Pxy1; + float bsdf = ltc_evaluate_circle(N, V, ltc_mat, points); #else vec3 points[4]; - points[0] = sd.l_vector + Px; - points[1] = sd.l_vector - Py; - points[2] = sd.l_vector - Px; - points[3] = sd.l_vector + Py; - float bsdf = ltc_evaluate(sd.N, sd.V, ltc_mat, points); + points[0] = l_vector.xyz + Px; + points[1] = l_vector.xyz - Py; + points[2] = l_vector.xyz - Px; + points[3] = l_vector.xyz + Py; + float bsdf = ltc_evaluate(N, V, ltc_mat, points); /* sqrt(pi/2) difference between square and disk area */ bsdf *= 1.25331413731; #endif @@ -151,19 +153,19 @@ vec3 direct_ggx_sphere(LightData ld, ShadingData sd, float roughness, vec3 f0) return spec; } -vec3 direct_ggx_rectangle(LightData ld, ShadingData sd, float roughness, vec3 f0) +vec3 direct_ggx_rectangle(LightData ld, vec3 N, vec3 V, vec4 l_vector, float roughness, vec3 f0) { vec3 corners[4]; - corners[0] = sd.l_vector + ld.l_right * -ld.l_sizex + ld.l_up * ld.l_sizey; - corners[1] = sd.l_vector + ld.l_right * -ld.l_sizex + ld.l_up * -ld.l_sizey; - corners[2] = sd.l_vector + ld.l_right * ld.l_sizex + ld.l_up * -ld.l_sizey; - corners[3] = sd.l_vector + ld.l_right * ld.l_sizex + ld.l_up * ld.l_sizey; + corners[0] = l_vector.xyz + ld.l_right * -ld.l_sizex + ld.l_up * ld.l_sizey; + corners[1] = l_vector.xyz + ld.l_right * -ld.l_sizex + ld.l_up * -ld.l_sizey; + corners[2] = l_vector.xyz + ld.l_right * ld.l_sizex + ld.l_up * -ld.l_sizey; + corners[3] = l_vector.xyz + ld.l_right * ld.l_sizex + ld.l_up * ld.l_sizey; - vec2 uv = lut_coords(dot(sd.N, sd.V), sqrt(roughness)); + vec2 uv = lut_coords(dot(N, V), sqrt(roughness)); vec3 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rgb; vec4 ltc_lut = texture(utilTex, vec3(uv, 0.0)).rgba; mat3 ltc_mat = ltc_matrix(ltc_lut); - float bsdf = ltc_evaluate(sd.N, sd.V, ltc_mat, corners); + float bsdf = ltc_evaluate(N, V, ltc_mat, corners); bsdf *= brdf_lut.b; /* Bsdf intensity */ bsdf *= M_1_2PI; |