33 const float background_opacity,
34 const float background_blur)
42 world_ps_.
push_constant(
"world_opacity_fade", background_opacity);
107 pass.material_set(manager, gpumat);
108 pass.push_constant(
"world_opacity_fade", 1.0f);
109 pass.push_constant(
"world_background_blur", 0.0f);
110 pass.push_constant(
"world_coord_packed",
int4(0.0f));
112 pass.bind_image(
"rp_normal_img", dummy_renderpass_tx_);
113 pass.bind_image(
"rp_light_img", dummy_renderpass_tx_);
114 pass.bind_image(
"rp_diffuse_color_img", dummy_renderpass_tx_);
115 pass.bind_image(
"rp_specular_color_img", dummy_renderpass_tx_);
116 pass.bind_image(
"rp_emission_img", dummy_renderpass_tx_);
117 pass.bind_image(
"rp_cryptomatte_img", dummy_cryptomatte_tx_);
118 pass.bind_image(
"rp_color_img", dummy_aov_color_tx_);
119 pass.bind_image(
"rp_value_img", dummy_aov_value_tx_);
120 pass.bind_image(
"aov_color_img", dummy_aov_color_tx_);
121 pass.bind_image(
"aov_value_img", dummy_aov_value_tx_);
126 pass.bind_resources(inst_.
sampling);
171 is_valid_ = (sub !=
nullptr);
210 if (shadow_update_tbdr) {
219 pass.bind_ssbo(
"src_coord_buf", inst_.
shadows.src_coord_buf_);
231 if (!shadow_update_tbdr) {
238 pass.bind_resources(inst_.
sampling);
239 surface_double_sided_ps_ = &pass.
sub(
"Shadow.Surface.Double-Sided");
240 surface_single_sided_ps_ = &pass.
sub(
"Shadow.Surface.Single-Sided");
244 if (shadow_update_tbdr) {
258 pass.bind_ssbo(
"dst_coord_buf", inst_.
shadows.dst_coord_buf_);
259 pass.bind_ssbo(
"src_coord_buf", inst_.
shadows.src_coord_buf_);
267 surface_single_sided_ps_ :
268 surface_double_sided_ps_;
289 has_transparent_ =
false;
305 prepass_double_sided_static_ps_ = &prepass_ps_.
sub(
"DoubleSided.Static");
306 prepass_double_sided_static_ps_->
state_set(state_depth_only);
308 prepass_single_sided_static_ps_ = &prepass_ps_.
sub(
"SingleSided.Static");
311 prepass_double_sided_moving_ps_ = &prepass_ps_.
sub(
"DoubleSided.Moving");
312 prepass_double_sided_moving_ps_->
state_set(state_depth_color);
314 prepass_single_sided_moving_ps_ = &prepass_ps_.
sub(
"SingleSided.Moving");
333 opaque_single_sided_ps_ = &opaque_ps_.
sub(
"SingleSided");
337 opaque_double_sided_ps_ = &opaque_ps_.
sub(
"DoubleSided");
341 transparent_ps_.
init();
367 "Forward Transparent should be registered directly without calling "
368 "PipelineModule::material_add()");
370 (has_motion ? prepass_single_sided_moving_ps_ :
371 prepass_single_sided_static_ps_) :
372 (has_motion ? prepass_double_sided_moving_ps_ :
373 prepass_double_sided_static_ps_);
386 "Forward Transparent should be registered directly without calling "
387 "PipelineModule::material_add()");
389 opaque_double_sided_ps_;
405 has_transparent_ =
true;
406 float sorting_value =
math::dot(
float3(ob->object_to_world().location()), camera_forward_);
409 pass->material_set(*inst_.
manager, gpumat);
421 has_transparent_ =
true;
422 float sorting_value =
math::dot(
float3(ob->object_to_world().location()), camera_forward_);
425 pass->material_set(*inst_.
manager, gpumat);
434 if (!has_transparent_ && !has_opaque_) {
459 if (has_transparent_) {
561 bool next_layer_has_transmission)
566 const bool is_layer_refracted = (next_layer_has_transmission && has_any_closure);
569 use_raytracing_ = (has_transmit_closure || has_reflect_closure) &&
577 use_screen_transmission_ = use_raytracing_ && has_transmit_closure && !is_first_pass;
578 use_screen_reflection_ = use_raytracing_ && has_reflect_closure;
580 use_split_radiance_ = use_raytracing_ || (use_clamp_direct_ || use_clamp_indirect_);
581 use_feedback_output_ = (use_raytracing_ || is_layer_refracted) &&
582 (!is_last_pass || use_screen_reflection_);
618 set_bit(StencilBits::CLOSURE_COUNT_0);
621 set_bit(StencilBits::CLOSURE_COUNT_1);
624 set_bit(StencilBits::TRANSMISSION);
647 uint8_t(StencilBits::THICKNESS_FROM_SHADOW);
654 const bool use_split_indirect = !use_raytracing_ && use_split_radiance_;
678 sub.
bind_image(
"direct_radiance_1_img", &direct_radiance_txs_[0]);
679 sub.
bind_image(
"direct_radiance_2_img", &direct_radiance_txs_[1]);
680 sub.
bind_image(
"direct_radiance_3_img", &direct_radiance_txs_[2]);
693 uint8_t(StencilBits::CLOSURE_COUNT_1) |
694 uint8_t(StencilBits::TRANSMISSION);
697 if (use_transmission) {
714 pass.specialize_constant(sh,
715 "render_pass_diffuse_light_enabled",
718 pass.specialize_constant(sh,
719 "render_pass_specular_light_enabled",
722 pass.specialize_constant(sh,
"use_split_radiance", use_split_radiance_);
723 pass.specialize_constant(
724 sh,
"use_radiance_feedback", use_feedback_output_ && use_clamp_direct_);
725 pass.specialize_constant(sh,
"render_pass_normal_enabled", rbuf_data.
normal_id != -1);
730 pass.state_stencil(0x0u, 0x0u,
uint8_t(StencilBits::HEADER_BITS));
731 pass.bind_texture(
"direct_radiance_1_tx", &direct_radiance_txs_[0]);
732 pass.bind_texture(
"direct_radiance_2_tx", &direct_radiance_txs_[1]);
733 pass.bind_texture(
"direct_radiance_3_tx", &direct_radiance_txs_[2]);
734 pass.bind_texture(
"indirect_radiance_1_tx", &indirect_result_.
closures[0]);
735 pass.bind_texture(
"indirect_radiance_2_tx", &indirect_result_.
closures[1]);
736 pass.bind_texture(
"indirect_radiance_3_tx", &indirect_result_.
closures[2]);
739 pass.bind_image(
"radiance_feedback_img", &radiance_feedback_tx_);
740 pass.bind_resources(inst_.
gbuffer);
785 uint8_t material_stencil_bits = 0u;
786 if (use_thickness_from_shadow) {
787 material_stencil_bits |=
uint8_t(StencilBits::THICKNESS_FROM_SHADOW);
791 material_pass->
state_stencil(0xFFu, material_stencil_bits, 0xFFu);
793 return material_pass;
803 GPUTexture *radiance_behind_tx)
815 if (use_screen_transmission_) {
834 for (
int i = 0; i <
ARRAY_SIZE(direct_radiance_txs_); i++) {
835 direct_radiance_txs_[i].
acquire(
839 if (use_raytracing_) {
841 rt_buffer, radiance_behind_tx,
closure_bits_, main_view, render_view);
843 else if (use_split_radiance_) {
856 radiance_feedback_tx_ = rt_buffer.
feedback_ensure(!use_feedback_output_, extent);
858 if (use_feedback_output_ && use_clamp_direct_) {
867 if (use_feedback_output_ && !use_clamp_direct_) {
874 for (
int i = 0; i <
ARRAY_SIZE(direct_radiance_txs_); i++) {
875 direct_radiance_txs_[i].
release();
880 return use_feedback_output_ ? radiance_feedback_tx_ :
nullptr;
893 Instance &inst = opaque_layer_.inst_;
896 use_combined_lightprobe_eval = !use_raytracing;
910void DeferredPipeline::debug_pass_sync()
912 Instance &inst = opaque_layer_.inst_;
924 pass.push_constant(
"debug_mode",
int(inst.
debug_mode));
925 pass.bind_resources(inst.
gbuffer);
931 Instance &inst = opaque_layer_.inst_;
941 inst.
info_append(
"Debug Mode: Deferred Lighting Cost");
944 inst.
info_append(
"Debug Mode: Gbuffer Storage Cost");
960 return refraction_layer_.
prepass_add(blender_mat, gpumat, has_motion);
963 return opaque_layer_.
prepass_add(blender_mat, gpumat, has_motion);
970 return refraction_layer_.
material_add(blender_mat, gpumat);
986 GPUTexture *feedback_tx =
nullptr;
989 feedback_tx = opaque_layer_.
render(main_view,
995 rt_buffer_opaque_layer,
1000 feedback_tx = refraction_layer_.
render(main_view,
1006 rt_buffer_refract_layer,
1020 object_bounds_.clear();
1021 combined_screen_bounds_ = std::nullopt;
1037 pass.bind_resources(inst_.
sampling);
1038 occupancy_ps_ = &pass;
1044 pass.state_stencil(0x1u, 0x1u, 0x1u);
1049 pass.bind_resources(inst_.
sampling);
1050 material_ps_ = &pass;
1055 const ::Material *blender_mat,
1059 "Only volume material should be added here");
1067 pass->push_constant(
"use_fast_method", use_fast_occupancy);
1072 const ::Material * ,
1076 "Only volume material should be added here");
1097 for (
const std::optional<
Bounds<float2>> &other_aabb : object_bounds_) {
1138 object_integration_range_ = std::nullopt;
1139 has_scatter_ =
false;
1140 has_absorption_ =
false;
1141 for (
auto &layer : layers_) {
1148 for (
auto &layer : layers_) {
1149 layer->render(view, occupancy_tx);
1156 const float4x4 &view_matrix = camera.data_get().viewmat;
1159 const float4x4 &projection_matrix = camera.data_get().winmat;
1176 if (camera.is_perspective() && vs_corner.z >= 1.0e-8f) {
1194 for (
auto &layer : layers_) {
1195 if (!layer->bounds_overlaps(object_bounds)) {
1196 layer->add_object_bound(object_bounds);
1201 int64_t index = layers_.append_and_get_index(std::make_unique<VolumeLayer>(inst_));
1202 (*layers_[index]).add_object_bound(object_bounds);
1203 return layers_[index].get();
1208 return object_integration_range_;
1213 for (
auto &layer : layers_) {
1214 if (layer->use_hit_list) {
1240 pass.bind_resources(inst_.
velocity);
1241 pass.bind_resources(inst_.
sampling);
1266 pass.bind_resources(inst_.
gbuffer);
1267 pass.bind_resources(inst_.
lights);
1268 pass.bind_resources(inst_.
shadows);
1269 pass.bind_resources(inst_.
sampling);
1375 pass.bind_resources(inst_.
gbuffer);
1376 pass.bind_resources(inst_.
lights);
1377 pass.bind_resources(inst_.
shadows);
1378 pass.bind_resources(inst_.
sampling);
1428 GPUTexture *depth_layer_tx,
void BKE_boundbox_init_from_minmax(BoundBox *bb, const float min[3], const float max[3])
std::optional< blender::Bounds< blender::float3 > > BKE_object_boundbox_get(const Object *ob)
#define BLI_assert_msg(a, msg)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
MINLINE float square_f(float a)
MINLINE int count_bits_i(unsigned int n)
#define UNUSED_VARS_NDEBUG(...)
@ MA_BL_LIGHTPROBE_VOLUME_DOUBLE_SIDED
@ MA_BL_THICKNESS_FROM_SHADOW
@ MA_BL_CULL_BACKFACE_SHADOW
bool GPU_stencil_export_support()
bool GPU_stencil_clasify_buffer_workaround()
void GPU_debug_group_end()
void GPU_debug_group_begin(const char *name)
void GPU_framebuffer_bind(GPUFrameBuffer *framebuffer)
void GPU_framebuffer_clear_depth(GPUFrameBuffer *fb, float clear_depth)
GPUPass * GPU_material_get_pass(GPUMaterial *material)
bool GPU_material_flag_get(const GPUMaterial *mat, eGPUMaterialFlag flag)
eGPUMaterialStatus GPU_material_status(GPUMaterial *mat)
@ GPU_MATFLAG_VOLUME_SCATTER
@ GPU_MATFLAG_VOLUME_ABSORPTION
@ GPU_MATFLAG_TRANSPARENT
const char * GPU_material_get_name(GPUMaterial *material)
bool GPU_material_has_volume_output(GPUMaterial *mat)
@ GPU_BARRIER_TEXTURE_FETCH
@ GPU_BARRIER_SHADER_IMAGE_ACCESS
void GPU_texture_copy(GPUTexture *dst, GPUTexture *src)
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_SHADER_WRITE
struct GPUShader GPUShader
void submit(PassSimple &pass, View &view)
PassMain::Sub & sub(const char *name, float sorting_value)
void acquire(int2 extent, eGPUTextureFormat format, eGPUTextureUsage usage=GPU_TEXTURE_USAGE_GENERAL)
void clear(float4 values)
bool ensure_2d_array(eGPUTextureFormat format, int2 extent, int layers, eGPUTextureUsage usage=GPU_TEXTURE_USAGE_GENERAL, const float *data=nullptr, int mip_len=1)
bool ensure_2d(eGPUTextureFormat format, int2 extent, eGPUTextureUsage usage=GPU_TEXTURE_USAGE_GENERAL, const float *data=nullptr, int mip_len=1)
void bind_texture(const char *name, GPUTexture *texture, GPUSamplerState state=sampler_auto)
void bind_resources(U &resources)
void bind_image(const char *name, GPUTexture *image)
void specialize_constant(GPUShader *shader, const char *name, const float &data)
void clear_stencil(uint8_t stencil)
void subpass_transition(GPUAttachmentState depth_attachment, Span< GPUAttachmentState > color_attachments)
void draw_procedural(GPUPrimType primitive, uint instance_len, uint vertex_len, uint vertex_first=-1, ResourceHandle handle={0}, uint custom_id=0)
PassBase< DrawCommandBufType > & sub(const char *name)
void barrier(eGPUBarrier type)
void state_set(DRWState state, int clip_plane_count=0)
void bind_ubo(const char *name, GPUUniformBuf *buffer)
void framebuffer_set(GPUFrameBuffer **framebuffer)
void state_stencil(uint8_t write_mask, uint8_t reference, uint8_t compare_mask)
void push_constant(const char *name, const float &data)
void material_set(Manager &manager, GPUMaterial *material)
void bind_ssbo(const char *name, GPUStorageBuf *buffer)
void shader_set(GPUShader *shader)
void sync(GPUMaterial *gpumat, float background_opacity, float background_blur)
const float3 & forward() const
PassMain::Sub * surface_material_add(::Material *blender_mat, GPUMaterial *gpumat)
GPUTexture * render(View &main_view, View &render_view, Framebuffer &prepass_fb, Framebuffer &combined_fb, Framebuffer &gbuffer_fb, int2 extent, RayTraceBuffer &rt_buffer, GPUTexture *radiance_behind_tx)
void end_sync(bool is_first_pass, bool is_last_pass, bool next_layer_has_transmission)
bool has_transmission() const
PassMain::Sub * prepass_add(::Material *blender_mat, GPUMaterial *gpumat, bool has_motion)
PassMain::Sub * material_add(::Material *blender_mat, GPUMaterial *gpumat)
PassMain::Sub * material_add(::Material *material, GPUMaterial *gpumat)
void debug_draw(draw::View &view, GPUFrameBuffer *combined_fb)
PassMain::Sub * prepass_add(::Material *material, GPUMaterial *gpumat, bool has_motion)
void render(View &main_view, View &render_view, Framebuffer &prepass_fb, Framebuffer &combined_fb, Framebuffer &gbuffer_fb, int2 extent, RayTraceBuffer &rt_buffer_opaque_layer, RayTraceBuffer &rt_buffer_refract_layer)
void render(View &view, Framebuffer &prepass_fb, Framebuffer &combined_fb, Framebuffer &gbuffer_fb, int2 extent)
PassMain::Sub * prepass_add(::Material *material, GPUMaterial *gpumat)
PassMain::Sub * material_add(::Material *material, GPUMaterial *gpumat)
AOVsInfoDataBuf aovs_info
PassMain::Sub * prepass_opaque_add(::Material *blender_mat, GPUMaterial *gpumat, bool has_motion)
PassMain::Sub * material_opaque_add(::Material *blender_mat, GPUMaterial *gpumat)
PassMain::Sub * material_transparent_add(const Object *ob, ::Material *blender_mat, GPUMaterial *gpumat)
void render(View &view, Framebuffer &prepass_fb, Framebuffer &combined_fb, int2 extent)
PassMain::Sub * prepass_transparent_add(const Object *ob, ::Material *blender_mat, GPUMaterial *gpumat)
struct blender::eevee::HiZBuffer::@195 front
void set_source(GPUTexture **texture, int layer=-1)
A running instance of the engine.
VolumeProbeModule volume_probes
SphereProbeModule sphere_probes
RayTraceModule raytracing
SubsurfaceModule subsurface
RenderBuffers render_buffers
void info_append(const char *msg, Args &&...args)
PlanarProbeModule planar_probes
UniformDataModule uniform_data
LightProbeModule light_probes
void set_view(View &view, const int2 extent)
UtilityTexture utility_tx
DeferredPipeline deferred
PassMain::Sub * prepass_add(::Material *material, GPUMaterial *gpumat)
PassMain::Sub * material_add(::Material *material, GPUMaterial *gpumat)
void render(View &view, GPUTexture *depth_layer_tx, Framebuffer &gbuffer, Framebuffer &combined_fb, int2 extent)
RayTraceResult alloc_only(RayTraceBuffer &rt_buffer)
RayTraceResult render(RayTraceBuffer &rt_buffer, GPUTexture *screen_radiance_back_tx, eClosureBits active_closures, View &main_view, View &render_view)
RayTraceResult alloc_dummy(RayTraceBuffer &rt_buffer)
TextureFromPool cryptomatte_tx
TextureFromPool combined_tx
RenderBuffersInfoData & data
GPUShader * static_shader_get(eShaderType shader_type)
const ShadowSceneData & get_data()
void set_view(View &view, int2 extent)
static ShadowTechnique shadow_technique
PassMain::Sub * surface_material_add(::Material *material, GPUMaterial *gpumat)
void set_view(View &view)
bool camera_has_motion() const
void render(View &view, Texture &occupancy_tx)
bool bounds_overlaps(const VolumeObjectBounds &object_aabb) const
PassMain::Sub * occupancy_add(const Object *ob, const ::Material *blender_mat, GPUMaterial *gpumat)
void add_object_bound(const VolumeObjectBounds &object_aabb)
PassMain::Sub * material_add(const Object *ob, const ::Material *blender_mat, GPUMaterial *gpumat)
struct blender::eevee::VolumeModule::@197 properties
struct blender::eevee::VolumeModule::@198 occupancy
struct blender::eevee::VolumeModule::@196 result
void draw_resolve(View &view)
std::optional< Bounds< float > > object_integration_range() const
VolumeLayer * register_and_get_layer(Object *ob)
void render(View &view, Texture &occupancy_tx)
bool use_hit_list() const
void set_view(View &view)
void sync(GPUMaterial *gpumat)
void sync(GPUMaterial *gpumat)
additional_info("compositor_sum_float_shared") .push_constant(Type additional_info("compositor_sum_float_shared") .push_constant(Type GPU_RGBA32F
void DRW_stats_group_start(const char *name)
void DRW_stats_group_end()
@ DRW_STATE_STENCIL_EQUAL
@ DRW_STATE_STENCIL_ALWAYS
@ DRW_STATE_BLEND_ADD_FULL
@ DRW_STATE_DEPTH_LESS_EQUAL
@ DRW_STATE_STENCIL_NEQUAL
@ DRW_STATE_DEPTH_GREATER
@ DRW_STATE_WRITE_STENCIL
#define RBUFS_UTILITY_TEX_SLOT
#define RBUFS_CRYPTOMATTE_SLOT
#define GBUF_CLOSURE_SLOT
#define SHADOW_ATLAS_IMG_SLOT
#define SHADOW_RENDER_MAP_BUF_SLOT
#define DEFERRED_RADIANCE_FORMAT
#define SHADOW_RENDER_VIEW_BUF_SLOT
#define SHADOW_PAGE_INFO_SLOT
GPUShader * GPU_pass_shader_get(GPUPass *pass)
std::optional< Bounds< T > > intersect(const std::optional< Bounds< T > > &a, const std::optional< Bounds< T > > &b)
Bounds< T > merge(const Bounds< T > &a, const Bounds< T > &b)
std::optional< Bounds< T > > min_max(const std::optional< Bounds< T > > &a, const T &b)
detail::Pass< command::DrawCommandBuf > PassSimple
PassMain::Sub * volume_sub_pass(PassMain::Sub &ps, Scene *scene, Object *ob, GPUMaterial *gpu_material)
@ DEFERRED_THICKNESS_AMEND
@ VOLUME_OCCUPANCY_CONVERT
@ DEBUG_GBUFFER_EVALUATION
static eClosureBits shader_closure_bits_from_flag(const GPUMaterial *gpumat)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
VectorT project_point(const MatT &mat, const VectorT &point)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
VecBase< int32_t, 4 > int4
VecBase< uint32_t, 4 > uint4
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
VecBase< float, 3 > float3
float clamp_surface_direct
float clamp_surface_indirect
VecBase< T, 2 > xy() const
eClosureBits closure_bits_
PassMain::Sub * gbuffer_double_sided_ps_
PassMain::Sub * gbuffer_double_sided_hybrid_ps_
PassMain::Sub * prepass_double_sided_static_ps_
PassMain::Sub * gbuffer_single_sided_ps_
PassMain::Sub * prepass_single_sided_static_ps_
void gbuffer_pass_sync(Instance &inst)
PassMain::Sub * prepass_double_sided_moving_ps_
PassMain::Sub * gbuffer_single_sided_hybrid_ps_
PassMain::Sub * prepass_single_sided_moving_ps_
GPUTexture * closure_img_tx
GPUTexture * normal_img_tx
void bind(Framebuffer &gbuffer_fb)
GPUTexture * feedback_ensure(bool is_dummy, int2 extent)
RayTraceResultTexture closures[3]
SphereProbeUvArea atlas_coord
void render(GPUTexture *direct_diffuse_light_tx, GPUTexture *indirect_diffuse_light_tx, eClosureBits active_closures, View &view)
std::optional< Bounds< float2 > > screen_bounds
VolumeObjectBounds(const Camera &camera, Object *ob)
std::optional< Bounds< float > > z_range