Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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.glsl34
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;
}