Blender  V3.3
workbench_transparent.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2020 Blender Foundation. */
3 
19 #include "DRW_render.h"
20 
21 #include "ED_view3d.h"
22 
23 #include "workbench_engine.h"
24 #include "workbench_private.h"
25 
27 {
28  WORKBENCH_FramebufferList *fbl = data->fbl;
29  WORKBENCH_PrivateData *wpd = data->stl->wpd;
32 
33  /* Reuse same format as opaque pipeline to reuse the textures. */
34  /* NOTE: Floating point texture is required for the reveal_tex as it is used for
35  * the alpha accumulation component (see accumulation shader for more explanation). */
36  const eGPUTextureFormat accum_tex_format = GPU_RGBA16F;
37  const eGPUTextureFormat reveal_tex_format = NORMAL_ENCODING_ENABLED() ? GPU_RG16F : GPU_RGBA32F;
38 
39  wpd->accum_buffer_tx = DRW_texture_pool_query_fullscreen(accum_tex_format, owner);
40  wpd->reveal_buffer_tx = DRW_texture_pool_query_fullscreen(reveal_tex_format, owner);
41 
42  GPU_framebuffer_ensure_config(&fbl->transp_accum_fb,
43  {
44  GPU_ATTACHMENT_TEXTURE(dtxl->depth),
45  GPU_ATTACHMENT_TEXTURE(wpd->accum_buffer_tx),
46  GPU_ATTACHMENT_TEXTURE(wpd->reveal_buffer_tx),
47  });
48 }
49 
51  DRWShadingGroup *grp)
52 {
53  DRW_shgroup_uniform_block(grp, "world_data", wpd->world_ubo);
54  DRW_shgroup_uniform_bool_copy(grp, "forceShadowing", false);
55 
60  struct GPUTexture *diff_tx = wpd->studio_light->matcap_diffuse.gputexture;
61  struct GPUTexture *spec_tx = wpd->studio_light->matcap_specular.gputexture;
62  const bool use_spec = workbench_is_specular_highlight_enabled(wpd);
63  spec_tx = (use_spec && spec_tx) ? spec_tx : diff_tx;
64  DRW_shgroup_uniform_texture(grp, "matcap_diffuse_tx", diff_tx);
65  DRW_shgroup_uniform_texture(grp, "matcap_specular_tx", spec_tx);
66  }
67 }
68 
70 {
71  WORKBENCH_PassList *psl = vedata->psl;
72  WORKBENCH_PrivateData *wpd = vedata->stl->wpd;
73  struct GPUShader *sh;
74  DRWShadingGroup *grp;
75 
76  {
77  int transp = 1;
78  for (int infront = 0; infront < 2; infront++) {
80  wpd->cull_state | wpd->clip_state;
81 
82  DRWPass *pass;
83  if (infront) {
84  psl->transp_accum_infront_ps = pass = DRW_pass_create("transp_accum_infront", state);
87  }
88  else {
89  psl->transp_accum_ps = pass = DRW_pass_create("transp_accum", state);
91  }
92 
94  wpd->prepass[transp][infront][data].material_hash = BLI_ghash_ptr_new(__func__);
95 
97 
98  wpd->prepass[transp][infront][data].common_shgrp = grp = DRW_shgroup_create(sh, pass);
99  DRW_shgroup_uniform_block(grp, "materials_data", wpd->material_ubo_curr);
100  DRW_shgroup_uniform_int_copy(grp, "materialIndex", -1);
102 
103  wpd->prepass[transp][infront][data].vcol_shgrp = grp = DRW_shgroup_create(sh, pass);
104  DRW_shgroup_uniform_block(grp, "materials_data", wpd->material_ubo_curr);
105  DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. (uses vcol) */
106 
108 
109  wpd->prepass[transp][infront][data].image_shgrp = grp = DRW_shgroup_create(sh, pass);
110  DRW_shgroup_uniform_block(grp, "materials_data", wpd->material_ubo_curr);
111  DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. */
113 
115 
116  wpd->prepass[transp][infront][data].image_tiled_shgrp = grp = DRW_shgroup_create(sh, pass);
117  DRW_shgroup_uniform_block(grp, "materials_data", wpd->material_ubo_curr);
118  DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. */
120  }
121  }
122  }
123  {
125 
127 
129 
131  DRW_shgroup_uniform_texture(grp, "transparentAccum", wpd->accum_buffer_tx);
132  DRW_shgroup_uniform_texture(grp, "transparentRevealage", wpd->reveal_buffer_tx);
134  }
135 }
136 
138 {
139  WORKBENCH_PrivateData *wpd = data->stl->wpd;
140  WORKBENCH_FramebufferList *fbl = data->fbl;
141  WORKBENCH_PassList *psl = data->psl;
142 
143  const bool do_xray_depth_pass = !XRAY_FLAG_ENABLED(wpd) || XRAY_ALPHA(wpd) > 0.0f;
144  const bool do_transparent_depth_pass = psl->outline_ps || wpd->dof_enabled || do_xray_depth_pass;
145 
146  if (do_transparent_depth_pass) {
147 
148  if (!DRW_pass_is_empty(psl->transp_depth_ps)) {
150  /* TODO(fclem): Disable writing to first two buffers. Unnecessary waste of bandwidth. */
152  }
153 
156  /* TODO(fclem): Disable writing to first two buffers. Unnecessary waste of bandwidth. */
158  }
159  }
160 }
@ STUDIOLIGHT_MATCAP_SPECULAR_GPUTEXTURE
@ STUDIOLIGHT_MATCAP_DIFFUSE_GPUTEXTURE
void BKE_studiolight_ensure_flag(StudioLight *sl, int flag)
Definition: studiolight.c:1517
GHash * BLI_ghash_ptr_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
#define DRW_PASS_INSTANCE_CREATE(pass, original, state)
Definition: DRW_render.h:691
DRWState
Definition: DRW_render.h:298
@ DRW_STATE_BLEND_ALPHA
Definition: DRW_render.h:328
@ DRW_STATE_WRITE_DEPTH
Definition: DRW_render.h:302
@ DRW_STATE_BLEND_OIT
Definition: DRW_render.h:332
@ DRW_STATE_WRITE_COLOR
Definition: DRW_render.h:303
@ DRW_STATE_DEPTH_LESS_EQUAL
Definition: DRW_render.h:311
#define DRW_PASS_CREATE(pass, state)
Definition: DRW_render.h:690
#define DRW_shgroup_uniform_block(shgroup, name, ubo)
Definition: DRW_render.h:651
#define XRAY_FLAG_ENABLED(v3d)
Definition: ED_view3d.h:1298
#define XRAY_ALPHA(v3d)
Definition: ED_view3d.h:1294
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
struct GPUShader GPUShader
Definition: GPU_shader.h:20
struct GPUTexture GPUTexture
Definition: GPU_texture.h:17
eGPUTextureFormat
Definition: GPU_texture.h:83
@ GPU_RG16F
Definition: GPU_texture.h:103
@ GPU_RGBA32F
Definition: GPU_texture.h:90
DefaultTextureList * DRW_viewport_texture_list_get(void)
Definition: draw_manager.c:638
void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const GPUTexture *tex)
void DRW_shgroup_call_procedural_triangles(DRWShadingGroup *shgroup, Object *ob, uint tri_count)
void DRW_shgroup_uniform_int_copy(DRWShadingGroup *shgroup, const char *name, const int value)
bool DRW_pass_is_empty(DRWPass *pass)
DRWShadingGroup * DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass)
DRWPass * DRW_pass_create(const char *name, DRWState state)
void DRW_shgroup_uniform_bool_copy(DRWShadingGroup *shgroup, const char *name, const bool value)
void DRW_draw_pass(DRWPass *pass)
GPUTexture * DRW_texture_pool_query_fullscreen(eGPUTextureFormat format, DrawEngineType *engine_type)
depth_tx normal_tx diffuse_light_tx specular_light_tx volume_light_tx environment_tx ambient_occlusion_tx aov_value_tx in_weight_img GPU_RGBA16F
const int state
ccl_gpu_kernel_postfix ccl_global float int int int int sh
struct GPUTexture * gputexture
StudioLightImage matcap_specular
StudioLightImage matcap_diffuse
WORKBENCH_PassList * psl
WORKBENCH_StorageList * stl
struct GPUFrameBuffer * opaque_fb
struct GPUFrameBuffer * transp_accum_fb
struct GPUFrameBuffer * opaque_infront_fb
struct DRWPass * transp_depth_infront_ps
struct DRWPass * transp_accum_ps
struct DRWPass * outline_ps
struct DRWPass * transp_depth_ps
struct DRWPass * transp_resolve_ps
struct DRWPass * transp_accum_infront_ps
struct DRWShadingGroup * vcol_shgrp
struct DRWShadingGroup * image_tiled_shgrp
struct DRWShadingGroup * common_shgrp
struct GHash * material_hash
struct DRWShadingGroup * image_shgrp
struct GPUUniformBuf * world_ubo
struct GPUUniformBuf * material_ubo_curr
struct GPUTexture * reveal_buffer_tx
WORKBENCH_Prepass prepass[2][2][WORKBENCH_DATATYPE_MAX]
struct GPUTexture * accum_buffer_tx
struct WORKBENCH_PrivateData * wpd
GPUShader * workbench_shader_transparent_resolve_get(WORKBENCH_PrivateData *wpd)
GPUShader * workbench_shader_transparent_image_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType data, bool tiled)
#define NORMAL_ENCODING_ENABLED()
#define STUDIOLIGHT_TYPE_MATCAP_ENABLED(wpd)
eWORKBENCH_DataType
@ WORKBENCH_DATATYPE_MAX
GPUShader * workbench_shader_transparent_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType data)
BLI_INLINE bool workbench_is_specular_highlight_enabled(WORKBENCH_PrivateData *wpd)
void workbench_transparent_engine_init(WORKBENCH_Data *data)
static void workbench_transparent_lighting_uniforms(WORKBENCH_PrivateData *wpd, DRWShadingGroup *grp)
void workbench_transparent_cache_init(WORKBENCH_Data *vedata)
void workbench_transparent_draw_depth_pass(WORKBENCH_Data *data)