Blender  V2.93
gpencil_shader.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * Copyright 2019, Blender Foundation.
17  */
18 
22 #include "DRW_render.h"
23 
24 #include "gpencil_engine.h"
25 
27 extern char datatoc_gpencil_frag_glsl[];
28 extern char datatoc_gpencil_vert_glsl[];
35 extern char datatoc_gpencil_vfx_frag_glsl[];
36 
39 extern char datatoc_common_smaa_lib_glsl[];
40 extern char datatoc_common_view_lib_glsl[];
41 
42 static struct {
43  /* SMAA antialiasing */
45  /* GPencil Object rendering */
47  /* Final Compositing over rendered background. */
49  /* All layer blend types in one shader! */
51  /* Merge the final object depth to the depth buffer. */
53  /* Invert the content of the mask buffer. */
55  /* Effects. */
64  /* general drawing shaders */
76 } g_shaders = {{NULL}};
77 
79 {
80  DRW_SHADER_FREE_SAFE(g_shaders.antialiasing_sh[0]);
81  DRW_SHADER_FREE_SAFE(g_shaders.antialiasing_sh[1]);
82  DRW_SHADER_FREE_SAFE(g_shaders.antialiasing_sh[2]);
83  DRW_SHADER_FREE_SAFE(g_shaders.gpencil_sh);
84  DRW_SHADER_FREE_SAFE(g_shaders.composite_sh);
85  DRW_SHADER_FREE_SAFE(g_shaders.layer_blend_sh);
86  DRW_SHADER_FREE_SAFE(g_shaders.depth_merge_sh);
87  DRW_SHADER_FREE_SAFE(g_shaders.mask_invert_sh);
88  DRW_SHADER_FREE_SAFE(g_shaders.fx_composite_sh);
89  DRW_SHADER_FREE_SAFE(g_shaders.fx_colorize_sh);
90  DRW_SHADER_FREE_SAFE(g_shaders.fx_blur_sh);
91  DRW_SHADER_FREE_SAFE(g_shaders.fx_glow_sh);
92  DRW_SHADER_FREE_SAFE(g_shaders.fx_pixel_sh);
94  DRW_SHADER_FREE_SAFE(g_shaders.fx_shadow_sh);
95  DRW_SHADER_FREE_SAFE(g_shaders.fx_transform_sh);
96  DRW_SHADER_FREE_SAFE(g_shaders.gpencil_fill_sh);
97  DRW_SHADER_FREE_SAFE(g_shaders.gpencil_stroke_sh);
98  DRW_SHADER_FREE_SAFE(g_shaders.gpencil_point_sh);
99  DRW_SHADER_FREE_SAFE(g_shaders.gpencil_edit_point_sh);
100  DRW_SHADER_FREE_SAFE(g_shaders.gpencil_line_sh);
101  DRW_SHADER_FREE_SAFE(g_shaders.gpencil_drawing_fill_sh);
102  DRW_SHADER_FREE_SAFE(g_shaders.gpencil_fullscreen_sh);
103  DRW_SHADER_FREE_SAFE(g_shaders.gpencil_simple_fullscreen_sh);
104  DRW_SHADER_FREE_SAFE(g_shaders.gpencil_blend_fullscreen_sh);
105  DRW_SHADER_FREE_SAFE(g_shaders.gpencil_background_sh);
106  DRW_SHADER_FREE_SAFE(g_shaders.gpencil_paper_sh);
107 }
108 
110 {
111  BLI_assert(stage < 3);
112 
113  if (!g_shaders.antialiasing_sh[stage]) {
114  char stage_define[32];
115  BLI_snprintf(stage_define, sizeof(stage_define), "#define SMAA_STAGE %d\n", stage);
116 
117  g_shaders.antialiasing_sh[stage] = GPU_shader_create_from_arrays({
118  .vert =
119  (const char *[]){
120  "#define SMAA_INCLUDE_VS 1\n",
121  "#define SMAA_INCLUDE_PS 0\n",
122  "uniform vec4 viewportMetrics;\n",
125  NULL,
126  },
127  .frag =
128  (const char *[]){
129  "#define SMAA_INCLUDE_VS 0\n",
130  "#define SMAA_INCLUDE_PS 1\n",
131  "uniform vec4 viewportMetrics;\n",
134  NULL,
135  },
136  .defs =
137  (const char *[]){
138  "uniform float lumaWeight;\n",
139  "#define SMAA_GLSL_3\n",
140  "#define SMAA_RT_METRICS viewportMetrics\n",
141  "#define SMAA_PRESET_HIGH\n",
142  "#define SMAA_LUMA_WEIGHT float4(lumaWeight, lumaWeight, lumaWeight, 0.0)\n",
143  "#define SMAA_NO_DISCARD\n",
144  stage_define,
145  NULL,
146  },
147  });
148  }
149  return g_shaders.antialiasing_sh[stage];
150 }
151 
153 {
154  if (!g_shaders.gpencil_sh) {
156  .vert =
157  (const char *[]){
161  NULL,
162  },
163  .frag =
164  (const char *[]){
168  NULL,
169  },
170  .defs =
171  (const char *[]){
172  "#define GP_MATERIAL_BUFFER_LEN " STRINGIFY(GP_MATERIAL_BUFFER_LEN) "\n",
173  "#define GPENCIL_LIGHT_BUFFER_LEN " STRINGIFY(GPENCIL_LIGHT_BUFFER_LEN) "\n",
174  "#define UNIFORM_RESOURCE_ID\n",
175  NULL,
176  },
177  });
178  }
179  return g_shaders.gpencil_sh;
180 }
181 
183 {
184  if (!g_shaders.layer_blend_sh) {
185  g_shaders.layer_blend_sh = GPU_shader_create_from_arrays({
186  .vert =
187  (const char *[]){
189  NULL,
190  },
191  .frag =
192  (const char *[]){
195  NULL,
196  },
197  });
198  }
199  return g_shaders.layer_blend_sh;
200 }
201 
203 {
204  if (!g_shaders.mask_invert_sh) {
206  NULL);
207  }
208  return g_shaders.mask_invert_sh;
209 }
210 
212 {
213  if (!g_shaders.depth_merge_sh) {
214  g_shaders.depth_merge_sh = GPU_shader_create_from_arrays({
215  .vert =
216  (const char *[]){
219  NULL,
220  },
221  .frag =
222  (const char *[]){
224  NULL,
225  },
226  });
227  }
228  return g_shaders.depth_merge_sh;
229 }
230 
231 /* ------- FX Shaders --------- */
232 
234 {
235  if (!g_shaders.fx_blur_sh) {
237  "#define BLUR\n");
238  }
239  return g_shaders.fx_blur_sh;
240 }
241 
243 {
244  if (!g_shaders.fx_colorize_sh) {
246  "#define COLORIZE\n");
247  }
248  return g_shaders.fx_colorize_sh;
249 }
250 
252 {
253  if (!g_shaders.fx_composite_sh) {
255  "#define COMPOSITE\n");
256  }
257  return g_shaders.fx_composite_sh;
258 }
259 
261 {
262  if (!g_shaders.fx_glow_sh) {
264  .vert =
265  (const char *[]){
267  NULL,
268  },
269  .frag =
270  (const char *[]){
273  NULL,
274  },
275  .defs =
276  (const char *[]){
277  "#define GLOW\n",
278  NULL,
279  },
280  });
281  }
282  return g_shaders.fx_glow_sh;
283 }
284 
286 {
287  if (!g_shaders.fx_pixel_sh) {
289  "#define PIXELIZE\n");
290  }
291  return g_shaders.fx_pixel_sh;
292 }
293 
295 {
296  if (!g_shaders.fx_rim_sh) {
298  .vert =
299  (const char *[]){
301  NULL,
302  },
303  .frag =
304  (const char *[]){
307  NULL,
308  },
309  .defs =
310  (const char *[]){
311  "#define RIM\n",
312  NULL,
313  },
314  });
315  }
316  return g_shaders.fx_rim_sh;
317 }
318 
320 {
321  if (!g_shaders.fx_shadow_sh) {
323  "#define SHADOW\n");
324  }
325  return g_shaders.fx_shadow_sh;
326 }
327 
329 {
330  if (!g_shaders.fx_transform_sh) {
332  "#define TRANSFORM\n");
333  }
334  return g_shaders.fx_transform_sh;
335 }
#define BLI_assert(a)
Definition: BLI_assert.h:58
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define STRINGIFY(x)
#define GP_MATERIAL_BUFFER_LEN
#define DRW_shader_create_fullscreen(frag, defines)
Definition: DRW_render.h:241
#define DRW_SHADER_FREE_SAFE(shader)
Definition: DRW_render.h:279
struct GPUShader GPUShader
Definition: GPU_shader.h:33
#define GPU_shader_create_from_arrays(...)
Definition: GPU_shader.h:69
EvaluationStage stage
Definition: deg_eval.cc:96
#define GPENCIL_LIGHT_BUFFER_LEN
GPUShader * gpencil_fullscreen_sh
GPUShader * GPENCIL_shader_antialiasing(int stage)
GPUShader * fx_glow_sh
GPUShader * antialiasing_sh[3]
GPUShader * gpencil_stroke_sh
GPUShader * GPENCIL_shader_fx_colorize_get(void)
GPUShader * GPENCIL_shader_mask_invert_get(void)
GPUShader * mask_invert_sh
char datatoc_gpencil_antialiasing_vert_glsl[]
GPUShader * fx_transform_sh
GPUShader * gpencil_blend_fullscreen_sh
static struct @213 g_shaders
GPUShader * layer_blend_sh
char datatoc_common_smaa_lib_glsl[]
GPUShader * GPENCIL_shader_depth_merge_get(void)
GPUShader * gpencil_simple_fullscreen_sh
GPUShader * gpencil_edit_point_sh
char datatoc_gpencil_layer_blend_frag_glsl[]
char datatoc_gpencil_vfx_frag_glsl[]
GPUShader * GPENCIL_shader_fx_transform_get(void)
GPUShader * gpencil_point_sh
GPUShader * gpencil_drawing_fill_sh
GPUShader * GPENCIL_shader_geometry_get(void)
GPUShader * gpencil_background_sh
char datatoc_common_view_lib_glsl[]
char datatoc_gpencil_mask_invert_frag_glsl[]
char datatoc_common_fullscreen_vert_glsl[]
char datatoc_gpencil_depth_merge_frag_glsl[]
GPUShader * GPENCIL_shader_fx_rim_get(void)
char datatoc_gpencil_vert_glsl[]
GPUShader * gpencil_line_sh
GPUShader * fx_pixel_sh
void GPENCIL_shader_free(void)
GPUShader * GPENCIL_shader_fx_glow_get(void)
char datatoc_common_colormanagement_lib_glsl[]
GPUShader * fx_blur_sh
GPUShader * GPENCIL_shader_fx_pixelize_get(void)
char datatoc_gpencil_antialiasing_frag_glsl[]
GPUShader * GPENCIL_shader_fx_composite_get(void)
GPUShader * composite_sh
char datatoc_gpencil_depth_merge_vert_glsl[]
GPUShader * fx_rim_sh
GPUShader * GPENCIL_shader_layer_blend_get(void)
char datatoc_gpencil_frag_glsl[]
GPUShader * gpencil_fill_sh
GPUShader * depth_merge_sh
GPUShader * gpencil_paper_sh
char datatoc_gpencil_common_lib_glsl[]
GPUShader * fx_colorize_sh
GPUShader * GPENCIL_shader_fx_shadow_get(void)
GPUShader * fx_shadow_sh
GPUShader * fx_composite_sh
GPUShader * gpencil_sh
GPUShader * GPENCIL_shader_fx_blur_get(void)