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:
authorJeroen Bakker <jeroen@blender.org>2022-09-13 16:03:04 +0300
committerJeroen Bakker <jeroen@blender.org>2022-09-13 16:05:17 +0300
commit34051fcc12f388375697dcfc6da53e9909058fe1 (patch)
treec0fdd950ad41bc75bff838f717f5f8ec66c8f185 /source/blender/draw/engines/eevee/shaders/volumetric_resolve_comp.glsl
parentb404548972b771bbfb115565135afcb462588cec (diff)
EEVEE: Fix volumetric resolve in large scenes.
On NVIDIA volumetric resolve failed for large production scenes. The result would remove most color from the final render. The cause seems to be a faulty driver. This change ported the fragment shader to a compute shader which would select a different compiler branch and didn't show the error.
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders/volumetric_resolve_comp.glsl')
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_resolve_comp.glsl38
1 files changed, 38 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_resolve_comp.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_resolve_comp.glsl
new file mode 100644
index 00000000000..2b0139ff923
--- /dev/null
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_resolve_comp.glsl
@@ -0,0 +1,38 @@
+
+#pragma BLENDER_REQUIRE(volumetric_lib.glsl)
+
+/* Based on Frosbite Unified Volumetric.
+ * https://www.ea.com/frostbite/news/physically-based-unified-volumetric-rendering-in-frostbite */
+
+/* Step 4 : Apply final integration on top of the scene color. */
+
+uniform sampler2D inSceneDepth;
+
+layout(local_size_x = 1, local_size_y = 1) in;
+
+#ifdef TARGET_IMG_FLOAT
+layout(binding = 0, rgba32f) uniform image2D target_img;
+#else
+layout(binding = 0, rgba16f) uniform image2D target_img;
+#endif
+
+void main()
+{
+ ivec2 co = ivec2(gl_GlobalInvocationID.xy);
+ vec2 uvs = co / vec2(textureSize(inSceneDepth, 0));
+ float scene_depth = texture(inSceneDepth, uvs).r;
+
+ vec3 transmittance, scattering;
+ volumetric_resolve(uvs, scene_depth, transmittance, scattering);
+
+ /* Approximate volume alpha by using a monochromatic transmittance
+ * and adding it to the scene alpha. */
+ float alpha = dot(transmittance, vec3(1.0 / 3.0));
+
+ vec4 color0 = vec4(scattering, 1.0 - alpha);
+ vec4 color1 = vec4(transmittance, alpha);
+
+ vec4 color_in = imageLoad(target_img, co);
+ vec4 color_out = color0 + color1 * color_in;
+ imageStore(target_img, co, color_out);
+}