Blender  V3.3
gpencil_antialiasing.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2019 Blender Foundation. */
3 
8 #include "DRW_render.h"
9 
10 #include "gpencil_engine.h"
11 
12 #include "smaa_textures.h"
13 
15 {
16  GPENCIL_PrivateData *pd = vedata->stl->pd;
17  GPENCIL_FramebufferList *fbl = vedata->fbl;
18  GPENCIL_TextureList *txl = vedata->txl;
19  GPENCIL_PassList *psl = vedata->psl;
20  DRWShadingGroup *grp;
21 
22  const float *size = DRW_viewport_size_get();
23  const float *sizeinv = DRW_viewport_invert_size_get();
24  const float metrics[4] = {sizeinv[0], sizeinv[1], size[0], size[1]};
25 
26  if (pd->simplify_antialias) {
27  /* No AA fallback. */
29 
32  DRW_shgroup_uniform_texture(grp, "blendTex", pd->color_tx);
33  DRW_shgroup_uniform_texture(grp, "colorTex", pd->color_tx);
34  DRW_shgroup_uniform_texture(grp, "revealTex", pd->reveal_tx);
35  DRW_shgroup_uniform_bool_copy(grp, "doAntiAliasing", false);
36  DRW_shgroup_uniform_bool_copy(grp, "onlyAlpha", pd->draw_wireframe);
37  DRW_shgroup_uniform_vec4_copy(grp, "viewportMetrics", metrics);
38 
40  return;
41  }
42 
43  if (txl->smaa_search_tx == NULL) {
45  "smaa_search", SEARCHTEX_WIDTH, SEARCHTEX_HEIGHT, 1, GPU_R8, NULL);
47 
49  "smaa_area", AREATEX_WIDTH, AREATEX_HEIGHT, 1, GPU_RG8, NULL);
51 
54  }
55 
56  {
61 
62  GPU_framebuffer_ensure_config(&fbl->smaa_edge_fb,
63  {
64  GPU_ATTACHMENT_NONE,
65  GPU_ATTACHMENT_TEXTURE(pd->smaa_edge_tx),
66  });
67 
68  GPU_framebuffer_ensure_config(&fbl->smaa_weight_fb,
69  {
70  GPU_ATTACHMENT_NONE,
71  GPU_ATTACHMENT_TEXTURE(pd->smaa_weight_tx),
72  });
73  }
74 
75  {
76  /* Stage 1: Edge detection. */
78 
80  grp = DRW_shgroup_create(sh, psl->smaa_edge_ps);
81  DRW_shgroup_uniform_texture(grp, "colorTex", pd->color_tx);
82  DRW_shgroup_uniform_texture(grp, "revealTex", pd->reveal_tx);
83  DRW_shgroup_uniform_vec4_copy(grp, "viewportMetrics", metrics);
85  grp, "lumaWeight", pd->scene->grease_pencil_settings.smaa_threshold);
86 
87  DRW_shgroup_clear_framebuffer(grp, GPU_COLOR_BIT, 0, 0, 0, 0, 0.0f, 0x0);
89  }
90  {
91  /* Stage 2: Blend Weight/Coord. */
93 
96  DRW_shgroup_uniform_texture(grp, "edgesTex", pd->smaa_edge_tx);
97  DRW_shgroup_uniform_texture(grp, "areaTex", txl->smaa_area_tx);
98  DRW_shgroup_uniform_texture(grp, "searchTex", txl->smaa_search_tx);
99  DRW_shgroup_uniform_vec4_copy(grp, "viewportMetrics", metrics);
100 
101  DRW_shgroup_clear_framebuffer(grp, GPU_COLOR_BIT, 0, 0, 0, 0, 0.0f, 0x0);
103  }
104  {
105  /* Stage 3: Resolve. */
107 
110  DRW_shgroup_uniform_texture(grp, "blendTex", pd->smaa_weight_tx);
111  DRW_shgroup_uniform_texture(grp, "colorTex", pd->color_tx);
112  DRW_shgroup_uniform_texture(grp, "revealTex", pd->reveal_tx);
113  DRW_shgroup_uniform_bool_copy(grp, "doAntiAliasing", true);
114  DRW_shgroup_uniform_bool_copy(grp, "onlyAlpha", pd->draw_wireframe);
115  DRW_shgroup_uniform_vec4_copy(grp, "viewportMetrics", metrics);
116 
118  }
119 }
120 
122 {
123  GPENCIL_FramebufferList *fbl = vedata->fbl;
124  GPENCIL_PrivateData *pd = vedata->stl->pd;
125  GPENCIL_PassList *psl = vedata->psl;
126 
127  if (!pd->simplify_antialias) {
130 
133  }
134 
137 }
@ DRW_STATE_WRITE_COLOR
Definition: DRW_render.h:303
@ DRW_STATE_BLEND_CUSTOM
Definition: DRW_render.h:336
#define DRW_PASS_CREATE(pass, state)
Definition: DRW_render.h:690
@ GPU_COLOR_BIT
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
struct GPUShader GPUShader
Definition: GPU_shader.h:20
@ GPU_DATA_UBYTE
Definition: GPU_texture.h:174
void GPU_texture_update(GPUTexture *tex, eGPUDataFormat data_format, const void *data)
Definition: gpu_texture.cc:444
void GPU_texture_filter_mode(GPUTexture *tex, bool use_filter)
Definition: gpu_texture.cc:518
GPUTexture * GPU_texture_create_2d(const char *name, int w, int h, int mip_len, eGPUTextureFormat format, const float *data)
Definition: gpu_texture.cc:291
@ GPU_RG8
Definition: GPU_texture.h:97
@ GPU_R8
Definition: GPU_texture.h:107
@ GPU_RGBA8
Definition: GPU_texture.h:87
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
const float * DRW_viewport_size_get(void)
Definition: draw_manager.c:288
const float * DRW_viewport_invert_size_get(void)
Definition: draw_manager.c:293
void DRW_shgroup_uniform_float_copy(DRWShadingGroup *shgroup, const char *name, const float value)
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)
DRWShadingGroup * DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass)
void DRW_shgroup_uniform_vec4_copy(DRWShadingGroup *shgroup, const char *name, const float *value)
void DRW_shgroup_clear_framebuffer(DRWShadingGroup *shgroup, eGPUFrameBufferBits channels, uchar r, uchar g, uchar b, uchar a, float depth, uchar stencil)
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_2d(int w, int h, eGPUTextureFormat format, DrawEngineType *engine_type)
void GPENCIL_antialiasing_draw(struct GPENCIL_Data *vedata)
void GPENCIL_antialiasing_init(struct GPENCIL_Data *vedata)
DrawEngineType draw_engine_gpencil_type
struct GPUShader * GPENCIL_shader_antialiasing(int stage)
ccl_gpu_kernel_postfix ccl_global float int int int int sh
const unsigned char searchTexBytes[]
const unsigned char areaTexBytes[]
Definition: smaa_textures.c:17
#define SEARCHTEX_HEIGHT
Definition: smaa_textures.h:22
#define SEARCHTEX_WIDTH
Definition: smaa_textures.h:21
#define AREATEX_HEIGHT
Definition: smaa_textures.h:11
#define AREATEX_WIDTH
Definition: smaa_textures.h:10
struct GPENCIL_TextureList * txl
struct GPENCIL_PassList * psl
struct GPENCIL_StorageList * stl
struct GPENCIL_FramebufferList * fbl
struct GPUFrameBuffer * smaa_weight_fb
struct GPUFrameBuffer * smaa_edge_fb
struct DRWPass * smaa_weight_ps
struct DRWPass * smaa_resolve_ps
struct DRWPass * smaa_edge_ps
GPUTexture * smaa_weight_tx
GPUTexture * reveal_tx
GPUTexture * color_tx
GPUFrameBuffer * scene_fb
struct Scene * scene
GPUTexture * smaa_edge_tx
struct GPENCIL_PrivateData * pd
struct GPUTexture * smaa_area_tx
struct GPUTexture * smaa_search_tx
struct SceneGpencil grease_pencil_settings