From b3bf8a4e053dfae6864b1ee02cf6bc03d33dfe8d Mon Sep 17 00:00:00 2001 From: Miguel Pozo Date: Mon, 11 Sep 2023 20:14:04 +0200 Subject: [PATCH] EEVEE-Next: Add back data passes UI and missing passes The `VIEWLAYER_PT_eevee_next_layer_passes_data` class name was re-used by mistake for Workbench Next in ba982119cd, and the actual EEVEE Next class was then removed in 678dc456e3. This adds back the UI as it was, and the missing passes (Vector and Position) it referenced. Pull Request: https://projects.blender.org/blender/blender/pulls/112162 --- .../startup/bl_ui/properties_view_layer.py | 26 +++++++++++++++++++ .../draw/engines/eevee_next/eevee_film.cc | 3 +++ .../draw/engines/eevee_next/eevee_film.hh | 17 +++++++----- .../draw/engines/eevee_next/eevee_instance.cc | 5 +++- .../engines/eevee_next/eevee_renderbuffers.cc | 1 + .../engines/eevee_next/eevee_shader_shared.hh | 5 +++- .../eevee_next/shaders/eevee_film_lib.glsl | 17 ++++++++---- .../shaders/eevee_surf_deferred_frag.glsl | 1 + .../shaders/eevee_surf_forward_frag.glsl | 1 + .../shaders/eevee_surf_world_frag.glsl | 1 + source/blender/makesdna/DNA_layer_types.h | 3 ++- 11 files changed, 66 insertions(+), 14 deletions(-) diff --git a/scripts/startup/bl_ui/properties_view_layer.py b/scripts/startup/bl_ui/properties_view_layer.py index 03491e72ff7..f7eb217162a 100644 --- a/scripts/startup/bl_ui/properties_view_layer.py +++ b/scripts/startup/bl_ui/properties_view_layer.py @@ -78,6 +78,31 @@ class VIEWLAYER_PT_eevee_layer_passes_data(ViewLayerButtonsPanel, Panel): col.prop(view_layer, "use_pass_normal") +class VIEWLAYER_PT_eevee_next_layer_passes_data(ViewLayerButtonsPanel, Panel): + bl_label = "Data" + bl_parent_id = "VIEWLAYER_PT_layer_passes" + + COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'} + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + layout.use_property_decorate = False + + scene = context.scene + view_layer = context.view_layer + + col = layout.column() + col.prop(view_layer, "use_pass_combined") + col.prop(view_layer, "use_pass_z") + col.prop(view_layer, "use_pass_mist") + col.prop(view_layer, "use_pass_normal") + col.prop(view_layer, "use_pass_position") + sub = col.column() + sub.active = not scene.eevee.use_motion_blur + sub.prop(view_layer, "use_pass_vector") + + class VIEWLAYER_PT_workbench_layer_passes_data(ViewLayerButtonsPanel, Panel): bl_label = "Data" bl_parent_id = "VIEWLAYER_PT_layer_passes" @@ -269,6 +294,7 @@ classes = ( VIEWLAYER_PT_layer_passes, VIEWLAYER_PT_workbench_layer_passes_data, VIEWLAYER_PT_eevee_layer_passes_data, + VIEWLAYER_PT_eevee_next_layer_passes_data, VIEWLAYER_PT_eevee_layer_passes_light, VIEWLAYER_PT_eevee_layer_passes_effects, VIEWLAYER_PT_layer_passes_cryptomatte, diff --git a/source/blender/draw/engines/eevee_next/eevee_film.cc b/source/blender/draw/engines/eevee_next/eevee_film.cc index da6017d0a7d..5e8ce668bf7 100644 --- a/source/blender/draw/engines/eevee_next/eevee_film.cc +++ b/source/blender/draw/engines/eevee_next/eevee_film.cc @@ -176,6 +176,7 @@ static eViewLayerEEVEEPassType enabled_passes(const ViewLayer *view_layer) ENABLE_FROM_LEGACY(Z, Z) ENABLE_FROM_LEGACY(MIST, MIST) ENABLE_FROM_LEGACY(NORMAL, NORMAL) + ENABLE_FROM_LEGACY(POSITION, POSITION) ENABLE_FROM_LEGACY(SHADOW, SHADOW) ENABLE_FROM_LEGACY(AO, AO) ENABLE_FROM_LEGACY(EMIT, EMIT) @@ -283,6 +284,7 @@ void Film::init(const int2 &extent, const rcti *output_rect) } const eViewLayerEEVEEPassType data_passes = EEVEE_RENDER_PASS_Z | EEVEE_RENDER_PASS_NORMAL | + EEVEE_RENDER_PASS_POSITION | EEVEE_RENDER_PASS_VECTOR; const eViewLayerEEVEEPassType color_passes_1 = EEVEE_RENDER_PASS_DIFFUSE_LIGHT | EEVEE_RENDER_PASS_SPECULAR_LIGHT | @@ -328,6 +330,7 @@ void Film::init(const int2 &extent, const rcti *output_rect) data_.mist_id = pass_index_get(EEVEE_RENDER_PASS_MIST); data_.normal_id = pass_index_get(EEVEE_RENDER_PASS_NORMAL); + data_.position_id = pass_index_get(EEVEE_RENDER_PASS_POSITION); data_.vector_id = pass_index_get(EEVEE_RENDER_PASS_VECTOR); data_.diffuse_light_id = pass_index_get(EEVEE_RENDER_PASS_DIFFUSE_LIGHT); data_.diffuse_color_id = pass_index_get(EEVEE_RENDER_PASS_DIFFUSE_COLOR); diff --git a/source/blender/draw/engines/eevee_next/eevee_film.hh b/source/blender/draw/engines/eevee_next/eevee_film.hh index 5c79f74aff2..e1c84b21029 100644 --- a/source/blender/draw/engines/eevee_next/eevee_film.hh +++ b/source/blender/draw/engines/eevee_next/eevee_film.hh @@ -143,7 +143,7 @@ class Film { static bool pass_is_float3(eViewLayerEEVEEPassType pass_type) { return pass_storage_type(pass_type) == PASS_STORAGE_COLOR && - pass_type != EEVEE_RENDER_PASS_COMBINED; + !ELEM(pass_type, EEVEE_RENDER_PASS_COMBINED, EEVEE_RENDER_PASS_VECTOR); } /* Returns layer offset in the accumulation texture. -1 if the pass is not enabled. */ @@ -158,6 +158,10 @@ class Film { return data_.mist_id; case EEVEE_RENDER_PASS_NORMAL: return data_.normal_id; + case EEVEE_RENDER_PASS_POSITION: + return data_.position_id; + case EEVEE_RENDER_PASS_VECTOR: + return data_.vector_id; case EEVEE_RENDER_PASS_DIFFUSE_LIGHT: return data_.diffuse_light_id; case EEVEE_RENDER_PASS_DIFFUSE_COLOR: @@ -182,8 +186,6 @@ class Film { return data_.cryptomatte_asset_id; case EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL: return data_.cryptomatte_material_id; - case EEVEE_RENDER_PASS_VECTOR: - return data_.vector_id; default: return -1; } @@ -219,6 +221,12 @@ class Film { case EEVEE_RENDER_PASS_NORMAL: result.append(RE_PASSNAME_NORMAL); break; + case EEVEE_RENDER_PASS_POSITION: + result.append(RE_PASSNAME_POSITION); + break; + case EEVEE_RENDER_PASS_VECTOR: + result.append(RE_PASSNAME_VECTOR); + break; case EEVEE_RENDER_PASS_DIFFUSE_LIGHT: result.append(RE_PASSNAME_DIFFUSE_DIRECT); break; @@ -255,9 +263,6 @@ class Film { case EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL: build_cryptomatte_passes(RE_PASSNAME_CRYPTOMATTE_MATERIAL); break; - case EEVEE_RENDER_PASS_VECTOR: - result.append(RE_PASSNAME_VECTOR); - break; default: BLI_assert(0); break; diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.cc b/source/blender/draw/engines/eevee_next/eevee_instance.cc index f8bc955c9d4..a8d6db72acd 100644 --- a/source/blender/draw/engines/eevee_next/eevee_instance.cc +++ b/source/blender/draw/engines/eevee_next/eevee_instance.cc @@ -350,7 +350,8 @@ void Instance::render_sample() void Instance::render_read_result(RenderLayer *render_layer, const char *view_name) { eViewLayerEEVEEPassType pass_bits = film.enabled_passes_get(); - for (auto i : IndexRange(EEVEE_RENDER_PASS_MAX_BIT)) { + + for (auto i : IndexRange(EEVEE_RENDER_PASS_MAX_BIT + 1)) { eViewLayerEEVEEPassType pass_type = eViewLayerEEVEEPassType(pass_bits & (1 << i)); if (pass_type == 0) { continue; @@ -498,6 +499,8 @@ void Instance::update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view CHECK_PASS_LEGACY(Z, SOCK_FLOAT, 1, "Z"); CHECK_PASS_LEGACY(MIST, SOCK_FLOAT, 1, "Z"); CHECK_PASS_LEGACY(NORMAL, SOCK_VECTOR, 3, "XYZ"); + CHECK_PASS_LEGACY(POSITION, SOCK_VECTOR, 3, "XYZ"); + CHECK_PASS_LEGACY(VECTOR, SOCK_VECTOR, 4, "XYZW"); CHECK_PASS_LEGACY(DIFFUSE_DIRECT, SOCK_RGBA, 3, "RGB"); CHECK_PASS_LEGACY(DIFFUSE_COLOR, SOCK_RGBA, 3, "RGB"); CHECK_PASS_LEGACY(GLOSSY_DIRECT, SOCK_RGBA, 3, "RGB"); diff --git a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc index 77497747a62..f6f87bc2cc0 100644 --- a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc +++ b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc @@ -40,6 +40,7 @@ void RenderBuffers::sync() }; data.normal_id = pass_index_get(EEVEE_RENDER_PASS_NORMAL, EEVEE_RENDER_PASS_AO); + data.position_id = pass_index_get(EEVEE_RENDER_PASS_POSITION); data.diffuse_light_id = pass_index_get(EEVEE_RENDER_PASS_DIFFUSE_LIGHT); data.diffuse_color_id = pass_index_get(EEVEE_RENDER_PASS_DIFFUSE_COLOR); data.specular_light_id = pass_index_get(EEVEE_RENDER_PASS_SPECULAR_LIGHT); diff --git a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh index a91ac421593..59e4f7d79c4 100644 --- a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh +++ b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh @@ -267,12 +267,13 @@ struct FilmData { bool1 any_render_pass_2; /** Controlled by user in lookdev mode or by render settings. */ float background_opacity; - float _pad0, _pad1, _pad2; + float _pad0, _pad1; /** Output counts per type. */ int color_len, value_len; /** Index in color_accum_img or value_accum_img of each pass. -1 if pass is not enabled. */ int mist_id; int normal_id; + int position_id; int vector_id; int diffuse_light_id; int diffuse_color_id; @@ -364,6 +365,7 @@ struct RenderBuffersInfoData { /* Color. */ int color_len; int normal_id; + int position_id; int diffuse_light_id; int diffuse_color_id; int specular_light_id; @@ -375,6 +377,7 @@ struct RenderBuffersInfoData { int value_len; int shadow_id; int ambient_occlusion_id; + int _pad0, _pad1, _pad2; }; BLI_STATIC_ASSERT_ALIGN(RenderBuffersInfoData, 16) diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl index ffda13a5d14..6a1ada89649 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl @@ -647,15 +647,22 @@ void film_process_data(ivec2 texel_film, out vec4 out_color, out float out_depth FilmSample film_sample = film_sample_get(0, texel_film); if (uniform_buf.film.use_reprojection || film_sample.weight < film_distance) { - vec4 normal = texelFetch( - rp_color_tx, ivec3(film_sample.texel, uniform_buf.render_pass.normal_id), 0); float depth = texelFetch(depth_tx, film_sample.texel, 0).x; vec4 vector = velocity_resolve(vector_tx, film_sample.texel, depth); - /* Transform to pixel space. */ - vector *= vec4(vec2(uniform_buf.film.render_extent), -vec2(uniform_buf.film.render_extent)); + /* Transform to pixel space, matching Cycles format. */ + vector *= vec4(vec2(uniform_buf.film.render_extent), vec2(uniform_buf.film.render_extent)); film_store_depth(texel_film, depth, out_depth); - film_store_data(texel_film, uniform_buf.film.normal_id, normal, out_color); + if (uniform_buf.film.normal_id != -1) { + vec4 normal = texelFetch( + rp_color_tx, ivec3(film_sample.texel, uniform_buf.render_pass.normal_id), 0); + film_store_data(texel_film, uniform_buf.film.normal_id, normal, out_color); + } + if (uniform_buf.film.position_id != -1) { + vec4 position = texelFetch( + rp_color_tx, ivec3(film_sample.texel, uniform_buf.render_pass.position_id), 0); + film_store_data(texel_film, uniform_buf.film.position_id, position, out_color); + } film_store_data(texel_film, uniform_buf.film.vector_id, vector, out_color); film_store_distance(texel_film, film_sample.weight); } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl index a520f615728..24e77fd55f6 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl @@ -77,6 +77,7 @@ void main() imageStore(rp_cryptomatte_img, out_texel, cryptomatte_output); } output_renderpass_color(uniform_buf.render_pass.normal_id, vec4(out_normal, 1.0)); + output_renderpass_color(uniform_buf.render_pass.position_id, vec4(g_data.P, 1.0)); output_renderpass_color(uniform_buf.render_pass.diffuse_color_id, vec4(g_diffuse_data.color, 1.0)); output_renderpass_color(uniform_buf.render_pass.specular_color_id, vec4(specular_color, 1.0)); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl index 6eaa066fe1f..153963976bd 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl @@ -121,6 +121,7 @@ void main() imageStore(rp_cryptomatte_img, out_texel, cryptomatte_output); } output_renderpass_color(uniform_buf.render_pass.normal_id, vec4(out_normal, 1.0)); + output_renderpass_color(uniform_buf.render_pass.position_id, vec4(g_data.P, 1.0)); output_renderpass_color(uniform_buf.render_pass.diffuse_color_id, vec4(g_diffuse_data.color, 1.0)); output_renderpass_color(uniform_buf.render_pass.diffuse_light_id, vec4(diffuse_light, 1.0)); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_world_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_world_frag.glsl index 0cbef0761d2..35a97c3eb8c 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_world_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_world_frag.glsl @@ -46,6 +46,7 @@ void main() vec4 clear_color = vec4(0.0, 0.0, 0.0, 1.0); output_renderpass_color(uniform_buf.render_pass.normal_id, clear_color); + output_renderpass_color(uniform_buf.render_pass.position_id, clear_color); output_renderpass_color(uniform_buf.render_pass.diffuse_light_id, clear_color); output_renderpass_color(uniform_buf.render_pass.specular_light_id, clear_color); output_renderpass_color(uniform_buf.render_pass.diffuse_color_id, clear_color); diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h index 114edfe8619..c7c431ceebe 100644 --- a/source/blender/makesdna/DNA_layer_types.h +++ b/source/blender/makesdna/DNA_layer_types.h @@ -45,8 +45,9 @@ typedef enum eViewLayerEEVEEPassType { EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL = (1 << 18), EEVEE_RENDER_PASS_VECTOR = (1 << 19), EEVEE_RENDER_PASS_TRANSPARENT = (1 << 20), + EEVEE_RENDER_PASS_POSITION = (1 << 21), } eViewLayerEEVEEPassType; -#define EEVEE_RENDER_PASS_MAX_BIT 20 +#define EEVEE_RENDER_PASS_MAX_BIT 21 ENUM_OPERATORS(eViewLayerEEVEEPassType, 1 << EEVEE_RENDER_PASS_MAX_BIT) /* #ViewLayerAOV.type */