33 const float background_opacity,
34 const float background_blur)
36 Manager &manager = *inst_.manager;
41 world_ps_.material_set(manager, gpumat);
42 world_ps_.push_constant(
"world_opacity_fade", background_opacity);
43 world_ps_.push_constant(
"world_background_blur",
square_f(background_blur));
45 world_ps_.push_constant(
"world_coord_packed",
reinterpret_cast<int4 *
>(&world_data.
atlas_coord));
46 world_ps_.bind_texture(
"utility_tx", inst_.pipelines.utility_tx);
48 world_ps_.bind_image(
"rp_color_img", &rbufs.
rp_color_tx);
49 world_ps_.bind_image(
"rp_value_img", &rbufs.
rp_value_tx);
52 world_ps_.bind_resources(inst_.cryptomatte);
53 world_ps_.bind_resources(inst_.uniform_data);
54 world_ps_.bind_resources(inst_.sampling);
55 world_ps_.bind_resources(inst_.sphere_probes);
56 world_ps_.bind_resources(inst_.volume_probes);
65 clear_ps_.bind_image(
"rp_color_img", &rbufs.
rp_color_tx);
66 clear_ps_.bind_image(
"rp_value_img", &rbufs.
rp_value_tx);
69 clear_ps_.bind_resources(inst_.cryptomatte);
70 clear_ps_.bind_resources(inst_.uniform_data);
78 inst_.manager->submit(clear_ps_,
view);
83 inst_.manager->submit(world_ps_,
view);
97 dummy_cryptomatte_tx_.ensure_2d(
GPU_RGBA32F, extent, usage);
98 dummy_renderpass_tx_.ensure_2d(
GPU_RGBA16F, extent, usage);
99 dummy_aov_color_tx_.ensure_2d_array(
GPU_RGBA16F, extent, 1, usage);
100 dummy_aov_value_tx_.ensure_2d_array(
GPU_R16F, extent, 1, usage);
106 Manager &manager = *inst_.manager;
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_);
122 pass.
bind_ssbo(
"aov_buf", &inst_.film.aovs_info);
135 inst_.pipelines.data.is_sphere_probe =
true;
136 inst_.uniform_data.push_update();
138 inst_.manager->submit(cubemap_face_ps_,
view);
140 inst_.pipelines.data.is_sphere_probe =
false;
141 inst_.uniform_data.push_update();
163 world_ps_.bind_resources(inst_.uniform_data);
164 world_ps_.bind_resources(inst_.volume.properties);
165 world_ps_.bind_resources(inst_.sampling);
167 world_ps_.material_set(*inst_.manager, gpumat);
171 is_valid_ = (sub !=
nullptr);
183 inst_.volume.prop_scattering_tx_.clear(
float4(0.0f));
184 inst_.volume.prop_extinction_tx_.clear(
float4(0.0f));
185 inst_.volume.prop_emission_tx_.clear(
float4(0.0f));
186 inst_.volume.prop_phase_tx_.clear(
float4(0.0f));
187 inst_.volume.prop_phase_weight_tx_.clear(
float4(0.0f));
191 inst_.manager->submit(world_ps_,
view);
210 if (shadow_update_tbdr) {
219 pass.
bind_ssbo(
"src_coord_buf", inst_.shadows.src_coord_buf_);
231 if (!shadow_update_tbdr) {
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_;
274 inst_.manager->submit(render_ps_,
view);
287 camera_forward_ = inst_.camera.forward();
289 has_transparent_ =
false;
300 prepass_ps_.bind_resources(inst_.uniform_data);
301 prepass_ps_.bind_resources(inst_.velocity);
302 prepass_ps_.bind_resources(inst_.sampling);
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");
323 opaque_ps_.bind_resources(inst_.uniform_data);
324 opaque_ps_.bind_resources(inst_.lights);
325 opaque_ps_.bind_resources(inst_.shadows);
326 opaque_ps_.bind_resources(inst_.volume.result);
327 opaque_ps_.bind_resources(inst_.sampling);
328 opaque_ps_.bind_resources(inst_.hiz_buffer.front);
329 opaque_ps_.bind_resources(inst_.volume_probes);
330 opaque_ps_.bind_resources(inst_.sphere_probes);
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_);
421 has_transparent_ =
true;
422 float sorting_value =
math::dot(
float3(ob->object_to_world().location()), camera_forward_);
434 if (!has_transparent_ && !has_opaque_) {
435 inst_.volume.draw_resolve(
view);
442 inst_.manager->submit(prepass_ps_,
view);
444 inst_.hiz_buffer.set_dirty();
446 inst_.shadows.set_view(
view, extent);
447 inst_.volume_probes.set_view(
view);
448 inst_.sphere_probes.set_view(
view);
452 inst_.manager->submit(opaque_ps_,
view);
457 inst_.volume.draw_resolve(
view);
459 if (has_transparent_) {
461 inst_.manager->submit(transparent_ps_,
view);
532 bool alpha_hash_subpixel_scale = !inst_.is_viewport() || !inst_.velocity.camera_has_motion();
533 inst_.pipelines.data.alpha_hash_scale = alpha_hash_subpixel_scale ? 0.1f : 1.0f;
561 bool next_layer_has_transmission)
563 const SceneEEVEE &sce_eevee = inst_.scene->eevee;
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_);
600 sub.
bind_ssbo(
"dummy_workaround_buf", &inst_.film.aovs_info);
618 set_bit(StencilBits::CLOSURE_COUNT_0);
621 set_bit(StencilBits::CLOSURE_COUNT_1);
624 set_bit(StencilBits::TRANSMISSION);
642 sub.
bind_texture(
"gbuf_header_tx", &inst_.gbuffer.header_tx);
643 sub.
bind_image(
"gbuf_normal_img", &inst_.gbuffer.normal_tx);
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]);
681 sub.
bind_image(
"indirect_radiance_1_img", &indirect_result_.closures[0]);
682 sub.
bind_image(
"indirect_radiance_2_img", &indirect_result_.closures[1]);
683 sub.
bind_image(
"indirect_radiance_3_img", &indirect_result_.closures[2]);
693 uint8_t(StencilBits::CLOSURE_COUNT_1) |
694 uint8_t(StencilBits::TRANSMISSION);
697 if (use_transmission) {
715 "render_pass_diffuse_light_enabled",
719 "render_pass_specular_light_enabled",
724 sh,
"use_radiance_feedback", use_feedback_output_ && use_clamp_direct_);
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_);
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_) {
817 inst_.hiz_buffer.update();
823 inst_.hiz_buffer.swap_layer();
825 inst_.hiz_buffer.update();
827 inst_.volume_probes.set_view(render_view);
828 inst_.sphere_probes.set_view(render_view);
829 inst_.shadows.set_view(render_view, extent);
831 inst_.gbuffer.bind(gbuffer_fb);
834 for (
int i = 0; i <
ARRAY_SIZE(direct_radiance_txs_); i++) {
835 direct_radiance_txs_[i].acquire(
839 if (use_raytracing_) {
840 indirect_result_ = inst_.raytracing.render(
841 rt_buffer, radiance_behind_tx,
closure_bits_, main_view, render_view);
843 else if (use_split_radiance_) {
844 indirect_result_ = inst_.raytracing.alloc_only(rt_buffer);
847 indirect_result_ = inst_.raytracing.alloc_dummy(rt_buffer);
851 inst_.manager->submit(eval_light_ps_, render_view);
853 inst_.subsurface.render(
854 direct_radiance_txs_[0], indirect_result_.closures[0],
closure_bits_, render_view);
856 radiance_feedback_tx_ = rt_buffer.
feedback_ensure(!use_feedback_output_, extent);
858 if (use_feedback_output_ && use_clamp_direct_) {
865 inst_.manager->submit(combine_ps_);
867 if (use_feedback_output_ && !use_clamp_direct_) {
872 indirect_result_.release();
874 for (
int i = 0; i <
ARRAY_SIZE(direct_radiance_txs_); i++) {
875 direct_radiance_txs_[i].release();
878 inst_.pipelines.deferred.debug_draw(render_view, combined_fb);
880 return use_feedback_output_ ? radiance_feedback_tx_ :
nullptr;
893 Instance &inst = opaque_layer_.inst_;
896 use_combined_lightprobe_eval = !use_raytracing;
899 refraction_layer_.begin_sync();
904 opaque_layer_.end_sync(
true, refraction_layer_.is_empty(), refraction_layer_.has_transmission());
905 refraction_layer_.end_sync(opaque_layer_.is_empty(),
true,
false);
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);
973 return opaque_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;
1038 occupancy_ps_ = &pass;
1050 material_ps_ = &pass;
1055 const ::Material *blender_mat,
1059 "Only volume material should be added here");
1072 const ::Material * ,
1076 "Only volume material should be added here");
1097 for (
const std::optional<
Bounds<float2>> &other_aabb : object_bounds_) {
1127 inst_.manager->submit(volume_layer_ps_,
view);
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);
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) {
1246 opaque_layer_.prepass_double_sided_static_ps_ = &pass.
sub(
"DoubleSided");
1247 opaque_layer_.prepass_double_sided_static_ps_->state_set(state_depth_only);
1248 opaque_layer_.prepass_single_sided_static_ps_ = &pass.
sub(
"SingleSided");
1249 opaque_layer_.prepass_single_sided_static_ps_->state_set(state_depth_only |
DRW_STATE_CULL_BACK);
1251 opaque_layer_.gbuffer_pass_sync(inst_);
1280 opaque_layer_.prepass_single_sided_static_ps_ :
1281 opaque_layer_.prepass_double_sided_static_ps_;
1295 opaque_layer_.closure_bits_ |= closure_bits;
1296 opaque_layer_.closure_count_ =
max_ii(opaque_layer_.closure_count_,
count_bits_i(closure_bits));
1302 ((backface_culling) ? opaque_layer_.gbuffer_single_sided_hybrid_ps_ :
1303 opaque_layer_.gbuffer_double_sided_hybrid_ps_) :
1304 ((backface_culling) ? opaque_layer_.gbuffer_single_sided_ps_ :
1305 opaque_layer_.gbuffer_double_sided_ps_);
1319 inst_.manager->submit(opaque_layer_.prepass_ps_,
view);
1321 inst_.hiz_buffer.set_source(&inst_.render_buffers.depth_tx);
1322 inst_.hiz_buffer.update();
1324 inst_.lights.set_view(
view, extent);
1325 inst_.shadows.set_view(
view, extent);
1326 inst_.volume_probes.set_view(
view);
1327 inst_.sphere_probes.set_view(
view);
1330 inst_.hiz_buffer.update();
1332 inst_.gbuffer.bind(gbuffer_fb);
1333 inst_.manager->submit(opaque_layer_.gbuffer_ps_,
view);
1336 inst_.manager->submit(eval_light_ps_,
view);
1428 GPUTexture *depth_layer_tx,
1435 inst_.pipelines.data.is_sphere_probe =
true;
1436 inst_.uniform_data.push_update();
1444 inst_.hiz_buffer.set_source(&depth_layer_tx, 0);
1445 inst_.hiz_buffer.update();
1447 inst_.lights.set_view(
view, extent);
1448 inst_.shadows.set_view(
view, extent);
1449 inst_.volume_probes.set_view(
view);
1450 inst_.sphere_probes.set_view(
view);
1452 inst_.gbuffer.bind(gbuffer_fb);
1456 inst_.manager->submit(eval_light_ps_,
view);
1458 inst_.pipelines.data.is_sphere_probe =
false;
1459 inst_.uniform_data.push_update();
1477 surface_ps_.framebuffer_set(&inst_.volume_probes.bake.empty_raster_fb_);
1479 surface_ps_.bind_ssbo(
SURFEL_BUF_SLOT, &inst_.volume_probes.bake.surfels_buf_);
1480 surface_ps_.bind_ssbo(
CAPTURE_BUF_SLOT, &inst_.volume_probes.bake.capture_info_buf_);
1485 surface_ps_.bind_resources(inst_.uniform_data);
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
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between camera
struct GPUShader GPUShader
void submit(PassSimple &pass, View &view)
void clear(float4 values)
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)
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 submit(command::RecordingState &state) const
void barrier(eGPUBarrier type)
void state_set(DRWState state, int clip_plane_count=0)
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)
detail::PassBase< command::DrawCommandBuf > Sub
void sync(GPUMaterial *gpumat, float background_opacity, float background_blur)
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)
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)
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::@333276274241261234242230221004020010346271237200 front
A running instance of the engine.
VolumeProbeModule volume_probes
SphereProbeModule sphere_probes
RenderBuffers render_buffers
void info_append(const char *msg, Args &&...args)
UniformDataModule uniform_data
UtilityTexture utility_tx
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)
TextureFromPool cryptomatte_tx
TextureFromPool combined_tx
GPUShader * static_shader_get(eShaderType shader_type)
static ShadowTechnique shadow_technique
PassMain::Sub * surface_material_add(::Material *material, GPUMaterial *gpumat)
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)
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)
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)
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 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
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
GPUTexture * 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