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 */