diff options
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders/eevee_gbuffer_lib.glsl')
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/eevee_gbuffer_lib.glsl | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_gbuffer_lib.glsl b/source/blender/draw/engines/eevee/shaders/eevee_gbuffer_lib.glsl index caec0fb1673..15a1349c417 100644 --- a/source/blender/draw/engines/eevee/shaders/eevee_gbuffer_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/eevee_gbuffer_lib.glsl @@ -25,12 +25,24 @@ float gbuffer_decode_unit_float_from_uint(uint packed_scalar, const uint bit_siz /* Expects input to be normalized. */ vec2 gbuffer_encode_normal(vec3 normal) { - return normal_encode(normal_world_to_view(normal)); + vec3 vN = normal_world_to_view(normal); + bool neg = vN.z < 0.0; + if (neg) { + vN.z = -vN.z; + } + vec2 packed_normal = normal_encode(vN); + // return packed_normal; + return (neg) ? -packed_normal : packed_normal; } vec3 gbuffer_decode_normal(vec2 packed_normal) { - return normal_view_to_world(normal_decode(packed_normal)); + bool neg = packed_normal.y < 0.0; + vec3 vN = normal_decode(abs(packed_normal)); + if (neg) { + vN.z = -vN.z; + } + return normal_view_to_world(vN); } /* Note: does not handle negative colors. */ @@ -89,16 +101,18 @@ void gbuffer_load_global_data(vec4 transmit_normal_in, out float thickness) ClosureDiffuse gbuffer_load_diffuse_data(vec4 color_in, vec4 normal_in, vec4 data_in) { ClosureDiffuse data_out; - if (normal_in.x > 0.0) { - data_out.color = color_in.rgb; - data_out.N = gbuffer_decode_normal(normal_in.xy); - } - else { + if (normal_in.z == -1.0) { + /* Transmission data is Refraction data. */ data_out.color = vec3(0.0); data_out.N = vec3(1.0); + data_out.sss_id = 0u; + } + else { + data_out.color = color_in.rgb; + data_out.N = gbuffer_decode_normal(normal_in.xy); + data_out.sss_id = uint(normal_in.z * 1024.0); } data_out.sss_radius = data_in.rgb; - data_out.sss_id = uint(normal_in.z * 1024.0); return data_out; } @@ -137,9 +151,9 @@ ClosureReflection gbuffer_load_reflection_data(sampler2D reflect_color_tx, ClosureRefraction gbuffer_load_refraction_data(vec4 color_in, vec4 normal_in, vec4 data_in) { ClosureRefraction data_out; - if (normal_in.x < 0.0) { + if (normal_in.z == -1.0) { data_out.color = color_in.rgb; - data_out.N = gbuffer_decode_normal(-normal_in.xy); + data_out.N = gbuffer_decode_normal(normal_in.xy); data_out.ior = data_in.x; data_out.roughness = data_in.y; } |