diff --git a/source/blender/draw/engines/eevee_next/eevee_motion_blur.cc b/source/blender/draw/engines/eevee_next/eevee_motion_blur.cc index 45086691d9c..5875f21aa30 100644 --- a/source/blender/draw/engines/eevee_next/eevee_motion_blur.cc +++ b/source/blender/draw/engines/eevee_next/eevee_motion_blur.cc @@ -243,19 +243,8 @@ void MotionBlurModule::render(View &view, GPUTexture **input_tx, GPUTexture **ou tile_indirection_buf_.clear_to_zero(); - const bool do_motion_vectors_swizzle = inst_.render_buffers.vector_tx_format() == GPU_RG16F; - if (do_motion_vectors_swizzle) { - /* Change texture swizzling to avoid complexity in gather pass shader. */ - GPU_texture_swizzle_set(inst_.render_buffers.vector_tx, "rgrg"); - } - inst_.manager->submit(motion_blur_ps_, view); - if (do_motion_vectors_swizzle) { - /* Reset swizzle since this texture might be reused in other places. */ - GPU_texture_swizzle_set(inst_.render_buffers.vector_tx, "rgba"); - } - tiles_tx_.release(); DRW_stats_group_end(); diff --git a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc index e7a594107d0..2e8aa1b4c64 100644 --- a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc +++ b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc @@ -82,6 +82,12 @@ void RenderBuffers::acquire(int2 extent) /* TODO(fclem): Make vector pass allocation optional if no TAA or motion blur is needed. */ vector_tx.acquire(extent, vector_tx_format(), usage_attachment_read_write); + const bool do_motion_vectors_swizzle = vector_tx_format() == GPU_RG16F; + if (do_motion_vectors_swizzle) { + /* Change texture swizzling to avoid complexity in shaders. */ + GPU_texture_swizzle_set(vector_tx, "rgrg"); + } + int color_len = data.color_len + data.aovs.color_len; int value_len = data.value_len + data.aovs.value_len; @@ -117,18 +123,25 @@ void RenderBuffers::release() // depth_tx.release(); combined_tx.release(); + const bool do_motion_vectors_swizzle = vector_tx_format() == GPU_RG16F; + if (do_motion_vectors_swizzle) { + /* Reset swizzle since this texture might be reused in other places. */ + GPU_texture_swizzle_set(vector_tx, "rgba"); + } vector_tx.release(); + cryptomatte_tx.release(); } eGPUTextureFormat RenderBuffers::vector_tx_format() { const eViewLayerEEVEEPassType enabled_passes = inst_.film.enabled_passes_get(); - bool do_vector_render_pass = (enabled_passes & EEVEE_RENDER_PASS_VECTOR) || - (inst_.motion_blur.postfx_enabled() && !inst_.is_viewport()); + bool do_full_vector_render_pass = ((enabled_passes & EEVEE_RENDER_PASS_VECTOR) || + inst_.motion_blur.postfx_enabled()) && + !inst_.is_viewport(); - /* Only RG16F when only doing only reprojection or motion blur. */ - return do_vector_render_pass ? GPU_RGBA16F : GPU_RG16F; + /* Only RG16F (motion.prev) for the viewport. */ + return do_full_vector_render_pass ? GPU_RGBA16F : GPU_RG16F; } } // namespace blender::eevee diff --git a/source/blender/draw/engines/eevee_next/eevee_velocity.cc b/source/blender/draw/engines/eevee_next/eevee_velocity.cc index 2c94613e404..17fdebef400 100644 --- a/source/blender/draw/engines/eevee_next/eevee_velocity.cc +++ b/source/blender/draw/engines/eevee_next/eevee_velocity.cc @@ -167,10 +167,15 @@ bool VelocityModule::step_object_sync(ObjectKey &object_key, object_steps[STEP_PREVIOUS]->get_or_resize( vel.obj.ofs[STEP_PREVIOUS]) = ob->object_to_world(); } - /* STEP_NEXT is not used in viewport. */ - if (vel.obj.ofs[STEP_NEXT] == -1 && !inst_.is_viewport()) { - vel.obj.ofs[STEP_NEXT] = object_steps_usage[STEP_NEXT]++; - object_steps[STEP_NEXT]->get_or_resize(vel.obj.ofs[STEP_NEXT]) = ob->object_to_world(); + if (vel.obj.ofs[STEP_NEXT] == -1) { + if (inst_.is_viewport()) { + /* Just set it to 0. motion.next is not meant to be valid in the viewport. */ + vel.obj.ofs[STEP_NEXT] = 0; + } + else { + vel.obj.ofs[STEP_NEXT] = object_steps_usage[STEP_NEXT]++; + object_steps[STEP_NEXT]->get_or_resize(vel.obj.ofs[STEP_NEXT]) = ob->object_to_world(); + } } } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_velocity_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_velocity_lib.glsl index f33b26a9a83..683167cbe09 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_velocity_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_velocity_lib.glsl @@ -128,6 +128,7 @@ void velocity_local_pos_get(vec3 lP, int vert_id, out vec3 lP_prev, out vec3 lP_ /** * Given a triple of position, compute the previous and next motion vectors. * Returns a tuple of world space motion deltas. + * WARNING: The returned motion_next is invalid when rendering the viewport. */ void velocity_vertex( vec3 lP_prev, vec3 lP, vec3 lP_next, out vec3 motion_prev, out vec3 motion_next) diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_velocity_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_velocity_info.hh index 60d3a1fdc16..613c62e70a4 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_velocity_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_velocity_info.hh @@ -24,7 +24,8 @@ * \{ */ /* Pass world space deltas to the fragment shader. - * This is to make sure that the resulting motion vectors are valid even with displacement. */ + * This is to make sure that the resulting motion vectors are valid even with displacement. + * WARNING: The next value is invalid when rendering the viewport. */ GPU_SHADER_NAMED_INTERFACE_INFO(eevee_velocity_surface_iface, motion) SMOOTH(VEC3, prev) SMOOTH(VEC3, next)