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:
authorClément Foucault <foucault.clem@gmail.com>2022-03-03 23:16:54 +0300
committerClément Foucault <foucault.clem@gmail.com>2022-03-03 23:16:54 +0300
commit58e2ec18ae58918017170c915e7587759f322779 (patch)
tree8f646ae8a0d73d7cec6840e888d9095e3df3d576 /source/blender/draw/engines/eevee/shaders
parentfbf4d8f8b5c60313a6ec15c7bd23e12f34b98878 (diff)
EEVEE: Deferred: Large refactor
This changes drastically the implementation to leverage arbitrary writes in order to reduce complexity, memory usage and increase speed. Since we are no longer dependent on the framebuffer requirement, we can allocate bigger size texture that fits all views and avoid the extra. Transparency, holdout and emissions are no longer deferred and are now composited using dual source blending. The indirect lighting and raytracing is still not functional but will also gets a large refactor on its own
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders')
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_culling_debug_frag.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_deferred_eval_frag.glsl (renamed from source/blender/draw/engines/eevee/shaders/eevee_deferred_direct_frag.glsl)37
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_deferred_holdout_frag.glsl18
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_deferred_transparent_frag.glsl47
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_deferred_volume_frag.glsl46
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_gbuffer_lib.glsl79
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_hiz_copy_frag.glsl11
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_hiz_downsample_frag.glsl34
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_shadow_debug_frag.glsl6
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_subsurface_eval_frag.glsl9
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_surface_deferred_frag.glsl88
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_volume_deferred_frag.glsl3
-rw-r--r--source/blender/draw/engines/eevee/shaders/infos/eevee_culling_info.hh2
-rw-r--r--source/blender/draw/engines/eevee/shaders/infos/eevee_deferred_info.hh74
-rw-r--r--source/blender/draw/engines/eevee/shaders/infos/eevee_material_info.hh38
-rw-r--r--source/blender/draw/engines/eevee/shaders/infos/eevee_shadow_info.hh2
16 files changed, 126 insertions, 370 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_culling_debug_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_culling_debug_frag.glsl
index 2101d9711e0..8479ac44314 100644
--- a/source/blender/draw/engines/eevee/shaders/eevee_culling_debug_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/eevee_culling_debug_frag.glsl
@@ -12,7 +12,7 @@
void main(void)
{
- float depth = texelFetch(depth_tx, ivec2(gl_FragCoord.xy), 0).r;
+ float depth = texelFetch(hiz_tx, ivec2(gl_FragCoord.xy), 0).r;
float vP_z = get_view_z_from_depth(depth);
vec3 P = get_world_space_from_depth(uvcoordsvar.xy, depth);
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_deferred_direct_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_deferred_eval_frag.glsl
index ca8c0c32533..13afe0add60 100644
--- a/source/blender/draw/engines/eevee/shaders/eevee_deferred_direct_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/eevee_deferred_eval_frag.glsl
@@ -10,24 +10,22 @@
#pragma BLENDER_REQUIRE(eevee_sampling_lib.glsl)
#pragma BLENDER_REQUIRE(eevee_shadow_lib.glsl)
#pragma BLENDER_REQUIRE(eevee_light_eval_lib.glsl)
-#pragma BLENDER_REQUIRE(eevee_lightprobe_eval_cubemap_lib.glsl)
-#pragma BLENDER_REQUIRE(eevee_lightprobe_eval_grid_lib.glsl)
void main(void)
{
+ ivec2 texel = ivec2(gl_FragCoord.xy);
+ float gbuffer_depth = texelFetch(hiz_tx, texel, 0).r;
vec2 uv = uvcoordsvar.xy;
- float gbuffer_depth = texelFetch(hiz_tx, ivec2(gl_FragCoord.xy), 0).r;
vec3 vP = get_view_space_from_depth(uv, gbuffer_depth);
vec3 P = point_view_to_world(vP);
vec3 V = cameraVec(P);
- vec4 tra_col_in = texture(transmit_color_tx, uv);
- vec4 tra_nor_in = texture(transmit_normal_tx, uv);
- vec4 tra_dat_in = texture(transmit_data_tx, uv);
- vec4 ref_col_in = texture(reflect_color_tx, uv);
- vec4 ref_nor_in = texture(reflect_normal_tx, uv);
+ vec4 tra_col_in = texelFetch(transmit_color_tx, texel, 0);
+ vec4 tra_nor_in = texelFetch(transmit_normal_tx, texel, 0);
+ vec4 tra_dat_in = texelFetch(transmit_data_tx, texel, 0);
+ vec4 ref_col_in = texelFetch(reflect_color_tx, texel, 0);
+ vec4 ref_nor_in = texelFetch(reflect_normal_tx, texel, 0);
- ClosureEmission emission = gbuffer_load_emission_data(emission_data_tx, uv);
ClosureDiffuse diffuse = gbuffer_load_diffuse_data(tra_col_in, tra_nor_in, tra_dat_in);
ClosureReflection reflection = gbuffer_load_reflection_data(ref_col_in, ref_nor_in);
@@ -44,15 +42,16 @@ void main(void)
light_eval(diffuse, reflection, P, V, vP.z, thickness, radiance_diffuse, radiance_reflection);
- out_combined = vec4(emission.emission, 0.0);
- out_diffuse.rgb = radiance_diffuse;
- /* FIXME(fclem): This won't work after the first light batch since we use additive blending. */
- out_diffuse.a = fract(float(diffuse.sss_id) / 1024.0) * 1024.0;
- /* Do not apply color to diffuse term for SSS material. */
- if (diffuse.sss_id == 0u) {
- out_diffuse.rgb *= diffuse.color;
- out_combined.rgb += out_diffuse.rgb;
+ out_combined = vec4(0.0);
+ out_combined.xyz += radiance_reflection * reflection.color;
+
+ if (diffuse.sss_id != 0u) {
+ // imageStore(sss_radiance, texel, vec4(radiance_diffuse, float(diffuse.sss_id % 1024)));
+ }
+ else {
+ out_combined.xyz += radiance_diffuse * diffuse.color;
}
- out_specular = radiance_reflection * reflection.color;
- out_combined.rgb += out_specular;
+
+ // output_renderpass(rpass_diffuse_light, vec3(1.0), vec4(radiance_diffuse, 0.0));
+ // output_renderpass(rpass_specular_light, vec3(1.0), vec4(radiance_reflection, 0.0));
}
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_deferred_holdout_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_deferred_holdout_frag.glsl
deleted file mode 100644
index d2840493e4b..00000000000
--- a/source/blender/draw/engines/eevee/shaders/eevee_deferred_holdout_frag.glsl
+++ /dev/null
@@ -1,18 +0,0 @@
-
-/**
- * Save radiance from main pass to subtract to final render.
- *
- * This way all screen space effects (SSS, SSR) are not altered by the presence of the holdout.
- **/
-
-#pragma BLENDER_REQUIRE(eevee_gbuffer_lib.glsl)
-
-void main(void)
-{
- vec3 combined_radiance = texture(combined_tx, uvcoordsvar.xy).rgb;
-
- ClosureTransparency transparency_data = gbuffer_load_transparency_data(transparency_data_tx,
- uvcoordsvar.xy);
-
- out_holdout = combined_radiance * transparency_data.holdout;
-}
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_deferred_transparent_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_deferred_transparent_frag.glsl
deleted file mode 100644
index 7438aa0bba4..00000000000
--- a/source/blender/draw/engines/eevee/shaders/eevee_deferred_transparent_frag.glsl
+++ /dev/null
@@ -1,47 +0,0 @@
-
-/**
- * Apply transmittance to all radiance passes.
- *
- * We needs to evaluate the transmittance of homogeneous volumes if any is present.
- * Hopefully, this has O(1) complexity as we do not need to raymarch the volume.
- *
- * Using blend mode multiply.
- **/
-
-#pragma BLENDER_REQUIRE(eevee_volume_eval_lib.glsl)
-#pragma BLENDER_REQUIRE(eevee_gbuffer_lib.glsl)
-
-void main(void)
-{
- ClosureVolume volume_data = gbuffer_load_volume_data(volume_data_tx, uvcoordsvar.xy);
-
- /* For volumes from solid objects. */
- // float depth_max = linear_z(texture(depth_max_tx, uv).r);
- // float depth_min = linear_z(texture(depth_min_tx, uv).r);
-
- /* Refine bounds to skip empty areas. */
- // float dist_from_bbox = intersect_bbox_ray(P, V, bbox);
- // depth_min = max(dist_from_bbox, depth_min);
-
- vec3 volume_transmittance;
- if (volume_data.anisotropy == VOLUME_HETEROGENEOUS) {
- volume_transmittance = volume_data.transmittance;
- }
- else {
- // volume_eval_homogeneous(P, depth_min, depth_max, volume_transmittance);
- volume_transmittance = vec3(0.0);
- }
-
- vec3 surface_transmittance =
- gbuffer_load_transparency_data(transparency_data_tx, uvcoordsvar.xy).transmittance;
-
- vec3 final_transmittance = volume_transmittance * surface_transmittance;
-
- /* Multiply transmittance all radiance buffers. Remember that blend mode is multiply. */
- out_combined = vec4(final_transmittance, avg(final_transmittance));
- out_diffuse = final_transmittance;
- out_specular = final_transmittance;
- out_volume = final_transmittance;
- out_background = final_transmittance;
- out_holdout = final_transmittance;
-}
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_deferred_volume_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_deferred_volume_frag.glsl
deleted file mode 100644
index ba562bd3d5e..00000000000
--- a/source/blender/draw/engines/eevee/shaders/eevee_deferred_volume_frag.glsl
+++ /dev/null
@@ -1,46 +0,0 @@
-
-/**
- * Apply heterogeneous volume lighting and evaluates homogeneous volumetrics if needed.
- *
- * We read volume parameters from the gbuffer and consider them constant for the whole volume.
- * This only applies to solid objects not volumes.
- **/
-
-#pragma BLENDER_REQUIRE(common_view_lib.glsl)
-#pragma BLENDER_REQUIRE(common_math_lib.glsl)
-#pragma BLENDER_REQUIRE(eevee_bsdf_lib.glsl)
-#pragma BLENDER_REQUIRE(eevee_culling_iter_lib.glsl)
-#pragma BLENDER_REQUIRE(eevee_shadow_lib.glsl)
-#pragma BLENDER_REQUIRE(eevee_gbuffer_lib.glsl)
-#pragma BLENDER_REQUIRE(eevee_volume_eval_lib.glsl)
-
-void main(void)
-{
- ClosureVolume volume_data = gbuffer_load_volume_data(volume_data_tx, uvcoordsvar.xy);
-
- /* For volumes from solid objects. */
- // float depth_max = linear_z(texture(depth_max_tx, uv).r);
- // float depth_min = linear_z(texture(depth_min_tx, uv).r);
-
- /* Refine bounds to skip empty areas. */
- // float dist_from_bbox = intersect_bbox_ray(P, V, bbox);
- // depth_min = max(dist_from_bbox, depth_min);
-
- vec3 volume_radiance;
- if (volume_data.anisotropy == VOLUME_HETEROGENEOUS) {
- volume_radiance = volume_data.scattering;
- }
- else {
- // volume_eval_homogeneous(P, depth_min, depth_max, volume_radiance);
- volume_radiance = vec3(0.0);
- }
-
- /* Apply transmittance of surface on volumetric radiance because
- * the volume is behind the surface. */
- ClosureTransparency transparency_data = gbuffer_load_transparency_data(transparency_data_tx,
- uvcoordsvar.xy);
- volume_radiance *= transparency_data.transmittance;
-
- out_combined = vec4(volume_radiance, 0.0);
- out_volume = volume_radiance;
-}
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 224a376bde4..d06c79706a2 100644
--- a/source/blender/draw/engines/eevee/shaders/eevee_gbuffer_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/eevee_gbuffer_lib.glsl
@@ -191,82 +191,3 @@ ClosureRefraction gbuffer_load_refraction_data(sampler2D transmit_color_tx,
}
/** \} */
-
-/* -------------------------------------------------------------------- */
-/** \name Volume data
- *
- * Pack all volumetric effects.
- *
- * \{ */
-
-#define VOLUME_HETEROGENEOUS -2.0
-
-uvec4 gbuffer_store_volume_data(ClosureVolume data_in)
-{
- uvec4 data_out;
- data_out.x = gbuffer_encode_color(data_in.emission);
- data_out.y = gbuffer_encode_color(data_in.scattering);
- data_out.z = gbuffer_encode_color(data_in.transmittance);
- data_out.w = floatBitsToUint(data_in.anisotropy);
- return data_out;
-}
-
-ClosureVolume gbuffer_load_volume_data(usampler2D gbuffer_tx, vec2 uv)
-{
- uvec4 data_in = texture(gbuffer_tx, uv);
-
- ClosureVolume data_out;
- data_out.emission = gbuffer_decode_color(data_in.x);
- data_out.scattering = gbuffer_decode_color(data_in.y);
- data_out.transmittance = gbuffer_decode_color(data_in.z);
- data_out.anisotropy = uintBitsToFloat(data_in.w);
- return data_out;
-}
-
-/** \} */
-
-/* -------------------------------------------------------------------- */
-/** \name Emission data
- *
- * \{ */
-
-vec3 gbuffer_store_emission_data(ClosureEmission data_in)
-{
- return data_in.emission;
-}
-
-ClosureEmission gbuffer_load_emission_data(sampler2D gbuffer_tx, vec2 uv)
-{
- vec4 data_in = texture(gbuffer_tx, uv);
-
- ClosureEmission data_out;
- data_out.emission = data_in.xyz;
- return data_out;
-}
-
-/** \} */
-
-/* -------------------------------------------------------------------- */
-/** \name Transparency data
- *
- * \{ */
-
-vec4 gbuffer_store_transparency_data(ClosureTransparency data_in)
-{
- vec4 data_out;
- data_out.xyz = data_in.transmittance;
- data_out.w = data_in.holdout;
- return data_out;
-}
-
-ClosureTransparency gbuffer_load_transparency_data(sampler2D gbuffer_tx, vec2 uv)
-{
- vec4 data_in = texture(gbuffer_tx, uv);
-
- ClosureTransparency data_out;
- data_out.transmittance = data_in.xyz;
- data_out.holdout = data_in.w;
- return data_out;
-}
-
-/** \} */
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_hiz_copy_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_hiz_copy_frag.glsl
deleted file mode 100644
index 4abd6d9233b..00000000000
--- a/source/blender/draw/engines/eevee/shaders/eevee_hiz_copy_frag.glsl
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * Copy input depth texture to lower left corner of the destination, filling any padding with
- * clamped texture extrapolation.
- */
-
-void main()
-{
- vec2 uv = gl_FragCoord.xy / vec2(textureSize(depth_tx, 0).xy);
-
- out_depth = texture(depth_tx, uv).r;
-}
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_hiz_downsample_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_hiz_downsample_frag.glsl
deleted file mode 100644
index cbde1352e06..00000000000
--- a/source/blender/draw/engines/eevee/shaders/eevee_hiz_downsample_frag.glsl
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Shader that down-sample depth buffer, creating a Hierarchical-Z buffer.
- * Saves max value of each 2x2 texel in the mipmap above the one we are rendering to.
- * Adapted from http://rastergrid.com/blog/2010/10/hierarchical-z-map-based-occlusion-culling/
- *
- * Major simplification has been made since we pad the buffer to always be bigger than input to
- * avoid mipmapping misalignement.
- */
-
-#pragma BLENDER_REQUIRE(common_math_lib.glsl)
-
-#ifndef GPU_ARB_texture_gather
-vec4 texGather(sampler2D tex, vec2 uv)
-{
- vec4 ofs = vec2(0.5, 0.5, -0.5, -0.5) * texel_size.xyxy;
- return vec4(texture(tex, uv + ofs.zw).r,
- texture(tex, uv + ofs.zy).r,
- texture(tex, uv + ofs.xw).r,
- texture(tex, uv + ofs.xy).r);
-}
-#else
-# define texGather(a, b) textureGather(a, b)
-#endif
-
-void main()
-{
- /* NOTE(@fclem): textureSize() does not work the same on all implementations
- * when changing the min and max texture levels. Use uniform instead (see T87801). */
- vec2 uv = gl_FragCoord.xy * texel_size;
-
- vec4 samp = texGather(depth_tx, uv);
-
- out_depth = max_v4(samp);
-}
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_shadow_debug_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_shadow_debug_frag.glsl
index 10e7c59509b..7fe3242a09e 100644
--- a/source/blender/draw/engines/eevee/shaders/eevee_shadow_debug_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/eevee_shadow_debug_frag.glsl
@@ -336,9 +336,9 @@ void main()
return;
}
- float mouse_depth = texelFetch(depth_tx, drw_view.mouse_pixel, 0).r;
+ float mouse_depth = texelFetch(hiz_tx, drw_view.mouse_pixel, 0).r;
vec3 mouse_P = get_world_space_from_depth(
- vec2(drw_view.mouse_pixel) / vec2(textureSize(depth_tx, 0)), mouse_depth);
+ vec2(drw_view.mouse_pixel) * drw_view.viewport_size_inverse, mouse_depth);
ivec4 mouse_tile;
debug_tile_index_from_position(mouse_P, mouse_tile);
@@ -346,7 +346,7 @@ void main()
return;
}
- float depth = texelFetch(depth_tx, ivec2(gl_FragCoord.xy), 0).r;
+ float depth = texelFetch(hiz_tx, ivec2(gl_FragCoord.xy), 0).r;
vec3 P = get_world_space_from_depth(uvcoordsvar.xy, depth);
/* Make it pass the depth test. */
gl_FragDepth = depth - 1e-6;
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 70fe3af6832..169ca555112 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
@@ -44,12 +44,13 @@ vec3 burley_eval(vec3 d, float r)
void main(void)
{
vec2 center_uv = uvcoordsvar.xy;
+ ivec2 texel = ivec2(gl_FragCoord.xy);
- float gbuffer_depth = texelFetch(hiz_tx, ivec2(gl_FragCoord.xy), 0).r;
+ float gbuffer_depth = texelFetch(hiz_tx, texel, 0).r;
vec3 vP = get_view_space_from_depth(center_uv, gbuffer_depth);
- vec4 tra_col_in = texture(transmit_color_tx, center_uv);
- vec4 tra_nor_in = texture(transmit_normal_tx, center_uv);
- vec4 tra_dat_in = texture(transmit_data_tx, center_uv);
+ vec4 tra_col_in = texelFetch(transmit_color_tx, texel, 0);
+ vec4 tra_nor_in = texelFetch(transmit_normal_tx, texel, 0);
+ vec4 tra_dat_in = texelFetch(transmit_data_tx, texel, 0);
ClosureDiffuse diffuse = gbuffer_load_diffuse_data(tra_col_in, tra_nor_in, tra_dat_in);
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 4030c16085d..3a596bed0a4 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
@@ -7,6 +7,9 @@
#pragma BLENDER_REQUIRE(eevee_nodetree_eval_lib.glsl)
#pragma BLENDER_REQUIRE(eevee_sampling_lib.glsl)
+/* TODO(fclem): Renderpasses. */
+#define output_renderpass(a, b, c, d)
+
void main(void)
{
g_data = init_globals();
@@ -21,49 +24,84 @@ void main(void)
nodetree_surface();
- float alpha = saturate(1.0 - avg(g_transparency_data.transmittance));
- vec3 V = cameraVec(g_data.P);
+ out_transmittance = vec4(1.0 - g_transparency_data.holdout);
+ float transmittance_mono = saturate(avg(g_transparency_data.transmittance));
+#if 1 /* TODO(fclem): Alpha clipped materials. */
- if (alpha > 0.0) {
+ /* Apply transmittance. */
+ out_transmittance *= vec4(g_transparency_data.transmittance, transmittance_mono);
+#else
+ /* Stochastique monochromatic transmittance.
+ * Pixels are discarded based on alpha. We need to compensate the applied transmittance
+ * term on all radiance channels. */
+ if (transmittance_mono < 1.0) {
+ float alpha = 1.0 - transmittance_mono;
g_diffuse_data.color /= alpha;
g_reflection_data.color /= alpha;
g_refraction_data.color /= alpha;
g_emission_data.emission /= alpha;
}
+#endif
+ out_radiance = vec4(g_emission_data.emission, g_transparency_data.holdout);
+
+#ifdef MATERIAL_EMISSION
+ output_renderpass(rpass_emission, transmittance, vec4(g_emission_data.emission, 0.0));
+#endif
+
+#ifdef MATERIAL_VOLUME
+ output_renderpass(rpass_volume_light, transmittance, vec4(, 0.0));
+#endif
if (gl_FrontFacing) {
g_refraction_data.ior = safe_rcp(g_refraction_data.ior);
}
+ vec3 V = cameraVec(g_data.P);
g_reflection_data.N = ensure_valid_reflection(g_data.Ng, V, g_reflection_data.N);
- {
- out_reflection_color = g_reflection_data.color;
- out_reflection_normal.xy = gbuffer_encode_normal(g_reflection_data.N);
- out_reflection_normal.z = max(1e-4, g_reflection_data.roughness);
+ ivec2 out_texel = ivec2(gl_FragCoord.xy);
+
+ if (true) {
+ vec4 out_color;
+ out_color.xyz = g_reflection_data.color;
+ imageStore(gbuff_reflection_color, out_texel, out_color);
+
+ vec4 out_normal;
+ out_normal.xy = gbuffer_encode_normal(g_reflection_data.N);
+ out_normal.z = max(1e-4, g_reflection_data.roughness);
+ imageStore(gbuff_reflection_normal, out_texel, out_normal);
}
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.z = -1.0;
- out_transmit_normal.w = thickness;
- out_transmit_data.x = g_refraction_data.ior;
- out_transmit_data.y = g_refraction_data.roughness;
+ vec4 out_color;
+ out_color.xyz = g_refraction_data.color;
+ imageStore(gbuff_transmit_color, out_texel, out_color);
+
+ vec4 out_normal;
+ out_normal.xy = gbuffer_encode_normal(g_refraction_data.N);
+ out_normal.z = -1.0;
+ out_normal.w = thickness;
+ imageStore(gbuff_transmit_normal, out_texel, out_normal);
+
+ vec4 out_data;
+ out_data.x = g_refraction_data.ior;
+ out_data.y = g_refraction_data.roughness;
+ imageStore(gbuff_transmit_data, out_texel, out_data);
}
else {
- if (g_diffuse_data.sss_id == 1u) {
- g_diffuse_data.sss_id = uint(resource_handle + 1);
- }
/* Output diffuse / SSS in transmit data. */
- out_transmit_color = g_diffuse_data.color;
- out_transmit_normal.xy = gbuffer_encode_normal(g_diffuse_data.N);
- out_transmit_normal.z = fract(float(g_diffuse_data.sss_id) / 1024.0);
- out_transmit_normal.w = thickness;
- out_transmit_data = g_diffuse_data.sss_radius;
- }
+ vec4 out_color;
+ out_color.xyz = g_diffuse_data.color;
+ imageStore(gbuff_transmit_color, out_texel, out_color);
+
+ vec4 out_normal;
+ out_normal.xy = gbuffer_encode_normal(g_diffuse_data.N);
+ out_normal.z = (g_diffuse_data.sss_id == 1u) ? fract(float(resource_handle + 1) / 1024.0) : 0;
+ out_normal.w = thickness;
+ imageStore(gbuff_transmit_normal, out_texel, out_normal);
- out_volume_data = gbuffer_store_volume_data(g_volume_data);
- out_emission_data = gbuffer_store_emission_data(g_emission_data);
- out_transparency_data = gbuffer_store_transparency_data(g_transparency_data);
+ vec4 out_data;
+ out_data.xyz = g_diffuse_data.sss_radius;
+ imageStore(gbuff_transmit_data, out_texel, out_data);
+ }
}
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_volume_deferred_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_volume_deferred_frag.glsl
index d20f9b0fb57..b20bd50a20b 100644
--- a/source/blender/draw/engines/eevee/shaders/eevee_volume_deferred_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/eevee_volume_deferred_frag.glsl
@@ -61,7 +61,4 @@ void main(void)
g_transparency_data.transmittance = vec3(1.0);
g_transparency_data.holdout = 0.0;
-
- out_volume_data = gbuffer_store_volume_data(g_volume_data);
- out_transparency_data = gbuffer_store_transparency_data(g_transparency_data);
}
diff --git a/source/blender/draw/engines/eevee/shaders/infos/eevee_culling_info.hh b/source/blender/draw/engines/eevee/shaders/infos/eevee_culling_info.hh
index 8a76a3a13cd..4ba152c131e 100644
--- a/source/blender/draw/engines/eevee/shaders/infos/eevee_culling_info.hh
+++ b/source/blender/draw/engines/eevee/shaders/infos/eevee_culling_info.hh
@@ -54,7 +54,7 @@ GPU_SHADER_CREATE_INFO(eevee_light_data)
GPU_SHADER_CREATE_INFO(eevee_culling_debug)
.do_static_compilation(true)
- .sampler(0, ImageType::DEPTH_2D, "depth_tx")
+ .sampler(0, ImageType::FLOAT_2D, "hiz_tx")
.fragment_out(0, Type::VEC4, "out_debug_color")
.additional_info("eevee_shared", "draw_view")
.fragment_source("eevee_culling_debug_frag.glsl")
diff --git a/source/blender/draw/engines/eevee/shaders/infos/eevee_deferred_info.hh b/source/blender/draw/engines/eevee/shaders/infos/eevee_deferred_info.hh
index 7a438b14f44..6c22249349e 100644
--- a/source/blender/draw/engines/eevee/shaders/infos/eevee_deferred_info.hh
+++ b/source/blender/draw/engines/eevee/shaders/infos/eevee_deferred_info.hh
@@ -7,82 +7,36 @@
GPU_SHADER_CREATE_INFO(eevee_utility_texture).sampler(8, ImageType::FLOAT_2D_ARRAY, "utility_tx");
-GPU_SHADER_CREATE_INFO(eevee_deferred_direct)
+#define image_out(slot, qualifier, format, name) \
+ image(slot, format, qualifier, ImageType::FLOAT_2D, name, Frequency::PASS)
+
+GPU_SHADER_CREATE_INFO(eevee_deferred_eval)
.do_static_compilation(true)
.auto_resource_location(true)
.sampler(0, ImageType::FLOAT_2D, "hiz_tx")
- .sampler(1, ImageType::FLOAT_2D, "emission_data_tx")
.sampler(2, ImageType::FLOAT_2D, "transmit_color_tx")
.sampler(3, ImageType::FLOAT_2D, "transmit_normal_tx")
.sampler(4, ImageType::FLOAT_2D, "transmit_data_tx")
.sampler(5, ImageType::FLOAT_2D, "reflect_color_tx")
.sampler(6, ImageType::FLOAT_2D, "reflect_normal_tx")
.fragment_out(0, Type::VEC4, "out_combined")
- .fragment_out(1, Type::VEC4, "out_diffuse")
- .fragment_out(2, Type::VEC3, "out_specular")
+ /* Renderpasses. */
+ // .image_out(0, Qualifier::READ_WRITE, GPU_RGBA16F, "rpass_diffuse_light")
+ // .image_out(1, Qualifier::READ_WRITE, GPU_RGBA16F, "rpass_specular_light")
+ /* Raytracing. */
+ // .image_out(2, Qualifier::WRITE, GPU_RGBA16F, "ray_data")
+ /* SubSurfaceScattering. */
+ // .image_out(3, Qualifier::WRITE, GPU_RGBA16F, "sss_radiance")
.additional_info("eevee_shared", "draw_view")
- .fragment_source("eevee_deferred_direct_frag.glsl")
+ .fragment_source("eevee_deferred_eval_frag.glsl")
.additional_info("draw_fullscreen",
"eevee_transmittance_data",
"eevee_utility_texture",
- "eevee_lightprobe_data",
+ // "eevee_lightprobe_data",
"eevee_light_data",
"eevee_shadow_data",
"eevee_sampling_data");
-/** \} */
-
-/* -------------------------------------------------------------------- */
-/** \name Holdout
- * \{ */
-
-GPU_SHADER_CREATE_INFO(eevee_deferred_holdout)
- .do_static_compilation(true)
- .sampler(0, ImageType::FLOAT_2D, "combined_tx")
- .sampler(1, ImageType::FLOAT_2D, "transparency_data_tx")
- .fragment_out(5, Type::VEC3, "out_holdout")
- .additional_info("eevee_shared")
- .fragment_source("eevee_deferred_holdout_frag.glsl")
- .additional_info("draw_fullscreen", "draw_view");
-
-/** \} */
-
-/* -------------------------------------------------------------------- */
-/** \name Transparency
- * \{ */
-
-GPU_SHADER_CREATE_INFO(eevee_deferred_transparent)
- .do_static_compilation(true)
- .sampler(0, ImageType::UINT_2D, "volume_data_tx")
- .sampler(1, ImageType::FLOAT_2D, "transparency_data_tx")
- .fragment_out(0, Type::VEC4, "out_combined")
- .fragment_out(1, Type::VEC3, "out_diffuse")
- .fragment_out(2, Type::VEC3, "out_specular")
- .fragment_out(3, Type::VEC3, "out_volume")
- .fragment_out(4, Type::VEC3, "out_background")
- .fragment_out(5, Type::VEC3, "out_holdout")
- .additional_info("eevee_shared")
- .fragment_source("eevee_deferred_transparent_frag.glsl")
- .additional_info("draw_fullscreen", "draw_view", "eevee_light_data");
-
-/** \} */
-
-/* -------------------------------------------------------------------- */
-/** \name Volume
- * \{ */
-
-GPU_SHADER_CREATE_INFO(eevee_deferred_volume)
- .do_static_compilation(true)
- .sampler(0, ImageType::FLOAT_2D, "transparency_data_tx")
- .sampler(1, ImageType::UINT_2D, "volume_data_tx")
- .fragment_out(0, Type::VEC4, "out_combined")
- .fragment_out(1, Type::VEC3, "out_volume")
- .additional_info("eevee_shared")
- .fragment_source("eevee_deferred_volume_frag.glsl")
- .additional_info("draw_fullscreen",
- "draw_view",
- "eevee_utility_texture",
- "eevee_light_data",
- "eevee_shadow_data");
+#undef image_out
/** \} */
diff --git a/source/blender/draw/engines/eevee/shaders/infos/eevee_material_info.hh b/source/blender/draw/engines/eevee/shaders/infos/eevee_material_info.hh
index 0b310d7c309..c2bd8805aa2 100644
--- a/source/blender/draw/engines/eevee/shaders/infos/eevee_material_info.hh
+++ b/source/blender/draw/engines/eevee/shaders/infos/eevee_material_info.hh
@@ -64,29 +64,31 @@ GPU_SHADER_INTERFACE_INFO(eevee_surface_iface, "interp")
.smooth(Type::FLOAT, "hair_thickness")
.flat(Type::INT, "hair_strand_id");
+#define image_out(slot, qualifier, format, name) \
+ image(slot, format, qualifier, ImageType::FLOAT_2D, name, Frequency::PASS)
+
GPU_SHADER_CREATE_INFO(eevee_surface_deferred)
.vertex_out(eevee_surface_iface)
- /* Diffuse or Transmission Color. */
- .fragment_out(0, Type::VEC3, "out_transmit_color")
- /* RG: Normal (negative if Tranmission), B: SSS ID, A: Min-Thickness */
- .fragment_out(1, Type::VEC4, "out_transmit_normal")
- /* RGB: SSS RGB Radius.
- * or
- * R: Transmission IOR, G: Transmission Roughness, B: Unused. */
- .fragment_out(2, Type::VEC3, "out_transmit_data")
- /* Reflection Color. */
- .fragment_out(3, Type::VEC3, "out_reflection_color")
- /* RG: Normal, B: Roughness X, A: Roughness Y. */
- .fragment_out(4, Type::VEC4, "out_reflection_normal")
- /* Volume Emission, Absorption, Scatter, Phase. */
- .fragment_out(5, Type::UVEC4, "out_volume_data")
- /* Emission. */
- .fragment_out(6, Type::VEC3, "out_emission_data")
- /* Transparent BSDF, Holdout. */
- .fragment_out(7, Type::VEC4, "out_transparency_data")
+ /* Note: This removes the possibility of using gl_FragDepth. */
+ .early_fragment_test(true)
+ /* Direct output. */
+ .fragment_out(0, Type::VEC4, "out_radiance", DualBlend::SRC_0)
+ .fragment_out(0, Type::VEC4, "out_transmittance", DualBlend::SRC_1)
+ /* Gbuffer. */
+ .image_out(0, Qualifier::WRITE, GPU_R11F_G11F_B10F, "gbuff_transmit_color")
+ .image_out(1, Qualifier::WRITE, GPU_R11F_G11F_B10F, "gbuff_transmit_data")
+ .image_out(2, Qualifier::WRITE, GPU_RGBA16F, "gbuff_transmit_normal")
+ .image_out(3, Qualifier::WRITE, GPU_R11F_G11F_B10F, "gbuff_reflection_color")
+ .image_out(4, Qualifier::WRITE, GPU_RGBA16F, "gbuff_reflection_normal")
+ /* Renderpasses. */
+ .image_out(5, Qualifier::READ_WRITE, GPU_RGBA16F, "rpass_emission")
+ .image_out(6, Qualifier::READ_WRITE, GPU_RGBA16F, "rpass_volume_light")
+ /* TODO: AOVs maybe? */
.fragment_source("eevee_surface_deferred_frag.glsl")
.additional_info("eevee_sampling_data", "eevee_utility_texture");
+#undef image_out
+
GPU_SHADER_CREATE_INFO(eevee_surface_forward)
.auto_resource_location(true)
.vertex_out(eevee_surface_iface)
diff --git a/source/blender/draw/engines/eevee/shaders/infos/eevee_shadow_info.hh b/source/blender/draw/engines/eevee/shaders/infos/eevee_shadow_info.hh
index d68bcc3db98..efb93e745a3 100644
--- a/source/blender/draw/engines/eevee/shaders/infos/eevee_shadow_info.hh
+++ b/source/blender/draw/engines/eevee/shaders/infos/eevee_shadow_info.hh
@@ -182,7 +182,7 @@ GPU_SHADER_CREATE_INFO(eevee_shadow_debug)
.storage_buf(0, Qualifier::READ, "ShadowTileMapData", "tilemaps_buf[]")
.storage_buf(1, Qualifier::READ, "uvec2", "pages_cached_buf[]")
.storage_buf(2, Qualifier::READ, "ShadowPagesInfoData", "pages_infos_buf")
- .sampler(0, ImageType::DEPTH_2D, "depth_tx")
+ .sampler(0, ImageType::FLOAT_2D, "hiz_tx")
.sampler(1, ImageType::FLOAT_2D, "atlas_tx")
.sampler(2, ImageType::UINT_2D, "tilemaps_tx")
.sampler(3, ImageType::UINT_2D, "debug_page_tx")