33 const float background_opacity,
34 const float background_blur)
43 world_ps_.
push_constant(
"world_opacity_fade", background_opacity);
114 pass.
bind_image(
"rp_normal_img", dummy_renderpass_tx_);
115 pass.
bind_image(
"rp_light_img", dummy_renderpass_tx_);
116 pass.
bind_image(
"rp_diffuse_color_img", dummy_renderpass_tx_);
117 pass.
bind_image(
"rp_specular_color_img", dummy_renderpass_tx_);
118 pass.
bind_image(
"rp_emission_img", dummy_renderpass_tx_);
119 pass.
bind_image(
"rp_cryptomatte_img", dummy_cryptomatte_tx_);
120 pass.
bind_image(
"rp_color_img", dummy_aov_color_tx_);
121 pass.
bind_image(
"rp_value_img", dummy_aov_value_tx_);
122 pass.
bind_image(
"aov_color_img", dummy_aov_color_tx_);
123 pass.
bind_image(
"aov_value_img", dummy_aov_value_tx_);
173 is_valid_ = (sub !=
nullptr);
212 if (shadow_update_tbdr) {
233 if (!shadow_update_tbdr) {
241 surface_double_sided_ps_ = &pass.
sub(
"Shadow.Surface.Double-Sided");
242 surface_single_sided_ps_ = &pass.
sub(
"Shadow.Surface.Single-Sided");
246 if (shadow_update_tbdr) {
269 surface_single_sided_ps_ :
270 surface_double_sided_ps_;
291 has_transparent_ =
false;
307 prepass_double_sided_static_ps_ = &prepass_ps_.
sub(
"DoubleSided.Static");
308 prepass_double_sided_static_ps_->
state_set(state_depth_only);
310 prepass_single_sided_static_ps_ = &prepass_ps_.
sub(
"SingleSided.Static");
313 prepass_double_sided_moving_ps_ = &prepass_ps_.
sub(
"DoubleSided.Moving");
314 prepass_double_sided_moving_ps_->
state_set(state_depth_color);
316 prepass_single_sided_moving_ps_ = &prepass_ps_.
sub(
"SingleSided.Moving");
335 opaque_single_sided_ps_ = &opaque_ps_.
sub(
"SingleSided");
339 opaque_double_sided_ps_ = &opaque_ps_.
sub(
"DoubleSided");
344 transparent_ps_.
init();
370 "Forward Transparent should be registered directly without calling "
371 "PipelineModule::material_add()");
373 (has_motion ? prepass_single_sided_moving_ps_ :
374 prepass_single_sided_static_ps_) :
375 (has_motion ? prepass_double_sided_moving_ps_ :
376 prepass_double_sided_static_ps_);
389 "Forward Transparent should be registered directly without calling "
390 "PipelineModule::material_add()");
392 opaque_double_sided_ps_;
409 has_transparent_ =
true;
410 float sorting_value =
math::dot(
float3(ob->object_to_world().location()), camera_forward_);
426 has_transparent_ =
true;
427 float sorting_value =
math::dot(
float3(ob->object_to_world().location()), camera_forward_);
439 if (!has_transparent_ && !has_opaque_) {
464 if (has_transparent_) {
577 bool next_layer_has_transmission)
581 const bool is_layer_refracted = (next_layer_has_transmission && has_any_closure);
584 use_raytracing_ = (has_transmit_closure || has_reflect_closure) &&
589 use_split_radiance_ = use_raytracing_ || (use_clamp_direct_ || use_clamp_indirect_);
593 use_screen_transmission_ = use_raytracing_ && has_transmit_closure && !is_first_pass;
594 use_screen_reflection_ = use_raytracing_ && has_reflect_closure;
596 use_feedback_output_ = (use_raytracing_ || is_layer_refracted) &&
597 (!is_last_pass || use_screen_reflection_);
633 set_bit(StencilBits::CLOSURE_COUNT_0);
636 set_bit(StencilBits::CLOSURE_COUNT_1);
639 set_bit(StencilBits::TRANSMISSION);
662 uint8_t(StencilBits::THICKNESS_FROM_SHADOW);
680 auto set_specialization_constants =
694 set_specialization_constants(sub, sh,
false);
696 sub.
bind_image(
"direct_radiance_1_img", &direct_radiance_txs_[0]);
697 sub.
bind_image(
"direct_radiance_2_img", &direct_radiance_txs_[1]);
698 sub.
bind_image(
"direct_radiance_3_img", &direct_radiance_txs_[2]);
711 uint8_t(StencilBits::CLOSURE_COUNT_1) |
712 uint8_t(StencilBits::TRANSMISSION);
715 if (use_transmission) {
717 set_specialization_constants(sub, sh,
true);
733 "render_pass_diffuse_light_enabled",
737 "render_pass_specular_light_enabled",
742 sh,
"use_radiance_feedback", use_feedback_output_ && use_clamp_direct_);
749 pass.
bind_texture(
"direct_radiance_1_tx", &direct_radiance_txs_[0]);
750 pass.
bind_texture(
"direct_radiance_2_tx", &direct_radiance_txs_[1]);
751 pass.
bind_texture(
"direct_radiance_3_tx", &direct_radiance_txs_[2]);
757 pass.
bind_image(
"radiance_feedback_img", &radiance_feedback_tx_);
803 uint8_t material_stencil_bits = 0u;
804 if (use_thickness_from_shadow) {
805 material_stencil_bits |=
uint8_t(StencilBits::THICKNESS_FROM_SHADOW);
809 material_pass->
state_stencil(0xFFu, material_stencil_bits, 0xFFu);
811 return material_pass;
821 GPUTexture *radiance_behind_tx)
833 if (use_screen_transmission_) {
852 for (
int i = 0; i <
ARRAY_SIZE(direct_radiance_txs_); i++) {
853 direct_radiance_txs_[i].
acquire(
857 if (use_raytracing_) {
859 rt_buffer, radiance_behind_tx,
closure_bits_, main_view, render_view);
861 else if (use_split_radiance_) {
874 radiance_feedback_tx_ = rt_buffer.
feedback_ensure(!use_feedback_output_, extent);
876 if (use_feedback_output_ && use_clamp_direct_) {
885 if (use_feedback_output_ && !use_clamp_direct_) {
892 for (
int i = 0; i <
ARRAY_SIZE(direct_radiance_txs_); i++) {
893 direct_radiance_txs_[i].
release();
898 return use_feedback_output_ ? radiance_feedback_tx_ :
nullptr;
911 Instance &inst = opaque_layer_.inst_;
914 use_combined_lightprobe_eval = !use_raytracing;
928void DeferredPipeline::debug_pass_sync()
930 Instance &inst = opaque_layer_.inst_;
942 pass.push_constant(
"debug_mode",
int(inst.
debug_mode));
943 pass.bind_resources(inst.
gbuffer);
949 Instance &inst = opaque_layer_.inst_;
959 inst.
info_append(
"Debug Mode: Deferred Lighting Cost");
962 inst.
info_append(
"Debug Mode: Gbuffer Storage Cost");
978 return refraction_layer_.
prepass_add(blender_mat, gpumat, has_motion);
980 return opaque_layer_.
prepass_add(blender_mat, gpumat, has_motion);
986 return refraction_layer_.
material_add(blender_mat, gpumat);
1000 GPUTexture *feedback_tx =
nullptr;
1003 feedback_tx = opaque_layer_.
render(main_view,
1009 rt_buffer_opaque_layer,
1014 feedback_tx = refraction_layer_.
render(main_view,
1020 rt_buffer_refract_layer,
1034 object_bounds_.clear();
1035 combined_screen_bounds_ = std::nullopt;
1052 occupancy_ps_ = &pass;
1064 material_ps_ = &pass;
1069 const ::Material *blender_mat,
1073 "Only volume material should be added here");
1086 const ::Material * ,
1090 "Only volume material should be added here");
1111 for (
const std::optional<
Bounds<float2>> &other_aabb : object_bounds_) {
1152 object_integration_range_ = std::nullopt;
1153 has_scatter_ =
false;
1154 has_absorption_ =
false;
1155 for (
auto &layer : layers_) {
1162 for (
auto &layer : layers_) {
1163 layer->render(
view, occupancy_tx);
1215 for (
auto &layer : layers_) {
1216 if (!layer->bounds_overlaps(object_bounds)) {
1217 layer->add_object_bound(object_bounds);
1222 int64_t index = layers_.append_and_get_index(std::make_unique<VolumeLayer>(inst_));
1223 (*layers_[index]).add_object_bound(object_bounds);
1224 return layers_[index].get();
1229 return object_integration_range_;
1234 for (
const auto &layer : layers_) {
1235 if (layer->use_hit_list) {
1449 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 *fb)
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)
GPUShader * GPU_pass_shader_get(GPUPass *pass)
@ 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
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
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 draw_procedural_indirect(GPUPrimType primitive, StorageBuffer< DrawCommand, true > &indirect_buffer, ResourceHandle handle={0})
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)
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 material_set(Manager &manager, GPUMaterial *material, bool deferred_texture_loading=false)
void push_constant(const char *name, const float &data)
void draw_procedural(GPUPrimType primitive, uint instance_len, uint vertex_len, uint vertex_first=-1, ResourceHandleRange handle={0}, uint custom_id=0)
void bind_ssbo(const char *name, GPUStorageBuf *buffer)
void shader_set(GPUShader *shader)
void render(View &view, Framebuffer &combined_fb)
void sync(GPUMaterial *gpumat, float background_opacity, float background_blur)
const float3 & forward() const
const CameraData & data_get() const
bool is_perspective() 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
static bool do_merge_direct_indirect_eval(const Instance &inst)
static bool do_split_direct_indirect_radiance(const Instance &inst)
PassMain::Sub * prepass_add(::Material *blender_mat, GPUMaterial *gpumat, bool has_motion)
PassMain::Sub * material_add(::Material *blender_mat, GPUMaterial *gpumat)
PassMain::Sub * prepass_add(::Material *blender_mat, GPUMaterial *gpumat, bool has_motion)
void debug_draw(draw::View &view, GPUFrameBuffer *combined_fb)
PassMain::Sub * material_add(::Material *blender_mat, GPUMaterial *gpumat)
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 * material_add(::Material *blender_mat, GPUMaterial *gpumat)
PassMain::Sub * prepass_add(::Material *blender_mat, GPUMaterial *gpumat)
struct blender::eevee::Film::DepthState depth
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::@178 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 *blender_mat, GPUMaterial *gpumat)
void render(View &view, GPUTexture *depth_layer_tx, Framebuffer &gbuffer, Framebuffer &combined_fb, int2 extent)
PassMain::Sub * material_add(::Material *blender_mat, GPUMaterial *gpumat)
bool use_raytracing() const
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
bool use_clamp_indirect() const
bool use_clamp_direct() const
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 add_object_bound(const VolumeObjectBounds &object_bounds)
void render(View &view, Texture &occupancy_tx)
bool bounds_overlaps(const VolumeObjectBounds &object_bounds) const
PassMain::Sub * occupancy_add(const Object *ob, const ::Material *blender_mat, GPUMaterial *gpumat)
PassMain::Sub * material_add(const Object *ob, const ::Material *blender_mat, GPUMaterial *gpumat)
struct blender::eevee::VolumeModule::@180 properties
struct blender::eevee::VolumeModule::@181 occupancy
struct blender::eevee::VolumeModule::@179 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)
@ DRW_STATE_STENCIL_EQUAL
@ DRW_STATE_STENCIL_ALWAYS
@ DRW_STATE_CLIP_CONTROL_UNIT_RANGE
@ DRW_STATE_BLEND_ADD_FULL
@ DRW_STATE_STENCIL_NEQUAL
@ DRW_STATE_DEPTH_GREATER
@ DRW_STATE_WRITE_STENCIL
#define RBUFS_UTILITY_TEX_SLOT
#define RBUFS_CRYPTOMATTE_SLOT
#define SHADOW_ATLAS_IMG_SLOT
#define SHADOW_RENDER_MAP_BUF_SLOT
#define SHADOW_RENDER_VIEW_BUF_SLOT
#define SHADOW_PAGE_INFO_SLOT
#define DEFERRED_RADIANCE_FORMAT
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)
std::optional< Bounds< T > > intersect(const Bounds< T > &a, const Bounds< 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 reduce_max(const VecBase< T, Size > &a)
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
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_
void bind_optional_layers(PassType &pass)
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