33 const float background_opacity,
34 const float background_blur)
36 Manager &manager = *inst_.manager;
43 clear_ps_.bind_image(
"rp_color_img", &rbufs.
rp_color_tx);
44 clear_ps_.bind_image(
"rp_value_img", &rbufs.
rp_value_tx);
47 clear_ps_.bind_resources(inst_.cryptomatte);
48 clear_ps_.bind_resources(inst_.uniform_data);
56 world_ps_.material_set(manager, gpumat);
57 world_ps_.push_constant(
"world_opacity_fade", background_opacity);
58 world_ps_.push_constant(
"world_background_blur",
square_f(background_blur));
60 world_ps_.push_constant(
"world_coord_packed",
reinterpret_cast<int4 *
>(&world_data.
atlas_coord));
61 world_ps_.bind_texture(
"utility_tx", inst_.pipelines.utility_tx);
63 world_ps_.bind_image(
"rp_color_img", &rbufs.
rp_color_tx);
64 world_ps_.bind_image(
"rp_value_img", &rbufs.
rp_value_tx);
67 world_ps_.bind_resources(inst_.cryptomatte);
68 world_ps_.bind_resources(inst_.uniform_data);
69 world_ps_.bind_resources(inst_.sampling);
70 world_ps_.bind_resources(inst_.sphere_probes);
71 world_ps_.bind_resources(inst_.volume_probes);
79 inst_.manager->submit(clear_ps_,
view);
85 inst_.manager->submit(world_ps_,
view);
99 dummy_cryptomatte_tx_.ensure_2d(gpu::TextureFormat::SFLOAT_32_32_32_32, extent, usage);
100 dummy_renderpass_tx_.ensure_2d(gpu::TextureFormat::SFLOAT_16_16_16_16, extent, usage);
101 dummy_aov_color_tx_.ensure_2d_array(gpu::TextureFormat::SFLOAT_16_16_16_16, extent, 1, usage);
102 dummy_aov_value_tx_.ensure_2d_array(gpu::TextureFormat::SFLOAT_16, extent, 1, usage);
108 Manager &manager = *inst_.manager;
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_);
124 pass.
bind_ssbo(
"aov_buf", &inst_.film.aovs_info);
137 inst_.pipelines.data.is_sphere_probe =
true;
138 inst_.uniform_data.push_update();
140 inst_.manager->submit(cubemap_face_ps_,
view);
142 inst_.pipelines.data.is_sphere_probe =
false;
143 inst_.uniform_data.push_update();
165 world_ps_.bind_resources(inst_.uniform_data);
166 world_ps_.bind_resources(inst_.volume.properties);
167 world_ps_.bind_resources(inst_.sampling);
169 world_ps_.material_set(*inst_.manager, gpumat);
173 is_valid_ = (sub !=
nullptr);
185 inst_.volume.prop_scattering_tx_.clear(
float4(0.0f));
186 inst_.volume.prop_extinction_tx_.clear(
float4(0.0f));
187 inst_.volume.prop_emission_tx_.clear(
float4(0.0f));
188 inst_.volume.prop_phase_tx_.clear(
float4(0.0f));
189 inst_.volume.prop_phase_weight_tx_.clear(
float4(0.0f));
193 inst_.manager->submit(world_ps_,
view);
212 if (shadow_update_tbdr) {
221 pass.
bind_ssbo(
"src_coord_buf", inst_.shadows.src_coord_buf_);
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) {
260 pass.
bind_ssbo(
"dst_coord_buf", inst_.shadows.dst_coord_buf_);
261 pass.
bind_ssbo(
"src_coord_buf", inst_.shadows.src_coord_buf_);
269 surface_single_sided_ps_ :
270 surface_double_sided_ps_;
276 inst_.manager->submit(render_ps_,
view);
289 camera_forward_ = inst_.camera.forward();
291 has_transparent_ =
false;
294 inst_.film.depth.test_state;
302 prepass_ps_.bind_resources(inst_.uniform_data);
303 prepass_ps_.bind_resources(inst_.velocity);
304 prepass_ps_.bind_resources(inst_.sampling);
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");
325 opaque_ps_.bind_resources(inst_.uniform_data);
326 opaque_ps_.bind_resources(inst_.lights);
327 opaque_ps_.bind_resources(inst_.shadows);
328 opaque_ps_.bind_resources(inst_.volume.result);
329 opaque_ps_.bind_resources(inst_.sampling);
330 opaque_ps_.bind_resources(inst_.hiz_buffer.front);
331 opaque_ps_.bind_resources(inst_.volume_probes);
332 opaque_ps_.bind_resources(inst_.sphere_probes);
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_;
405 inst_.film.depth.test_state;
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_) {
440 inst_.volume.draw_resolve(
view);
447 inst_.manager->submit(prepass_ps_,
view);
449 inst_.hiz_buffer.set_dirty();
451 inst_.shadows.set_view(
view, extent);
452 inst_.volume_probes.set_view(
view);
453 inst_.sphere_probes.set_view(
view);
457 inst_.manager->submit(opaque_ps_,
view);
462 inst_.volume.draw_resolve(
view);
464 if (has_transparent_) {
466 inst_.manager->submit(transparent_ps_,
view);
536 bool alpha_hash_subpixel_scale = !inst_.is_viewport() || !inst_.velocity.camera_has_motion();
537 inst_.pipelines.data.alpha_hash_scale = alpha_hash_subpixel_scale ? 0.1f : 1.0f;
550 inst_.film.depth.test_state;
582 bool next_layer_has_transmission)
586 const bool is_layer_refracted = (next_layer_has_transmission && has_any_closure);
589 use_raytracing_ = (has_transmit_closure || has_reflect_closure) &&
590 inst_.raytracing.use_raytracing();
591 use_clamp_direct_ = inst_.sampling.use_clamp_direct();
592 use_clamp_indirect_ = inst_.sampling.use_clamp_indirect();
594 use_split_radiance_ = use_raytracing_ || (use_clamp_direct_ || use_clamp_indirect_);
598 use_screen_transmission_ = use_raytracing_ && has_transmit_closure && !is_first_pass;
599 use_screen_reflection_ = use_raytracing_ && has_reflect_closure;
601 use_feedback_output_ = (use_raytracing_ || is_layer_refracted) &&
602 (!is_last_pass || use_screen_reflection_);
606 if (inst_.film.aovs_info.color_len > 0 && !is_first_pass) {
611 sub.
bind_image(
"rp_color_img", &inst_.render_buffers.rp_color_tx);
612 sub.
bind_image(
"rp_value_img", &inst_.render_buffers.rp_value_tx);
613 sub.
bind_image(
"rp_cryptomatte_img", &inst_.render_buffers.cryptomatte_tx);
636 sub.
bind_ssbo(
"dummy_workaround_buf", &inst_.film.aovs_info);
641 sub.
state_stencil(uint8_t(StencilBits::HEADER_BITS), 0x0u, 0xFFu);
654 set_bit(StencilBits::CLOSURE_COUNT_0);
657 set_bit(StencilBits::CLOSURE_COUNT_1);
660 set_bit(StencilBits::TRANSMISSION);
678 sub.
bind_texture(
"gbuf_header_tx", &inst_.gbuffer.header_tx);
679 sub.
bind_image(
"gbuf_normal_img", &inst_.gbuffer.normal_tx);
682 uint8_t stencil_bits = uint8_t(StencilBits::TRANSMISSION) |
683 uint8_t(StencilBits::THICKNESS_FROM_SHADOW);
701 auto set_specialization_constants =
716 set_specialization_constants(sub, sh,
false);
718 sub.
bind_image(
"direct_radiance_1_img", &direct_radiance_txs_[0]);
719 sub.
bind_image(
"direct_radiance_2_img", &direct_radiance_txs_[1]);
720 sub.
bind_image(
"direct_radiance_3_img", &direct_radiance_txs_[2]);
721 sub.
bind_image(
"indirect_radiance_1_img", &indirect_result_.closures[0]);
722 sub.
bind_image(
"indirect_radiance_2_img", &indirect_result_.closures[1]);
723 sub.
bind_image(
"indirect_radiance_3_img", &indirect_result_.closures[2]);
732 uint8_t compare_mask = uint8_t(StencilBits::CLOSURE_COUNT_0) |
733 uint8_t(StencilBits::CLOSURE_COUNT_1) |
734 uint8_t(StencilBits::TRANSMISSION);
737 if (use_transmission) {
739 set_specialization_constants(sub, sh,
true);
741 sub.
state_stencil(0x0u, (
i + 1) | uint8_t(StencilBits::TRANSMISSION), compare_mask);
755 "render_pass_diffuse_light_enabled",
759 "render_pass_specular_light_enabled",
764 sh,
"use_radiance_feedback", use_feedback_output_ && use_clamp_direct_);
771 pass.
state_stencil(0x0u, 0x0u, uint8_t(StencilBits::HEADER_BITS));
772 pass.
bind_texture(
"direct_radiance_1_tx", &direct_radiance_txs_[0]);
773 pass.
bind_texture(
"direct_radiance_2_tx", &direct_radiance_txs_[1]);
774 pass.
bind_texture(
"direct_radiance_3_tx", &direct_radiance_txs_[2]);
775 pass.
bind_texture(
"indirect_radiance_1_tx", &indirect_result_.closures[0]);
776 pass.
bind_texture(
"indirect_radiance_2_tx", &indirect_result_.closures[1]);
777 pass.
bind_texture(
"indirect_radiance_3_tx", &indirect_result_.closures[2]);
780 pass.
bind_image(
"radiance_feedback_img", &radiance_feedback_tx_);
827 uint8_t material_stencil_bits = 0u;
828 if (use_thickness_from_shadow) {
829 material_stencil_bits |= uint8_t(StencilBits::THICKNESS_FROM_SHADOW);
833 material_pass->
state_stencil(0xFFu, material_stencil_bits, 0xFFu);
835 return material_pass;
857 if (use_screen_transmission_) {
859 inst_.hiz_buffer.update();
865 inst_.hiz_buffer.swap_layer();
867 inst_.hiz_buffer.update();
869 inst_.volume_probes.set_view(render_view);
870 inst_.sphere_probes.set_view(render_view);
871 inst_.shadows.set_view(render_view, extent);
873 inst_.gbuffer.bind(gbuffer_fb);
878 gpu::TextureFormat::DEFERRED_RADIANCE_FORMAT,
882 if (use_raytracing_) {
883 indirect_result_ = inst_.raytracing.render(
884 rt_buffer, radiance_behind_tx,
closure_bits_, main_view, render_view);
886 else if (use_split_radiance_) {
887 indirect_result_ = inst_.raytracing.alloc_only(rt_buffer);
890 indirect_result_ = inst_.raytracing.alloc_dummy(rt_buffer);
894 inst_.manager->submit(eval_light_ps_, render_view);
896 inst_.subsurface.render(
897 direct_radiance_txs_[0], indirect_result_.closures[0],
closure_bits_, render_view);
899 radiance_feedback_tx_ = rt_buffer.
feedback_ensure(!use_feedback_output_, extent);
901 if (use_feedback_output_ && use_clamp_direct_) {
908 inst_.manager->submit(combine_ps_, render_view);
910 if (use_feedback_output_ && !use_clamp_direct_) {
915 indirect_result_.release();
918 direct_radiance_txs_[
i].release();
921 inst_.pipelines.deferred.debug_draw(render_view, combined_fb);
923 return use_feedback_output_ ? radiance_feedback_tx_ :
nullptr;
936 Instance &inst = opaque_layer_.inst_;
939 use_combined_lightprobe_eval = !use_raytracing;
942 refraction_layer_.begin_sync();
947 Instance &inst = opaque_layer_.inst_;
949 opaque_layer_.
end_sync(
true, refraction_layer_.is_empty(), refraction_layer_.has_transmission());
950 refraction_layer_.end_sync(opaque_layer_.is_empty(),
true,
false);
957void DeferredPipeline::debug_pass_sync()
959 Instance &inst = opaque_layer_.inst_;
971 pass.push_constant(
"debug_mode",
int(inst.
debug_mode));
972 pass.bind_resources(inst.
gbuffer);
978 Instance &inst = opaque_layer_.inst_;
988 inst.
info_append(
"Debug Mode: Deferred Lighting Cost");
991 inst.
info_append(
"Debug Mode: Gbuffer Storage Cost");
1007 return refraction_layer_.prepass_add(blender_mat, gpumat, has_motion);
1009 return opaque_layer_.prepass_add(blender_mat, gpumat, has_motion);
1015 return refraction_layer_.material_add(blender_mat, gpumat);
1017 return opaque_layer_.material_add(blender_mat, gpumat);
1032 feedback_tx = opaque_layer_.render(main_view,
1038 rt_buffer_opaque_layer,
1043 feedback_tx = refraction_layer_.render(main_view,
1049 rt_buffer_refract_layer,
1063 object_bounds_.clear();
1064 combined_screen_bounds_ = std::nullopt;
1081 occupancy_ps_ = &pass;
1093 material_ps_ = &pass;
1098 const ::Material *blender_mat,
1102 "Only volume material should be added here");
1115 const ::Material * ,
1119 "Only volume material should be added here");
1140 for (
const std::optional<
Bounds<float2>> &other_aabb : object_bounds_) {
1170 inst_.manager->submit(volume_layer_ps_,
view);
1181 object_integration_range_ = std::nullopt;
1182 has_scatter_ =
false;
1183 has_absorption_ =
false;
1184 for (
auto &layer : layers_) {
1191 for (
auto &layer : layers_) {
1192 layer->render(
view, occupancy_tx);
1211 for (
const float3 &l_corner : corners) {
1243 for (
auto &layer : layers_) {
1244 if (!layer->bounds_overlaps(object_bounds)) {
1245 layer->add_object_bound(object_bounds);
1250 int64_t index = layers_.append_and_get_index(std::make_unique<VolumeLayer>(inst_));
1251 (*layers_[index]).add_object_bound(object_bounds);
1252 return layers_[index].get();
1257 return object_integration_range_;
1262 for (
const auto &layer : layers_) {
1263 if (layer->use_hit_list) {
1294 inst_.film.depth.test_state;
1296 opaque_layer_.prepass_double_sided_static_ps_ = &pass.
sub(
"DoubleSided");
1297 opaque_layer_.prepass_double_sided_static_ps_->state_set(state_depth_only);
1298 opaque_layer_.prepass_single_sided_static_ps_ = &pass.
sub(
"SingleSided");
1299 opaque_layer_.prepass_single_sided_static_ps_->state_set(state_depth_only |
DRW_STATE_CULL_BACK);
1301 opaque_layer_.gbuffer_pass_sync(inst_);
1306 if (!opaque_layer_.prepass_ps_.is_empty()) {
1330 opaque_layer_.prepass_single_sided_static_ps_ :
1331 opaque_layer_.prepass_double_sided_static_ps_;
1345 opaque_layer_.closure_bits_ |= closure_bits;
1346 opaque_layer_.closure_count_ =
max_ii(opaque_layer_.closure_count_,
count_bits_i(closure_bits));
1352 ((backface_culling) ? opaque_layer_.gbuffer_single_sided_hybrid_ps_ :
1353 opaque_layer_.gbuffer_double_sided_hybrid_ps_) :
1354 ((backface_culling) ? opaque_layer_.gbuffer_single_sided_ps_ :
1355 opaque_layer_.gbuffer_double_sided_ps_);
1369 inst_.manager->submit(opaque_layer_.prepass_ps_,
view);
1371 inst_.hiz_buffer.set_source(&inst_.render_buffers.depth_tx);
1372 inst_.hiz_buffer.update();
1374 inst_.lights.set_view(
view, extent);
1375 inst_.shadows.set_view(
view, extent);
1376 inst_.volume_probes.set_view(
view);
1377 inst_.sphere_probes.set_view(
view);
1380 inst_.hiz_buffer.update();
1382 inst_.gbuffer.bind(gbuffer_fb);
1383 inst_.manager->submit(opaque_layer_.gbuffer_ps_,
view);
1386 inst_.manager->submit(eval_light_ps_,
view);
1408 inst_.film.depth.test_state;
1484 inst_.pipelines.data.is_sphere_probe =
true;
1485 inst_.uniform_data.push_update();
1493 inst_.hiz_buffer.set_source(&depth_layer_tx, 0);
1494 inst_.hiz_buffer.update();
1496 inst_.lights.set_view(
view, extent);
1497 inst_.shadows.set_view(
view, extent);
1498 inst_.volume_probes.set_view(
view);
1499 inst_.sphere_probes.set_view(
view);
1501 inst_.gbuffer.bind(gbuffer_fb);
1505 inst_.manager->submit(eval_light_ps_,
view);
1507 inst_.pipelines.data.is_sphere_probe =
false;
1508 inst_.uniform_data.push_update();
1526 surface_ps_.framebuffer_set(&inst_.volume_probes.bake.empty_raster_fb_);
1528 surface_ps_.bind_ssbo(
SURFEL_BUF_SLOT, &inst_.volume_probes.bake.surfels_buf_);
1529 surface_ps_.bind_ssbo(
CAPTURE_BUF_SLOT, &inst_.volume_probes.bake.capture_info_buf_);
1534 surface_ps_.bind_resources(inst_.uniform_data);
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_clear_depth(blender::gpu::FrameBuffer *fb, float clear_depth)
void GPU_framebuffer_bind(blender::gpu::FrameBuffer *fb)
GPUPass * GPU_material_get_pass(GPUMaterial *material)
bool GPU_material_flag_get(const GPUMaterial *mat, eGPUMaterialFlag flag)
GPUMaterialStatus 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)
blender::gpu::Shader * GPU_pass_shader_get(GPUPass *pass)
@ GPU_BARRIER_TEXTURE_FETCH
@ GPU_BARRIER_SHADER_IMAGE_ACCESS
void GPU_texture_copy(blender::gpu::Texture *dst, blender::gpu::Texture *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)
void clear(float4 values)
void bind_resources(U &resources)
void shader_set(gpu::Shader *shader)
void bind_texture(const char *name, gpu::Texture *texture, GPUSamplerState state=sampler_auto)
void clear_stencil(uint8_t stencil)
void specialize_constant(gpu::Shader *shader, const char *name, const float &data)
void subpass_transition(GPUAttachmentState depth_attachment, Span< GPUAttachmentState > color_attachments)
void bind_image(const char *name, gpu::Texture *image)
void draw_procedural(GPUPrimType primitive, uint instance_len, uint vertex_len, uint vertex_first=-1, ResourceIndexRange res_index={}, uint custom_id=0)
PassBase< DrawCommandBufType > & sub(const char *name)
void submit(command::RecordingState &state) const
void draw_procedural_indirect(GPUPrimType primitive, StorageBuffer< DrawCommand, true > &indirect_buffer, ResourceIndex res_index={0})
void state_set(DRWState state, int clip_plane_count=0)
void barrier(GPUBarrier type)
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 bind_ssbo(const char *name, gpu::StorageBuf *buffer)
detail::PassBase< command::DrawCommandBuf > Sub
void render(View &view, Framebuffer &combined_fb)
void sync(GPUMaterial *gpumat, float background_opacity, float background_blur)
const CameraData & data_get() const
bool is_perspective() const
PassMain::Sub * surface_material_add(::Material *blender_mat, GPUMaterial *gpumat)
gpu::Texture * render(View &main_view, View &render_view, Framebuffer &prepass_fb, Framebuffer &combined_fb, Framebuffer &gbuffer_fb, int2 extent, RayTraceBuffer &rt_buffer, gpu::Texture *radiance_behind_tx)
void end_sync(bool is_first_pass, bool is_last_pass, bool next_layer_has_transmission)
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)
int normal_layer_count() const
void debug_draw(draw::View &view, gpu::FrameBuffer *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)
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::@312272073133116306117315271010160007344264367302 front
A running instance of the engine.
VolumeProbeModule volume_probes
SphereProbeModule sphere_probes
RayTraceModule raytracing
RenderBuffers render_buffers
void info_append(const char *msg, Args &&...args)
UniformDataModule uniform_data
UtilityTexture utility_tx
PassMain::Sub * prepass_add(::Material *blender_mat, GPUMaterial *gpumat)
void render(View &view, gpu::Texture *depth_layer_tx, Framebuffer &gbuffer, Framebuffer &combined_fb, int2 extent)
PassMain::Sub * material_add(::Material *blender_mat, GPUMaterial *gpumat)
bool use_raytracing() const
TextureFromPool cryptomatte_tx
TextureFromPool combined_tx
bool use_clamp_indirect() const
bool use_clamp_direct() const
gpu::Shader * static_shader_get(eShaderType shader_type)
static ShadowTechnique shadow_technique
PassMain::Sub * surface_material_add(::Material *material, GPUMaterial *gpumat)
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)
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 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
Bounds< T > merge(const Bounds< T > &a, const Bounds< T > &b)
std::array< VecBase< T, 3 >, 8 > corners(const Bounds< VecBase< T, 3 > > &bounds)
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)
PassMain::Sub * volume_sub_pass(PassMain::Sub &ps, Scene *scene, Object *ob, GPUMaterial *gpu_material)
detail::Pass< command::DrawCommandBuf > PassSimple
detail::Pass< command::DrawMultiBuf > PassMain
@ 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
MatBase< float, 4, 4 > float4x4
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)
int gbuffer_additional_data_layer_id
gpu::Texture * feedback_ensure(bool is_dummy, int2 extent)
SphereProbeUvArea atlas_coord
std::optional< Bounds< float2 > > screen_bounds
VolumeObjectBounds(const Camera &camera, Object *ob)
std::optional< Bounds< float > > z_range