Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
| Show First 20 Lines • Show All 158 Lines • ▼ Show 20 Lines | vec3 ensure_valid_reflection(vec3 Ng, vec3 I, vec3 N) | ||||
| float fac = 0.5 / a; | float fac = 0.5 / a; | ||||
| float N1_z2 = fac * (b + c), N2_z2 = fac * (-b + c); | float N1_z2 = fac * (b + c), N2_z2 = fac * (-b + c); | ||||
| bool valid1 = (N1_z2 > 1e-5) && (N1_z2 <= (1.0 + 1e-5)); | bool valid1 = (N1_z2 > 1e-5) && (N1_z2 <= (1.0 + 1e-5)); | ||||
| bool valid2 = (N2_z2 > 1e-5) && (N2_z2 <= (1.0 + 1e-5)); | bool valid2 = (N2_z2 > 1e-5) && (N2_z2 <= (1.0 + 1e-5)); | ||||
| vec2 N_new; | vec2 N_new; | ||||
| if (valid1 && valid2) { | if (valid1 && valid2) { | ||||
| /* If both are possible, do the expensive reflection-based check. */ | /* If both are possible, do the expensive reflection-based check. */ | ||||
| vec2 N1 = vec2(sqrt(1.0 - N1_z2), sqrt(N1_z2)); | vec2 N1 = vec2(safe_sqrt(1.0 - N1_z2), safe_sqrt(N1_z2)); | ||||
| vec2 N2 = vec2(sqrt(1.0 - N2_z2), sqrt(N2_z2)); | vec2 N2 = vec2(safe_sqrt(1.0 - N2_z2), safe_sqrt(N2_z2)); | ||||
| float R1 = 2.0 * (N1.x * Ix + N1.y * Iz) * N1.y - Iz; | float R1 = 2.0 * (N1.x * Ix + N1.y * Iz) * N1.y - Iz; | ||||
| float R2 = 2.0 * (N2.x * Ix + N2.y * Iz) * N2.y - Iz; | float R2 = 2.0 * (N2.x * Ix + N2.y * Iz) * N2.y - Iz; | ||||
| valid1 = (R1 >= 1e-5); | valid1 = (R1 >= 1e-5); | ||||
| valid2 = (R2 >= 1e-5); | valid2 = (R2 >= 1e-5); | ||||
| if (valid1 && valid2) { | if (valid1 && valid2) { | ||||
| N_new = (R1 < R2) ? N1 : N2; | N_new = (R1 < R2) ? N1 : N2; | ||||
| } | } | ||||
| else { | else { | ||||
| N_new = (R1 > R2) ? N1 : N2; | N_new = (R1 > R2) ? N1 : N2; | ||||
| } | } | ||||
| } | } | ||||
| else if (valid1 || valid2) { | else if (valid1 || valid2) { | ||||
| float Nz2 = valid1 ? N1_z2 : N2_z2; | float Nz2 = valid1 ? N1_z2 : N2_z2; | ||||
| N_new = vec2(sqrt(1.0 - Nz2), sqrt(Nz2)); | N_new = vec2(safe_sqrt(1.0 - Nz2), safe_sqrt(Nz2)); | ||||
| } | } | ||||
| else { | else { | ||||
| return Ng; | return Ng; | ||||
| } | } | ||||
| return N_new.x * X + N_new.y * Ng; | return N_new.x * X + N_new.y * Ng; | ||||
| } | } | ||||
| /* ----------- Cone angle Approximation --------- */ | /* ----------- Cone angle Approximation --------- */ | ||||
| Show All 14 Lines | |||||