42 PassSimple clear_ps_ = {
"World.Background.Clear"};
48 void sync(
GPUMaterial *gpumat,
float background_opacity,
float background_blur);
114 PassMain render_ps_ = {
"Shadow.Surface"};
154 bool has_opaque_ =
false;
155 bool has_transparent_ =
false;
257class DeferredPipeline;
260 friend DeferredPipeline;
265 static constexpr int max_lighting_tile_count_ = 128 * 128;
282 {
"direct_radiance_1"}, {
"direct_radiance_2"}, {
"direct_radiance_3"}};
285 {
"indirect_radiance_1"}, {
"indirect_radiance_2"}, {
"indirect_radiance_3"}};
287 Texture dummy_black = {
"dummy_black"};
295 Texture tile_mask_tx_ = {
"tile_mask_tx_"};
299 bool use_split_radiance_ =
true;
301 bool use_feedback_output_ =
false;
302 bool use_raytracing_ =
false;
303 bool use_screen_transmission_ =
false;
304 bool use_screen_reflection_ =
false;
305 bool use_clamp_direct_ =
false;
306 bool use_clamp_indirect_ =
false;
312 dummy_black.ensure_2d(gpu::TextureFormat::RAYTRACE_RADIANCE_FORMAT,
319 void end_sync(
bool is_first_pass,
bool is_last_pass,
bool next_layer_has_transmission);
351 friend DeferredLayer;
356 DeferredLayer opaque_layer_;
357 DeferredLayer refraction_layer_;
358 DeferredLayer volumetric_layer_;
360 PassSimple debug_draw_ps_ = {
"debug_gbuffer"};
362 bool use_combined_lightprobe_eval;
366 : opaque_layer_(inst), refraction_layer_(inst), volumetric_layer_(inst) {};
386 return max_ii(opaque_layer_.header_layer_count(), refraction_layer_.header_layer_count());
392 return max_ii(opaque_layer_.closure_layer_count(), refraction_layer_.closure_layer_count());
398 return max_ii(opaque_layer_.normal_layer_count(), refraction_layer_.normal_layer_count());
405 return opaque_layer_.is_empty() && refraction_layer_.is_empty();
410 return opaque_layer_.closure_bits_get() | refraction_layer_.closure_bits_get();
414 void debug_pass_sync();
447 PassMain volume_layer_ps_ = {
"Volume.Layer"};
454 std::optional<Bounds<float2>> combined_screen_bounds_;
463 const ::Material *blender_mat,
466 const ::Material *blender_mat,
485 std::optional<Bounds<float>> object_integration_range_;
487 bool has_scatter_ =
false;
488 bool has_absorption_ =
false;
506 for (
const auto &layer : layers_) {
507 if (layer->has_scatter) {
515 for (
const auto &layer : layers_) {
516 if (layer->has_absorption) {
559 return opaque_layer_.header_layer_count();
565 return opaque_layer_.closure_layer_count();
571 return opaque_layer_.normal_layer_count();
614 PassMain surface_ps_ = {
"Capture.Surface"};
639 static constexpr int lut_size_sqr = lut_size * lut_size;
645 gpu::TextureFormat::SFLOAT_16_16_16_16,
663 layer.data[
y][
x][2] = 0.0f;
680 layer.data[
y][
x][3] = 0.0f;
742 data.is_sphere_probe =
false;
766 switch (pipeline_type) {
768 return probe.prepass_add(blender_mat, gpumat);
770 return probe.material_add(blender_mat, gpumat);
777 switch (pipeline_type) {
779 return planar.prepass_add(blender_mat, gpumat);
781 return planar.material_add(blender_mat, gpumat);
788 switch (pipeline_type) {
790 return deferred.prepass_add(blender_mat, gpumat,
false);
792 return forward.prepass_opaque_add(blender_mat, gpumat,
false);
794 BLI_assert_msg(0,
"Overlap prepass should register to the forward pipeline directly.");
798 return deferred.prepass_add(blender_mat, gpumat,
true);
800 return forward.prepass_opaque_add(blender_mat, gpumat,
true);
803 return deferred.material_add(blender_mat, gpumat);
805 return forward.material_opaque_add(blender_mat, gpumat);
807 return shadow.surface_material_add(blender_mat, gpumat);
809 return capture.surface_material_add(blender_mat, gpumat);
813 BLI_assert_msg(0,
"Volume shaders must register to the volume pipeline directly.");
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
MINLINE int max_ii(int a, int b)
MINLINE int count_bits_i(unsigned int n)
void GPU_texture_update_mipmap(blender::gpu::Texture *texture, int mip_level, eGPUDataFormat data_format, const void *pixels)
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_SHADER_WRITE
BMesh const char void * data
Texture(const char *name="gpu::Texture")
detail::PassBase< command::DrawMultiBuf > Sub
void sync(GPUMaterial *gpumat, float background_opacity, float background_blur)
BackgroundPipeline(Instance &inst)
PassMain::Sub * surface_material_add(::Material *blender_mat, GPUMaterial *gpumat)
CapturePipeline(Instance &inst)
void end_sync(bool is_first_pass, bool is_last_pass, bool next_layer_has_transmission)
DeferredLayer(Instance &inst)
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)
int normal_layer_count() const
eClosureBits closure_bits_get() const
int closure_layer_count() const
DeferredPipeline(Instance &inst)
void debug_draw(draw::View &view, gpu::FrameBuffer *combined_fb)
int header_layer_count() const
PassMain::Sub * material_add(::Material *blender_mat, GPUMaterial *gpumat)
PassMain::Sub * material_add(::Material *blender_mat, GPUMaterial *gpumat)
int closure_layer_count() const
PassMain::Sub * prepass_add(::Material *blender_mat, GPUMaterial *gpumat)
DeferredProbePipeline(Instance &inst)
int normal_layer_count() const
int header_layer_count() const
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)
ForwardPipeline(Instance &inst)
PassMain::Sub * prepass_transparent_add(const Object *ob, ::Material *blender_mat, GPUMaterial *gpumat)
A running instance of the engine.
WorldVolumePipeline world_volume
DeferredProbePipeline probe
UtilityTexture utility_tx
BackgroundPipeline background
PipelineModule(Instance &inst, PipelineInfoData &data)
PassMain::Sub * material_add(Object *, ::Material *blender_mat, GPUMaterial *gpumat, eMaterialPipeline pipeline_type, eMaterialProbe probe_capture)
PlanarProbePipeline planar
DeferredPipeline deferred
PlanarProbePipeline(Instance &inst)
PassMain::Sub * prepass_add(::Material *blender_mat, GPUMaterial *gpumat)
PassMain::Sub * material_add(::Material *blender_mat, GPUMaterial *gpumat)
PassMain::Sub * surface_material_add(::Material *material, GPUMaterial *gpumat)
ShadowPipeline(Instance &inst)
~UtilityTexture()=default
void add_object_bound(const VolumeObjectBounds &object_bounds)
bool bounds_overlaps(const VolumeObjectBounds &object_bounds) const
VolumeLayer(Instance &inst)
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)
bool has_absorption() const
bool use_hit_list() const
VolumePipeline(Instance &inst)
WorldPipeline(Instance &inst)
void sync(GPUMaterial *gpumat)
void sync(GPUMaterial *gpumat)
WorldVolumePipeline(Instance &inst)
#define UTIL_DISK_INTEGRAL_COMP
#define UTIL_DISK_INTEGRAL_LAYER
#define UTIL_BTDF_LAYER_COUNT
#define UTIL_LTC_MAT_LAYER
#define UTIL_SSS_TRANSMITTANCE_PROFILE_LAYER
#define UTIL_BLUE_NOISE_LAYER
detail::Pass< command::DrawCommandBuf > PassSimple
detail::Pass< command::DrawMultiBuf > PassMain
const float ltc_mat_ggx[64][64][4]
const float burley_sss_profile[64][1]
const float brdf_ggx[64][64][3]
const float random_walk_sss_profile[64][1]
const float ltc_disk_integral[64][64][1]
const float btdf_ggx[16][64][64][1]
const float bsdf_ggx[16][64][64][3]
const float blue_noise[64][64][4]
static int to_gbuffer_bin_count(const eClosureBits closure_bits)
@ MAT_PIPE_PREPASS_FORWARD_VELOCITY
@ MAT_PIPE_VOLUME_MATERIAL
@ MAT_PIPE_PREPASS_DEFERRED
@ MAT_PIPE_PREPASS_OVERLAP
@ MAT_PIPE_PREPASS_PLANAR
@ MAT_PIPE_PREPASS_DEFERRED_VELOCITY
@ MAT_PIPE_VOLUME_OCCUPANCY
@ MAT_PIPE_PREPASS_FORWARD
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 3 > float3
eClosureBits closure_bits_
int header_layer_count() const
int closure_layer_count() const
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_
eClosureBits closure_bits_get() const
PassMain::Sub * gbuffer_single_sided_hybrid_ps_
int normal_layer_count() const
PassMain::Sub * prepass_single_sided_moving_ps_
std::optional< Bounds< float2 > > screen_bounds
VolumeObjectBounds(const Camera &camera, Object *ob)
std::optional< Bounds< float > > z_range