Blender V4.3
eevee_material_info.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "eevee_defines.hh"
7
8/* -------------------------------------------------------------------- */
12/* TODO(@fclem): This is a bit out of place at the moment. */
14 .typedef_source("eevee_defines.hh")
15 .typedef_source("eevee_shader_shared.hh");
16
18 .uniform_buf(UNIFORM_BUF_SLOT, "UniformData", "uniform_buf");
19
21 .define("EEVEE_SAMPLING_DATA")
22 .additional_info("eevee_shared")
23 .storage_buf(SAMPLING_BUF_SLOT, Qualifier::READ, "SamplingData", "sampling_buf");
24
26 .define("EEVEE_UTILITY_TX")
27 .sampler(RBUFS_UTILITY_TEX_SLOT, ImageType::FLOAT_2D_ARRAY, "utility_tx");
28
29GPU_SHADER_INTERFACE_INFO(eevee_clip_plane_iface, "clip_interp")
30 .smooth(Type::FLOAT, "clip_distance");
31
32GPU_SHADER_CREATE_INFO(eevee_clip_plane)
33 .vertex_out(eevee_clip_plane_iface)
34 .uniform_buf(CLIP_PLANE_BUF, "ClipPlaneData", "clip_plane")
35 .define("MAT_CLIP_PLANE");
36
39/* -------------------------------------------------------------------- */
43/* Common interface */
44GPU_SHADER_INTERFACE_INFO(eevee_surf_iface, "interp")
45 /* World Position. */
46 .smooth(Type::VEC3, "P")
47 /* World Normal. */
48 .smooth(Type::VEC3, "N");
49
50GPU_SHADER_CREATE_INFO(eevee_geom_mesh)
51 .additional_info("eevee_shared")
52 .define("MAT_GEOM_MESH")
53 .vertex_in(0, Type::VEC3, "pos")
54 .vertex_in(1, Type::VEC3, "nor")
55 .vertex_source("eevee_geom_mesh_vert.glsl")
56 .vertex_out(eevee_surf_iface)
57 .additional_info("draw_modelmat_new",
58 "draw_object_infos_new",
59 "draw_resource_id_varying",
60 "draw_view");
61
62GPU_SHADER_INTERFACE_INFO(eevee_surf_point_cloud_iface, "point_cloud_interp")
63 .smooth(Type::FLOAT, "radius")
64 .smooth(Type::VEC3, "position");
65GPU_SHADER_INTERFACE_INFO(eevee_surf_point_cloud_flat_iface, "point_cloud_interp_flat")
66 .flat(Type::INT, "id");
67
68GPU_SHADER_CREATE_INFO(eevee_geom_point_cloud)
69 .additional_info("eevee_shared")
70 .define("MAT_GEOM_POINT_CLOUD")
71 .vertex_source("eevee_geom_point_cloud_vert.glsl")
72 .vertex_out(eevee_surf_iface)
73 .vertex_out(eevee_surf_point_cloud_iface)
74 .vertex_out(eevee_surf_point_cloud_flat_iface)
75 .additional_info("draw_pointcloud_new",
76 "draw_modelmat_new",
77 "draw_object_infos_new",
78 "draw_resource_id_varying",
79 "draw_view");
80
81GPU_SHADER_CREATE_INFO(eevee_geom_volume)
82 .additional_info("eevee_shared")
83 .define("MAT_GEOM_VOLUME")
84 .vertex_in(0, Type::VEC3, "pos")
85 .vertex_out(eevee_surf_iface)
86 .vertex_source("eevee_geom_volume_vert.glsl")
87 .additional_info("draw_modelmat_new",
88 "draw_object_infos_new",
89 "draw_resource_id_varying",
90 "draw_volume_infos",
91 "draw_view");
92
93GPU_SHADER_CREATE_INFO(eevee_geom_gpencil)
94 .additional_info("eevee_shared")
95 .define("MAT_GEOM_GPENCIL")
96 .vertex_source("eevee_geom_gpencil_vert.glsl")
97 .vertex_out(eevee_surf_iface)
98 .additional_info("draw_gpencil_new",
99 "draw_modelmat_new",
100 "draw_object_infos_new",
101 "draw_resource_id_varying",
102 "draw_resource_id_new");
103
104GPU_SHADER_INTERFACE_INFO(eevee_surf_curve_iface, "curve_interp")
105 .smooth(Type::VEC2, "barycentric_coords")
106 .smooth(Type::VEC3, "tangent")
107 .smooth(Type::VEC3, "binormal")
108 .smooth(Type::FLOAT, "time")
109 .smooth(Type::FLOAT, "time_width")
110 .smooth(Type::FLOAT, "thickness");
111GPU_SHADER_INTERFACE_INFO(eevee_surf_curve_flat_iface, "curve_interp_flat")
112 .flat(Type::INT, "strand_id");
113
114GPU_SHADER_CREATE_INFO(eevee_geom_curves)
115 .additional_info("eevee_shared")
116 .define("MAT_GEOM_CURVES")
117 .vertex_source("eevee_geom_curves_vert.glsl")
118 .vertex_out(eevee_surf_iface)
119 .vertex_out(eevee_surf_curve_iface)
120 .vertex_out(eevee_surf_curve_flat_iface)
121 .additional_info("draw_modelmat_new",
122 "draw_object_infos_new",
123 "draw_resource_id_varying",
124 "draw_view",
125 "draw_hair_new",
126 "draw_curves_infos");
127
128GPU_SHADER_CREATE_INFO(eevee_geom_world)
129 .additional_info("eevee_shared")
130 .define("MAT_GEOM_WORLD")
131 .builtins(BuiltinBits::VERTEX_ID)
132 .vertex_source("eevee_geom_world_vert.glsl")
133 .vertex_out(eevee_surf_iface)
134 .additional_info("draw_modelmat_new",
135 "draw_object_infos_new", /* Unused, but allow debug compilation. */
136 "draw_resource_id_varying",
137 "draw_view");
138
141/* -------------------------------------------------------------------- */
145#define image_out(slot, qualifier, format, name) \
146 image(slot, format, qualifier, ImageType::FLOAT_2D, name, Frequency::PASS)
147#define image_array_out(slot, qualifier, format, name) \
148 image(slot, format, qualifier, ImageType::FLOAT_2D_ARRAY, name, Frequency::PASS)
149
151 .define("MAT_RENDER_PASS_SUPPORT")
152 .additional_info("eevee_global_ubo")
153 .image_array_out(RBUFS_COLOR_SLOT, Qualifier::WRITE, GPU_RGBA16F, "rp_color_img")
154 .image_array_out(RBUFS_VALUE_SLOT, Qualifier::WRITE, GPU_R16F, "rp_value_img");
155
157 .storage_buf(CRYPTOMATTE_BUF_SLOT, Qualifier::READ, "vec2", "cryptomatte_object_buf[]")
158 .image_out(RBUFS_CRYPTOMATTE_SLOT, Qualifier::WRITE, GPU_RGBA32F, "rp_cryptomatte_img");
159
160GPU_SHADER_CREATE_INFO(eevee_surf_deferred_base)
161 .define("MAT_DEFERRED")
162 .define("GBUFFER_WRITE")
163 /* NOTE: This removes the possibility of using gl_FragDepth. */
164 .early_fragment_test(true)
165 /* Direct output. (Emissive, Holdout) */
166 .fragment_out(0, Type::VEC4, "out_radiance")
167 .fragment_out(1, Type::UINT, "out_gbuf_header", DualBlend::NONE, DEFERRED_GBUFFER_ROG_ID)
168 .fragment_out(2, Type::VEC2, "out_gbuf_normal")
169 .fragment_out(3, Type::VEC4, "out_gbuf_closure1")
170 .fragment_out(4, Type::VEC4, "out_gbuf_closure2")
171 /* Everything is stored inside a two layered target, one for each format. This is to fit the
172 * limitation of the number of images we can bind on a single shader. */
173 .image_array_out(GBUF_CLOSURE_SLOT, Qualifier::WRITE, GPU_RGB10_A2, "out_gbuf_closure_img")
174 .image_array_out(GBUF_NORMAL_SLOT, Qualifier::WRITE, GPU_RG16, "out_gbuf_normal_img")
175 .additional_info("eevee_global_ubo",
176 "eevee_utility_texture",
177 /* Added at runtime because of test shaders not having `node_tree`. */
178 // "eevee_render_pass_out",
179 // "eevee_cryptomatte_out",
180 "eevee_sampling_data",
181 "eevee_hiz_data");
182
183GPU_SHADER_CREATE_INFO(eevee_surf_deferred)
184 .fragment_source("eevee_surf_deferred_frag.glsl")
185 .additional_info("eevee_surf_deferred_base");
186
187GPU_SHADER_CREATE_INFO(eevee_surf_deferred_hybrid)
188 .fragment_source("eevee_surf_hybrid_frag.glsl")
189 .additional_info("eevee_surf_deferred_base",
190 "eevee_light_data",
191 "eevee_lightprobe_data",
192 "eevee_shadow_data");
193
194GPU_SHADER_CREATE_INFO(eevee_surf_forward)
195 .define("MAT_FORWARD")
196 /* Early fragment test is needed for render passes support for forward surfaces. */
197 /* NOTE: This removes the possibility of using gl_FragDepth. */
198 .early_fragment_test(true)
199 .fragment_out(0, Type::VEC4, "out_radiance", DualBlend::SRC_0)
200 .fragment_out(0, Type::VEC4, "out_transmittance", DualBlend::SRC_1)
201 .fragment_source("eevee_surf_forward_frag.glsl")
202 .additional_info("eevee_global_ubo",
203 "eevee_light_data",
204 "eevee_lightprobe_data",
205 "eevee_utility_texture",
206 "eevee_sampling_data",
207 "eevee_shadow_data",
208 "eevee_hiz_data",
209 "eevee_volume_lib"
210 /* Optionally added depending on the material. */
211 // "eevee_render_pass_out",
212 // "eevee_cryptomatte_out",
213 );
214
215GPU_SHADER_CREATE_INFO(eevee_surf_capture)
216 .define("MAT_CAPTURE")
217 .storage_buf(SURFEL_BUF_SLOT, Qualifier::WRITE, "Surfel", "surfel_buf[]")
218 .storage_buf(CAPTURE_BUF_SLOT, Qualifier::READ_WRITE, "CaptureInfoData", "capture_info_buf")
219 .push_constant(Type::BOOL, "is_double_sided")
220 .fragment_source("eevee_surf_capture_frag.glsl")
221 .additional_info("eevee_global_ubo", "eevee_utility_texture");
222
223GPU_SHADER_CREATE_INFO(eevee_surf_depth)
224 .define("MAT_DEPTH")
225 .fragment_source("eevee_surf_depth_frag.glsl")
226 .additional_info("eevee_global_ubo", "eevee_sampling_data", "eevee_utility_texture");
227
228GPU_SHADER_CREATE_INFO(eevee_surf_world)
229 .push_constant(Type::FLOAT, "world_opacity_fade")
230 .push_constant(Type::FLOAT, "world_background_blur")
231 .push_constant(Type::IVEC4, "world_coord_packed")
232 .early_fragment_test(true)
233 .fragment_out(0, Type::VEC4, "out_background")
234 .fragment_source("eevee_surf_world_frag.glsl")
235 .additional_info("eevee_global_ubo",
236 "eevee_lightprobe_sphere_data",
237 "eevee_volume_probe_data",
238 "eevee_sampling_data",
239 /* Optionally added depending on the material. */
240 // "eevee_render_pass_out",
241 // "eevee_cryptomatte_out",
242 "eevee_utility_texture");
243
244GPU_SHADER_CREATE_INFO(eevee_renderpass_clear)
245 .fragment_out(0, Type::VEC4, "out_background")
246 .fragment_source("eevee_renderpass_clear_frag.glsl")
247 .additional_info("draw_fullscreen",
248 "eevee_global_ubo",
249 "eevee_render_pass_out",
250 "eevee_cryptomatte_out",
251 "eevee_shared")
252 .do_static_compilation(true);
253
254GPU_SHADER_INTERFACE_INFO(eevee_surf_shadow_atomic_iface, "shadow_iface")
255 .flat(Type::INT, "shadow_view_id");
256
257GPU_SHADER_INTERFACE_INFO(eevee_surf_shadow_clipping_iface, "shadow_clip")
258 .smooth(Type::VEC3, "position")
259 .smooth(Type::VEC3, "vector");
260
261GPU_SHADER_CREATE_INFO(eevee_surf_shadow)
262 .define("DRW_VIEW_LEN", STRINGIFY(SHADOW_VIEW_MAX))
263 .define("MAT_SHADOW")
264 .builtins(BuiltinBits::VIEWPORT_INDEX)
265 .vertex_out(eevee_surf_shadow_clipping_iface)
266 .storage_buf(SHADOW_RENDER_VIEW_BUF_SLOT,
267 Qualifier::READ,
268 "ShadowRenderView",
269 "render_view_buf[SHADOW_VIEW_MAX]")
270 .fragment_source("eevee_surf_shadow_frag.glsl")
271 .additional_info("eevee_global_ubo", "eevee_utility_texture", "eevee_sampling_data");
272
273GPU_SHADER_CREATE_INFO(eevee_surf_shadow_atomic)
274 .additional_info("eevee_surf_shadow")
275 .define("SHADOW_UPDATE_ATOMIC_RASTER")
276 .builtins(BuiltinBits::TEXTURE_ATOMIC)
277 .vertex_out(eevee_surf_shadow_atomic_iface)
278 .storage_buf(SHADOW_RENDER_MAP_BUF_SLOT,
279 Qualifier::READ,
280 "uint",
281 "render_map_buf[SHADOW_RENDER_MAP_SIZE]")
283 GPU_R32UI,
284 Qualifier::READ_WRITE,
285 ImageType::UINT_2D_ARRAY_ATOMIC,
286 "shadow_atlas_img");
287
288GPU_SHADER_CREATE_INFO(eevee_surf_shadow_tbdr)
289 .additional_info("eevee_surf_shadow")
290 .define("SHADOW_UPDATE_TBDR")
291 .builtins(BuiltinBits::LAYER)
292 /* Use greater depth write to avoid loosing the early Z depth test but ensure correct fragment
293 * ordering after slope bias. */
294 .depth_write(DepthWrite::GREATER)
295 /* F32 color attachment for on-tile depth accumulation without atomics. */
296 .fragment_out(0, Type::FLOAT, "out_depth", DualBlend::NONE, SHADOW_ROG_ID);
297
298#undef image_out
299#undef image_array_out
300
303/* -------------------------------------------------------------------- */
307GPU_SHADER_CREATE_INFO(eevee_surf_volume)
308 .define("MAT_VOLUME")
309 /* Only the front fragments have to be invoked. */
310 .early_fragment_test(true)
313 Qualifier::READ_WRITE,
314 ImageType::FLOAT_3D,
315 "out_scattering_img")
318 Qualifier::READ_WRITE,
319 ImageType::FLOAT_3D,
320 "out_extinction_img")
323 Qualifier::READ_WRITE,
324 ImageType::FLOAT_3D,
325 "out_emissive_img")
327 GPU_R16F,
328 Qualifier::READ_WRITE,
329 ImageType::FLOAT_3D,
330 "out_phase_img")
333 Qualifier::READ_WRITE,
334 ImageType::FLOAT_3D,
335 "out_phase_weight_img")
337 GPU_R32UI,
338 Qualifier::READ,
339 ImageType::UINT_3D_ATOMIC,
340 "occupancy_img")
341 .fragment_source("eevee_surf_volume_frag.glsl")
342 .additional_info("draw_modelmat_new_common",
343 "draw_view",
344 "eevee_shared",
345 "eevee_global_ubo",
346 "eevee_sampling_data",
347 "eevee_utility_texture");
348
349GPU_SHADER_CREATE_INFO(eevee_surf_occupancy)
350 .define("MAT_OCCUPANCY")
351 /* All fragments need to be invoked even if we write to the depth buffer. */
352 .early_fragment_test(false)
353 .builtins(BuiltinBits::TEXTURE_ATOMIC)
354 .push_constant(Type::BOOL, "use_fast_method")
355 .image(VOLUME_HIT_DEPTH_SLOT, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_3D, "hit_depth_img")
357 GPU_R32UI,
358 Qualifier::READ_WRITE,
359 ImageType::UINT_2D_ATOMIC,
360 "hit_count_img")
362 GPU_R32UI,
363 Qualifier::READ_WRITE,
364 ImageType::UINT_3D_ATOMIC,
365 "occupancy_img")
366 .fragment_source("eevee_surf_occupancy_frag.glsl")
367 .additional_info("eevee_global_ubo", "eevee_sampling_data");
368
371/* -------------------------------------------------------------------- */
377#ifndef NDEBUG
378
379/* Stub functions defined by the material evaluation. */
380GPU_SHADER_CREATE_INFO(eevee_material_stub)
381 .define("EEVEE_MATERIAL_STUBS")
382 /* Dummy uniform buffer to detect overlap with material node-tree. */
383 .uniform_buf(0, "int", "node_tree");
384
385# define EEVEE_MAT_FINAL_VARIATION(name, ...) \
386 GPU_SHADER_CREATE_INFO(name).additional_info(__VA_ARGS__).do_static_compilation(true);
387
388# define EEVEE_MAT_GEOM_VARIATIONS(prefix, ...) \
389 EEVEE_MAT_FINAL_VARIATION(prefix##_world, "eevee_geom_world", __VA_ARGS__) \
390 /* Turned off until dependency on common_view/math_lib are sorted out. */ \
391 /* EEVEE_MAT_FINAL_VARIATION(prefix##_gpencil, "eevee_geom_gpencil", __VA_ARGS__) */ \
392 EEVEE_MAT_FINAL_VARIATION(prefix##_curves, "eevee_geom_curves", __VA_ARGS__) \
393 EEVEE_MAT_FINAL_VARIATION(prefix##_mesh, "eevee_geom_mesh", __VA_ARGS__) \
394 EEVEE_MAT_FINAL_VARIATION(prefix##_point_cloud, "eevee_geom_point_cloud", __VA_ARGS__) \
395 EEVEE_MAT_FINAL_VARIATION(prefix##_volume, "eevee_geom_volume", __VA_ARGS__)
396
397# define EEVEE_MAT_PIPE_VARIATIONS(name, ...) \
398 EEVEE_MAT_GEOM_VARIATIONS(name##_world, "eevee_surf_world", __VA_ARGS__) \
399 EEVEE_MAT_GEOM_VARIATIONS(name##_depth, "eevee_surf_depth", __VA_ARGS__) \
400 EEVEE_MAT_GEOM_VARIATIONS(name##_deferred, "eevee_surf_deferred", __VA_ARGS__) \
401 EEVEE_MAT_GEOM_VARIATIONS(name##_forward, "eevee_surf_forward", __VA_ARGS__) \
402 EEVEE_MAT_GEOM_VARIATIONS(name##_capture, "eevee_surf_capture", __VA_ARGS__) \
403 EEVEE_MAT_GEOM_VARIATIONS(name##_volume, "eevee_surf_volume", __VA_ARGS__) \
404 EEVEE_MAT_GEOM_VARIATIONS(name##_occupancy, "eevee_surf_occupancy", __VA_ARGS__) \
405 EEVEE_MAT_GEOM_VARIATIONS(name##_shadow_atomic, "eevee_surf_shadow_atomic", __VA_ARGS__) \
406 EEVEE_MAT_GEOM_VARIATIONS(name##_shadow_tbdr, "eevee_surf_shadow_tbdr", __VA_ARGS__)
407
408EEVEE_MAT_PIPE_VARIATIONS(eevee_surface, "eevee_material_stub")
409
410#endif
411
#define STRINGIFY(x)
@ GPU_RGB10_A2
#define VOLUME_PROP_SCATTERING_IMG_SLOT
#define DEFERRED_GBUFFER_ROG_ID
#define RBUFS_UTILITY_TEX_SLOT
#define SHADOW_VIEW_MAX
#define VOLUME_HIT_DEPTH_SLOT
#define CAPTURE_BUF_SLOT
#define SAMPLING_BUF_SLOT
#define VOLUME_PROP_PHASE_WEIGHT_IMG_SLOT
#define VOLUME_HIT_COUNT_SLOT
#define RBUFS_CRYPTOMATTE_SLOT
#define VOLUME_OCCUPANCY_SLOT
#define GBUF_CLOSURE_SLOT
#define SHADOW_ATLAS_IMG_SLOT
#define SHADOW_RENDER_MAP_BUF_SLOT
#define CRYPTOMATTE_BUF_SLOT
#define VOLUME_PROP_EXTINCTION_IMG_SLOT
#define RBUFS_VALUE_SLOT
#define RBUFS_COLOR_SLOT
#define SHADOW_RENDER_VIEW_BUF_SLOT
#define VOLUME_PROP_PHASE_IMG_SLOT
#define UNIFORM_BUF_SLOT
#define GBUF_NORMAL_SLOT
#define CLIP_PLANE_BUF
#define VOLUME_PROP_EMISSION_IMG_SLOT
#define SHADOW_ROG_ID
#define SURFEL_BUF_SLOT
out_scattering_img out_emissive_img GPU_R16F
out_scattering_img out_emissive_img out_phase_weight_img eevee_shared
DualBlend::SRC_0 eevee_sampling_data
push_constant(Type::FLOAT, "world_opacity_fade") .push_constant(Type eevee_global_ubo
#define EEVEE_MAT_PIPE_VARIATIONS(name,...)
push_constant(Type::FLOAT, "world_opacity_fade") .push_constant(Type eevee_cryptomatte_out
out_radiance out_gbuf_normal out_gbuf_closure2 GPU_RG16
DualBlend::SRC_0 eevee_utility_texture
push_constant(Type::FLOAT, "world_opacity_fade") .push_constant(Type eevee_render_pass_out
SHADOW_TILEMAP_RES tiles_buf[] statistics_buf render_view_buf[SHADOW_VIEW_MAX] GPU_R32UI
#define GPU_SHADER_INTERFACE_INFO(_interface, _inst_name)
#define GPU_SHADER_CREATE_INFO(_info)