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/effect_subsurface_frag.glsl')
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_subsurface_frag.glsl112
1 files changed, 57 insertions, 55 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/effect_subsurface_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_subsurface_frag.glsl
index 5ecf6323255..4260c601543 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_subsurface_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_subsurface_frag.glsl
@@ -2,10 +2,11 @@
/* Based on Separable SSS. by Jorge Jimenez and Diego Gutierrez */
#define MAX_SSS_SAMPLES 65
-layout(std140) uniform sssProfile {
- vec4 kernel[MAX_SSS_SAMPLES];
- vec4 radii_max_radius;
- int sss_samples;
+layout(std140) uniform sssProfile
+{
+ vec4 kernel[MAX_SSS_SAMPLES];
+ vec4 radii_max_radius;
+ int sss_samples;
};
uniform sampler2D depthBuffer;
@@ -13,9 +14,9 @@ uniform sampler2D sssData;
uniform sampler2D sssAlbedo;
#ifndef UTIL_TEX
-#define UTIL_TEX
+# define UTIL_TEX
uniform sampler2DArray utilTex;
-#define texelfetch_noise_tex(coord) texelFetch(utilTex, ivec3(ivec2(coord) % LUT_SIZE, 2.0), 0)
+# define texelfetch_noise_tex(coord) texelFetch(utilTex, ivec3(ivec2(coord) % LUT_SIZE, 2.0), 0)
#endif /* UTIL_TEX */
layout(location = 0) out vec4 FragColor;
@@ -25,75 +26,76 @@ layout(location = 1) out vec4 sssColor;
float get_view_z_from_depth(float depth)
{
- if (ProjectionMatrix[3][3] == 0.0) {
- float d = 2.0 * depth - 1.0;
- return -ProjectionMatrix[3][2] / (d + ProjectionMatrix[2][2]);
- }
- else {
- return viewVecs[0].z + depth * viewVecs[1].z;
- }
+ if (ProjectionMatrix[3][3] == 0.0) {
+ float d = 2.0 * depth - 1.0;
+ return -ProjectionMatrix[3][2] / (d + ProjectionMatrix[2][2]);
+ }
+ else {
+ return viewVecs[0].z + depth * viewVecs[1].z;
+ }
}
#define LUT_SIZE 64
-#define M_PI_2 1.5707963267948966 /* pi/2 */
-#define M_2PI 6.2831853071795865 /* 2*pi */
+#define M_PI_2 1.5707963267948966 /* pi/2 */
+#define M_2PI 6.2831853071795865 /* 2*pi */
void main(void)
{
- vec2 pixel_size = 1.0 / vec2(textureSize(depthBuffer, 0).xy); /* TODO precompute */
- vec2 uvs = gl_FragCoord.xy * pixel_size;
- vec4 sss_data = texture(sssData, uvs).rgba;
- float depth_view = get_view_z_from_depth(texture(depthBuffer, uvs).r);
+ vec2 pixel_size = 1.0 / vec2(textureSize(depthBuffer, 0).xy); /* TODO precompute */
+ vec2 uvs = gl_FragCoord.xy * pixel_size;
+ vec4 sss_data = texture(sssData, uvs).rgba;
+ float depth_view = get_view_z_from_depth(texture(depthBuffer, uvs).r);
- float rand = texelfetch_noise_tex(gl_FragCoord.xy).r;
+ float rand = texelfetch_noise_tex(gl_FragCoord.xy).r;
#ifdef FIRST_PASS
- float angle = M_2PI * rand + M_PI_2;
- vec2 dir = vec2(1.0, 0.0);
+ float angle = M_2PI * rand + M_PI_2;
+ vec2 dir = vec2(1.0, 0.0);
#else /* SECOND_PASS */
- float angle = M_2PI * rand;
- vec2 dir = vec2(0.0, 1.0);
+ float angle = M_2PI * rand;
+ vec2 dir = vec2(0.0, 1.0);
#endif
- vec2 dir_rand = vec2(cos(angle), sin(angle));
+ vec2 dir_rand = vec2(cos(angle), sin(angle));
- /* Compute kernel bounds in 2D. */
- float homcoord = ProjectionMatrix[2][3] * depth_view + ProjectionMatrix[3][3];
- vec2 scale = vec2(ProjectionMatrix[0][0], ProjectionMatrix[1][1]) * sss_data.aa / homcoord;
- vec2 finalStep = scale * radii_max_radius.w;
- finalStep *= 0.5; /* samples range -1..1 */
+ /* Compute kernel bounds in 2D. */
+ float homcoord = ProjectionMatrix[2][3] * depth_view + ProjectionMatrix[3][3];
+ vec2 scale = vec2(ProjectionMatrix[0][0], ProjectionMatrix[1][1]) * sss_data.aa / homcoord;
+ vec2 finalStep = scale * radii_max_radius.w;
+ finalStep *= 0.5; /* samples range -1..1 */
- /* Center sample */
- vec3 accum = sss_data.rgb * kernel[0].rgb;
+ /* Center sample */
+ vec3 accum = sss_data.rgb * kernel[0].rgb;
- for (int i = 1; i < sss_samples && i < MAX_SSS_SAMPLES; i++) {
- vec2 sample_uv = uvs + kernel[i].a * finalStep * ((abs(kernel[i].a) > sssJitterThreshold) ? dir : dir_rand);
- vec3 color = texture(sssData, sample_uv).rgb;
- float sample_depth = texture(depthBuffer, sample_uv).r;
- sample_depth = get_view_z_from_depth(sample_depth);
+ for (int i = 1; i < sss_samples && i < MAX_SSS_SAMPLES; i++) {
+ vec2 sample_uv = uvs + kernel[i].a * finalStep *
+ ((abs(kernel[i].a) > sssJitterThreshold) ? dir : dir_rand);
+ vec3 color = texture(sssData, sample_uv).rgb;
+ float sample_depth = texture(depthBuffer, sample_uv).r;
+ sample_depth = get_view_z_from_depth(sample_depth);
- /* Depth correction factor. */
- float depth_delta = depth_view - sample_depth;
- float s = clamp(1.0 - exp(-(depth_delta * depth_delta) / (2.0 * sss_data.a)), 0.0, 1.0);
+ /* Depth correction factor. */
+ float depth_delta = depth_view - sample_depth;
+ float s = clamp(1.0 - exp(-(depth_delta * depth_delta) / (2.0 * sss_data.a)), 0.0, 1.0);
- /* Out of view samples. */
- if (any(lessThan(sample_uv, vec2(0.0))) || any(greaterThan(sample_uv, vec2(1.0)))) {
- s = 1.0;
- }
+ /* Out of view samples. */
+ if (any(lessThan(sample_uv, vec2(0.0))) || any(greaterThan(sample_uv, vec2(1.0)))) {
+ s = 1.0;
+ }
- accum += kernel[i].rgb * mix(color, sss_data.rgb, s);
- }
+ accum += kernel[i].rgb * mix(color, sss_data.rgb, s);
+ }
#ifdef FIRST_PASS
- FragColor = vec4(accum, sss_data.a);
+ FragColor = vec4(accum, sss_data.a);
#else /* SECOND_PASS */
-# ifdef USE_SEP_ALBEDO
-# ifdef RESULT_ACCUM
- FragColor = vec4(accum, 1.0);
- sssColor = texture(sssAlbedo, uvs);
+# ifdef USE_SEP_ALBEDO
+# ifdef RESULT_ACCUM
+ FragColor = vec4(accum, 1.0);
+ sssColor = texture(sssAlbedo, uvs);
+# else
+ FragColor = vec4(accum * texture(sssAlbedo, uvs).rgb, 1.0);
+# endif
# else
- FragColor = vec4(accum * texture(sssAlbedo, uvs).rgb, 1.0);
+ FragColor = vec4(accum, 1.0);
# endif
-# else
- FragColor = vec4(accum, 1.0);
-# endif
#endif
}