diff options
Diffstat (limited to 'source/blender/draw/engines/eevee')
4 files changed, 31 insertions, 16 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_shading.hh b/source/blender/draw/engines/eevee/eevee_shading.hh index cb030faa68b..5bf59ef13b5 100644 --- a/source/blender/draw/engines/eevee/eevee_shading.hh +++ b/source/blender/draw/engines/eevee/eevee_shading.hh @@ -198,7 +198,7 @@ struct GBuffer { if (closures_used & CLOSURE_REFLECTION) { reflect_color_tx.acquire_tmp(UNPACK2(extent), GPU_R11F_G11F_B10F, owner); - reflect_normal_tx.acquire_tmp(UNPACK2(extent), GPU_RGBA16, owner); + reflect_normal_tx.acquire_tmp(UNPACK2(extent), GPU_RGBA16F, owner); } if (closures_used & CLOSURE_VOLUME) { 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; } diff --git a/source/blender/draw/engines/eevee/shaders/eevee_subsurface_eval_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_subsurface_eval_frag.glsl index 9e0a07d9c94..de4c8cb59a6 100644 --- a/source/blender/draw/engines/eevee/shaders/eevee_subsurface_eval_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/eevee_subsurface_eval_frag.glsl @@ -74,14 +74,15 @@ void main(void) vec4 tra_nor_in = texture(transmit_normal_tx, center_uv); vec4 tra_dat_in = texture(transmit_data_tx, center_uv); - if (tra_nor_in.x < 0.0) { - /* Refraction transmission case. */ + ClosureDiffuse diffuse = gbuffer_load_diffuse_data(tra_col_in, tra_nor_in, tra_dat_in); + + if (diffuse.sss_id <= 0u) { + /* Normal diffuse is already in combined pass. */ + /* Refraction also go into this case. */ out_combined = vec4(0.0); return; } - ClosureDiffuse diffuse = gbuffer_load_diffuse_data(tra_col_in, tra_nor_in, tra_dat_in); - float max_radius = max_v3(diffuse.sss_radius); float homcoord = ProjectionMatrix[2][3] * vP.z + ProjectionMatrix[3][3]; diff --git a/source/blender/draw/engines/eevee/shaders/eevee_surface_deferred_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_surface_deferred_frag.glsl index 7578794c206..51e00ef43d3 100644 --- a/source/blender/draw/engines/eevee/shaders/eevee_surface_deferred_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/eevee_surface_deferred_frag.glsl @@ -75,7 +75,7 @@ void main(void) if (g_data.transmit_rand == 0.0) { out_transmit_color = g_refraction_data.color; - out_transmit_normal.xy = -gbuffer_encode_normal(g_refraction_data.N); + out_transmit_normal.xy = gbuffer_encode_normal(g_refraction_data.N); out_transmit_normal.z = -1.0; out_transmit_normal.w = thickness; out_transmit_data.x = g_refraction_data.ior; |