Blender  V3.3
workbench_opaque.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2020 Blender Foundation. */
3 
17 #include "DRW_render.h"
18 
19 #include "workbench_engine.h"
20 #include "workbench_private.h"
21 
23 {
24  WORKBENCH_FramebufferList *fbl = data->fbl;
25  WORKBENCH_PrivateData *wpd = data->stl->wpd;
28 
29  /* Reused the same textures format for transparent pipeline to share the textures. */
30  const eGPUTextureFormat col_tex_format = GPU_RGBA16F;
32 
33  wpd->material_buffer_tx = DRW_texture_pool_query_fullscreen(col_tex_format, owner);
34  wpd->normal_buffer_tx = DRW_texture_pool_query_fullscreen(nor_tex_format, owner);
35 
36  GPU_framebuffer_ensure_config(&fbl->opaque_fb,
37  {
38  GPU_ATTACHMENT_TEXTURE(dtxl->depth),
39  GPU_ATTACHMENT_TEXTURE(wpd->material_buffer_tx),
40  GPU_ATTACHMENT_TEXTURE(wpd->normal_buffer_tx),
41  GPU_ATTACHMENT_TEXTURE(wpd->object_id_tx),
42  });
43 }
44 
46 {
47  WORKBENCH_PassList *psl = vedata->psl;
48  WORKBENCH_PrivateData *wpd = vedata->stl->wpd;
50  struct GPUShader *sh;
51  DRWShadingGroup *grp;
52 
53  const bool use_matcap = (wpd->shading.light == V3D_LIGHTING_MATCAP);
54 
55  {
57 
58  int opaque = 0;
59  for (int infront = 0; infront < 2; infront++) {
60  DRWPass *pass;
61  if (infront) {
63  pass = psl->opaque_infront_ps;
64  }
65  else {
67  pass = psl->opaque_ps;
68  }
69 
71  wpd->prepass[opaque][infront][data].material_hash = BLI_ghash_ptr_new(__func__);
72 
74 
75  wpd->prepass[opaque][infront][data].common_shgrp = grp = DRW_shgroup_create(sh, pass);
76  DRW_shgroup_uniform_block(grp, "world_data", wpd->world_ubo);
77  DRW_shgroup_uniform_block(grp, "materials_data", wpd->material_ubo_curr);
78  DRW_shgroup_uniform_int_copy(grp, "materialIndex", -1);
79  DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
80 
81  wpd->prepass[opaque][infront][data].vcol_shgrp = grp = DRW_shgroup_create(sh, pass);
82  DRW_shgroup_uniform_block(grp, "world_data", wpd->world_ubo);
83  DRW_shgroup_uniform_block(grp, "materials_data", wpd->material_ubo_curr);
84  DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. (uses vcol) */
85  DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
86 
88 
89  wpd->prepass[opaque][infront][data].image_shgrp = grp = DRW_shgroup_create(sh, pass);
90  DRW_shgroup_uniform_block(grp, "world_data", wpd->world_ubo);
91  DRW_shgroup_uniform_block(grp, "materials_data", wpd->material_ubo_curr);
92  DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. */
93  DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
94 
96 
97  wpd->prepass[opaque][infront][data].image_tiled_shgrp = grp = DRW_shgroup_create(sh, pass);
98  DRW_shgroup_uniform_block(grp, "world_data", wpd->world_ubo);
99  DRW_shgroup_uniform_block(grp, "materials_data", wpd->material_ubo_curr);
100  DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. */
101  DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
102  }
103  }
104  }
105  {
107 
109 
111 
112  grp = DRW_shgroup_create(sh, psl->composite_ps);
113  DRW_shgroup_uniform_block(grp, "world_data", wpd->world_ubo);
114  DRW_shgroup_uniform_texture(grp, "materialBuffer", wpd->material_buffer_tx);
115  DRW_shgroup_uniform_texture(grp, "normalBuffer", wpd->normal_buffer_tx);
116  DRW_shgroup_uniform_bool_copy(grp, "forceShadowing", false);
117  DRW_shgroup_stencil_mask(grp, 0x00);
118 
123  struct GPUTexture *diff_tx = wpd->studio_light->matcap_diffuse.gputexture;
124  struct GPUTexture *spec_tx = wpd->studio_light->matcap_specular.gputexture;
125  const bool use_spec = workbench_is_specular_highlight_enabled(wpd);
126  spec_tx = (use_spec && spec_tx) ? spec_tx : diff_tx;
127  DRW_shgroup_uniform_texture(grp, "matcap_diffuse_tx", diff_tx);
128  DRW_shgroup_uniform_texture(grp, "matcap_specular_tx", spec_tx);
129  }
131 
132  if (SHADOW_ENABLED(wpd)) {
133  grp = DRW_shgroup_create_sub(grp);
134  DRW_shgroup_uniform_bool_copy(grp, "forceShadowing", true);
137  DRW_shgroup_stencil_mask(grp, 0x00);
139  }
140  }
141  {
144 
146 
148 
150  DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth_in_front);
151  DRW_shgroup_stencil_mask(grp, 0x00);
153  }
154 }
@ 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
@ V3D_LIGHTING_MATCAP
DRWState
Definition: DRW_render.h:298
@ DRW_STATE_STENCIL_EQUAL
Definition: DRW_render.h:320
@ DRW_STATE_STENCIL_ALWAYS
Definition: DRW_render.h:319
@ 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_STENCIL_NEQUAL
Definition: DRW_render.h:321
@ DRW_STATE_DEPTH_ALWAYS
Definition: DRW_render.h:309
@ DRW_STATE_DEPTH_GREATER
Definition: DRW_render.h:313
@ DRW_STATE_WRITE_STENCIL
Definition: DRW_render.h:305
#define DRW_PASS_CREATE(pass, state)
Definition: DRW_render.h:690
#define DRW_shgroup_uniform_block(shgroup, name, ubo)
Definition: DRW_render.h:651
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
DefaultTextureList * DRW_viewport_texture_list_get(void)
Definition: draw_manager.c:638
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_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)
DRWShadingGroup * DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass)
DRWShadingGroup * DRW_shgroup_create_sub(DRWShadingGroup *shgroup)
void DRW_shgroup_uniform_texture_ref(DRWShadingGroup *shgroup, const char *name, GPUTexture **tex)
void DRW_shgroup_uniform_bool_copy(DRWShadingGroup *shgroup, const char *name, const bool value)
void DRW_shgroup_stencil_mask(DRWShadingGroup *shgroup, uint mask)
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 * depth_in_front
struct GPUTexture * gputexture
StudioLightImage matcap_specular
StudioLightImage matcap_diffuse
WORKBENCH_PassList * psl
WORKBENCH_StorageList * stl
struct GPUFrameBuffer * opaque_fb
struct DRWPass * composite_ps
struct DRWPass * opaque_infront_ps
struct DRWPass * merge_infront_ps
struct DRWPass * opaque_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 * normal_buffer_tx
struct GPUTexture * material_buffer_tx
WORKBENCH_Prepass prepass[2][2][WORKBENCH_DATATYPE_MAX]
struct WORKBENCH_PrivateData * wpd
void workbench_opaque_cache_init(WORKBENCH_Data *vedata)
void workbench_opaque_engine_init(WORKBENCH_Data *data)
#define NORMAL_ENCODING_ENABLED()
GPUShader * workbench_shader_composite_get(WORKBENCH_PrivateData *wpd)
GPUShader * workbench_shader_opaque_image_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType data, bool tiled)
#define STUDIOLIGHT_TYPE_MATCAP_ENABLED(wpd)
GPUShader * workbench_shader_merge_infront_get(WORKBENCH_PrivateData *wpd)
eWORKBENCH_DataType
@ WORKBENCH_DATATYPE_MAX
GPUShader * workbench_shader_opaque_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType data)
#define SHADOW_ENABLED(wpd)
BLI_INLINE bool workbench_is_specular_highlight_enabled(WORKBENCH_PrivateData *wpd)