Blender  V3.3
eevee_pipeline.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2021 Blender Foundation.
3  */
4 
13 #include "eevee_instance.hh"
14 
15 #include "eevee_pipeline.hh"
16 
17 namespace blender::eevee {
18 
19 /* -------------------------------------------------------------------- */
26 {
27  RenderBuffers &rbufs = inst_.render_buffers;
28 
30  world_ps_ = DRW_pass_create("World", state);
31 
32  /* Push a matrix at the same location as the camera. */
33  float4x4 camera_mat = float4x4::identity();
34  // copy_v3_v3(camera_mat[3], inst_.camera.data_get().viewinv[3]);
35 
36  DRWShadingGroup *grp = DRW_shgroup_material_create(gpumat, world_ps_);
37  DRW_shgroup_uniform_texture(grp, "utility_tx", inst_.pipelines.utility_tx);
39  DRW_shgroup_uniform_float_copy(grp, "world_opacity_fade", inst_.film.background_opacity_get());
40  /* AOVs. */
41  DRW_shgroup_uniform_image_ref(grp, "aov_color_img", &rbufs.aov_color_tx);
42  DRW_shgroup_uniform_image_ref(grp, "aov_value_img", &rbufs.aov_value_tx);
43  DRW_shgroup_storage_block_ref(grp, "aov_buf", &inst_.film.aovs_info);
44  /* RenderPasses. Cleared by background (even if bad practice). */
45  DRW_shgroup_uniform_image_ref(grp, "rp_normal_img", &rbufs.normal_tx);
46  DRW_shgroup_uniform_image_ref(grp, "rp_diffuse_light_img", &rbufs.diffuse_light_tx);
47  DRW_shgroup_uniform_image_ref(grp, "rp_diffuse_color_img", &rbufs.diffuse_color_tx);
48  DRW_shgroup_uniform_image_ref(grp, "rp_specular_light_img", &rbufs.specular_light_tx);
49  DRW_shgroup_uniform_image_ref(grp, "rp_specular_color_img", &rbufs.specular_color_tx);
50  DRW_shgroup_uniform_image_ref(grp, "rp_emission_img", &rbufs.emission_tx);
51  /* To allow opaque pass rendering over it. */
53 }
54 
56 {
57  DRW_draw_pass(world_ps_);
58 }
59 
62 /* -------------------------------------------------------------------- */
69 {
70  {
72  prepass_ps_ = DRW_pass_create("Forward.Opaque.Prepass", state);
73  prepass_velocity_ps_ = DRW_pass_create("Forward.Opaque.Prepass.Velocity",
75 
77  prepass_culled_ps_ = DRW_pass_create("Forward.Opaque.Prepass.Culled", state);
78  prepass_culled_velocity_ps_ = DRW_pass_create("Forward.Opaque.Prepass.Velocity",
80 
81  DRW_pass_link(prepass_ps_, prepass_velocity_ps_);
82  DRW_pass_link(prepass_velocity_ps_, prepass_culled_ps_);
83  DRW_pass_link(prepass_culled_ps_, prepass_culled_velocity_ps_);
84  }
85  {
87  opaque_ps_ = DRW_pass_create("Forward.Opaque", state);
88 
90  opaque_culled_ps_ = DRW_pass_create("Forward.Opaque.Culled", state);
91 
92  DRW_pass_link(opaque_ps_, opaque_culled_ps_);
93  }
94  {
96  transparent_ps_ = DRW_pass_create("Forward.Transparent", state);
97  }
98 }
99 
101 {
102  RenderBuffers &rbufs = inst_.render_buffers;
103  DRWPass *pass = (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) ? opaque_culled_ps_ : opaque_ps_;
104  // LightModule &lights = inst_.lights;
105  // LightProbeModule &lightprobes = inst_.lightprobes;
106  // RaytracingModule &raytracing = inst_.raytracing;
107  // eGPUSamplerState no_interp = GPU_SAMPLER_DEFAULT;
108  DRWShadingGroup *grp = DRW_shgroup_material_create(gpumat, pass);
109  // lights.shgroup_resources(grp);
110  // DRW_shgroup_uniform_block(grp, "sampling_buf", inst_.sampling.ubo_get());
111  // DRW_shgroup_uniform_block(grp, "grids_buf", lightprobes.grid_ubo_get());
112  // DRW_shgroup_uniform_block(grp, "cubes_buf", lightprobes.cube_ubo_get());
113  // DRW_shgroup_uniform_block(grp, "probes_buf", lightprobes.info_ubo_get());
114  // DRW_shgroup_uniform_texture_ref(grp, "lightprobe_grid_tx", lightprobes.grid_tx_ref_get());
115  // DRW_shgroup_uniform_texture_ref(grp, "lightprobe_cube_tx", lightprobes.cube_tx_ref_get());
116  DRW_shgroup_uniform_texture(grp, "utility_tx", inst_.pipelines.utility_tx);
117  /* AOVs. */
118  DRW_shgroup_uniform_image_ref(grp, "aov_color_img", &rbufs.aov_color_tx);
119  DRW_shgroup_uniform_image_ref(grp, "aov_value_img", &rbufs.aov_value_tx);
120  DRW_shgroup_storage_block_ref(grp, "aov_buf", &inst_.film.aovs_info);
121  /* RenderPasses. */
122  DRW_shgroup_uniform_image_ref(grp, "rp_normal_img", &rbufs.normal_tx);
123  DRW_shgroup_uniform_image_ref(grp, "rp_diffuse_light_img", &rbufs.diffuse_light_tx);
124  DRW_shgroup_uniform_image_ref(grp, "rp_diffuse_color_img", &rbufs.diffuse_color_tx);
125  DRW_shgroup_uniform_image_ref(grp, "rp_specular_light_img", &rbufs.specular_light_tx);
126  DRW_shgroup_uniform_image_ref(grp, "rp_specular_color_img", &rbufs.specular_color_tx);
127  DRW_shgroup_uniform_image_ref(grp, "rp_emission_img", &rbufs.emission_tx);
128 
129  /* TODO(fclem): Make this only needed if material uses it ... somehow. */
130  // if (true) {
131  // DRW_shgroup_uniform_texture_ref(
132  // grp, "sss_transmittance_tx", inst_.subsurface.transmittance_ref_get());
133  // }
134  // if (raytracing.enabled()) {
135  // DRW_shgroup_uniform_block(grp, "rt_diffuse_buf", raytracing.diffuse_data);
136  // DRW_shgroup_uniform_block(grp, "rt_reflection_buf", raytracing.reflection_data);
137  // DRW_shgroup_uniform_block(grp, "rt_refraction_buf", raytracing.refraction_data);
138  // DRW_shgroup_uniform_texture_ref_ex(grp, "radiance_tx", &input_screen_radiance_tx_,
139  // no_interp);
140  // }
141  // if (raytracing.enabled()) {
142  // DRW_shgroup_uniform_block(grp, "hiz_buf", inst_.hiz.ubo_get());
143  // DRW_shgroup_uniform_texture_ref(grp, "hiz_tx", inst_.hiz_front.texture_ref_get());
144  // }
145  return grp;
146 }
147 
149  GPUMaterial *gpumat,
150  bool has_motion)
151 {
152  DRWPass *pass = (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) ?
153  (has_motion ? prepass_culled_velocity_ps_ : prepass_culled_ps_) :
154  (has_motion ? prepass_velocity_ps_ : prepass_ps_);
155  DRWShadingGroup *grp = DRW_shgroup_material_create(gpumat, pass);
156  if (has_motion) {
157  inst_.velocity.bind_resources(grp);
158  }
159  return grp;
160 }
161 
163  GPUMaterial *gpumat)
164 {
165  // LightModule &lights = inst_.lights;
166  // LightProbeModule &lightprobes = inst_.lightprobes;
167  // RaytracingModule &raytracing = inst_.raytracing;
168  // eGPUSamplerState no_interp = GPU_SAMPLER_DEFAULT;
169  DRWShadingGroup *grp = DRW_shgroup_material_create(gpumat, transparent_ps_);
170  // lights.shgroup_resources(grp);
171  // DRW_shgroup_uniform_block(grp, "sampling_buf", inst_.sampling.ubo_get());
172  // DRW_shgroup_uniform_block(grp, "grids_buf", lightprobes.grid_ubo_get());
173  // DRW_shgroup_uniform_block(grp, "cubes_buf", lightprobes.cube_ubo_get());
174  // DRW_shgroup_uniform_block(grp, "probes_buf", lightprobes.info_ubo_get());
175  // DRW_shgroup_uniform_texture_ref(grp, "lightprobe_grid_tx", lightprobes.grid_tx_ref_get());
176  // DRW_shgroup_uniform_texture_ref(grp, "lightprobe_cube_tx", lightprobes.cube_tx_ref_get());
177  // DRW_shgroup_uniform_texture(grp, "utility_tx", inst_.pipelines.utility_tx);
178  /* TODO(fclem): Make this only needed if material uses it ... somehow. */
179  // if (true) {
180  // DRW_shgroup_uniform_texture_ref(
181  // grp, "sss_transmittance_tx", inst_.subsurface.transmittance_ref_get());
182  // }
183  // if (raytracing.enabled()) {
184  // DRW_shgroup_uniform_block(grp, "rt_diffuse_buf", raytracing.diffuse_data);
185  // DRW_shgroup_uniform_block(grp, "rt_reflection_buf", raytracing.reflection_data);
186  // DRW_shgroup_uniform_block(grp, "rt_refraction_buf", raytracing.refraction_data);
187  // DRW_shgroup_uniform_texture_ref_ex(
188  // grp, "rt_radiance_tx", &input_screen_radiance_tx_, no_interp);
189  // }
190  // if (raytracing.enabled()) {
191  // DRW_shgroup_uniform_block(grp, "hiz_buf", inst_.hiz.ubo_get());
192  // DRW_shgroup_uniform_texture_ref(grp, "hiz_tx", inst_.hiz_front.texture_ref_get());
193  // }
194 
195  DRWState state_disable = DRW_STATE_WRITE_DEPTH;
197  if (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) {
198  state_enable |= DRW_STATE_CULL_BACK;
199  }
200  DRW_shgroup_state_disable(grp, state_disable);
201  DRW_shgroup_state_enable(grp, state_enable);
202  return grp;
203 }
204 
206  GPUMaterial *gpumat)
207 {
208  if ((blender_mat->blend_flag & MA_BL_HIDE_BACKFACE) == 0) {
209  return nullptr;
210  }
211 
212  DRWShadingGroup *grp = DRW_shgroup_material_create(gpumat, transparent_ps_);
213 
215  DRWState state_enable = DRW_STATE_WRITE_DEPTH;
216  if (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) {
217  state_enable |= DRW_STATE_CULL_BACK;
218  }
219  DRW_shgroup_state_disable(grp, state_disable);
220  DRW_shgroup_state_enable(grp, state_enable);
221  return grp;
222 }
223 
225  Framebuffer &prepass_fb,
226  Framebuffer &combined_fb,
227  GPUTexture *depth_tx,
228  GPUTexture *UNUSED(combined_tx))
229 {
230  UNUSED_VARS(view, depth_tx, prepass_fb, combined_fb);
231  // HiZBuffer &hiz = inst_.hiz_front;
232 
233  DRW_stats_group_start("ForwardOpaque");
234 
235  GPU_framebuffer_bind(prepass_fb);
236  DRW_draw_pass(prepass_ps_);
237 
238  // hiz.set_dirty();
239 
240  // if (inst_.raytracing.enabled()) {
241  // rt_buffer.radiance_copy(combined_tx);
242  // hiz.update(depth_tx);
243  // }
244 
245  // inst_.shadows.set_view(view, depth_tx);
246 
247  GPU_framebuffer_bind(combined_fb);
248  DRW_draw_pass(opaque_ps_);
249 
251 
252  DRW_stats_group_start("ForwardTransparent");
253  /* TODO(fclem) This is suboptimal. We could sort during sync. */
254  /* FIXME(fclem) This wont work for panoramic, where we need
255  * to sort by distance to camera, not by z. */
256  DRW_pass_sort_shgroup_z(transparent_ps_);
257  DRW_draw_pass(transparent_ps_);
259 
260  // if (inst_.raytracing.enabled()) {
261  // gbuffer.ray_radiance_tx.release();
262  // }
263 }
264 
267 } // namespace blender::eevee
#define UNUSED_VARS(...)
#define UNUSED(x)
@ MA_BL_CULL_BACKFACE
@ MA_BL_HIDE_BACKFACE
DRWState
Definition: DRW_render.h:298
@ DRW_STATE_DEPTH_LESS
Definition: DRW_render.h:310
@ DRW_STATE_DEPTH_EQUAL
Definition: DRW_render.h:312
@ DRW_STATE_WRITE_DEPTH
Definition: DRW_render.h:302
@ DRW_STATE_WRITE_COLOR
Definition: DRW_render.h:303
@ DRW_STATE_DEPTH_LESS_EQUAL
Definition: DRW_render.h:311
@ DRW_STATE_CULL_BACK
Definition: DRW_render.h:316
@ DRW_STATE_BLEND_CUSTOM
Definition: DRW_render.h:336
#define DRW_shgroup_call_obmat(shgroup, geom, obmat)
Definition: DRW_render.h:420
#define DRW_shgroup_storage_block_ref(shgroup, name, ssbo)
Definition: DRW_render.h:657
static AppView * view
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
@ GPU_BARRIER_SHADER_IMAGE_ACCESS
Definition: GPU_state.h:28
struct GPUTexture GPUTexture
Definition: GPU_texture.h:17
AOVsInfoDataBuf aovs_info
Definition: eevee_film.hh:36
float background_opacity_get() const
Definition: eevee_film.hh:92
DRWShadingGroup * prepass_transparent_add(::Material *blender_mat, GPUMaterial *gpumat)
DRWShadingGroup * prepass_opaque_add(::Material *blender_mat, GPUMaterial *gpumat, bool has_motion)
DRWShadingGroup * material_opaque_add(::Material *blender_mat, GPUMaterial *gpumat)
void render(const DRWView *view, Framebuffer &prepass_fb, Framebuffer &combined_fb, GPUTexture *depth_tx, GPUTexture *combined_tx)
DRWShadingGroup * material_transparent_add(::Material *blender_mat, GPUMaterial *gpumat)
RenderBuffers render_buffers
void bind_resources(DRWShadingGroup *grp)
void sync(GPUMaterial *gpumat)
GPUBatch * DRW_cache_fullscreen_quad_get(void)
Definition: draw_cache.c:356
DRWShadingGroup * DRW_shgroup_material_create(struct GPUMaterial *material, DRWPass *pass)
void DRW_shgroup_uniform_float_copy(DRWShadingGroup *shgroup, const char *name, const float value)
void DRW_shgroup_state_disable(DRWShadingGroup *shgroup, DRWState state)
void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const GPUTexture *tex)
void DRW_shgroup_state_enable(DRWShadingGroup *shgroup, DRWState state)
void DRW_pass_link(DRWPass *first, DRWPass *second)
void DRW_shgroup_barrier(DRWShadingGroup *shgroup, eGPUBarrier type)
void DRW_pass_sort_shgroup_z(DRWPass *pass)
DRWPass * DRW_pass_create(const char *name, DRWState state)
void DRW_shgroup_uniform_image_ref(DRWShadingGroup *shgroup, const char *name, GPUTexture **tex)
void DRW_draw_pass(DRWPass *pass)
void DRW_stats_group_start(const char *name)
void DRW_stats_group_end(void)
const int state
c_style_float4x4 & ptr()
static float4x4 identity()
Definition: BLI_float4x4.hh:80