Blender V5.0
eevee_material_infos.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#ifdef GPU_SHADER
6# pragma once
8
9# include "gpu_shader_compat.hh"
10
12# include "draw_view_infos.hh"
13
14# include "eevee_common_infos.hh"
15# include "eevee_shadow_shared.hh"
16# include "eevee_volume_infos.hh"
17
18# define CURVES_SHADER
19# define DRW_HAIR_INFO
20
21# define POINTCLOUD_SHADER
22# define DRW_POINTCLOUD_INFO
23
24# define SHADOW_UPDATE_ATOMIC_RASTER
25# define MAT_TRANSPARENT
26
27#endif
28
29#include "eevee_defines.hh"
31
32/* -------------------------------------------------------------------- */
35
36/* Common interface */
38/* World Position. */
40/* World Normal. */
43
44GPU_SHADER_CREATE_INFO(eevee_geom_mesh)
45TYPEDEF_SOURCE("eevee_defines.hh")
46DEFINE("MAT_GEOM_MESH")
49VERTEX_SOURCE("eevee_geom_mesh_vert.glsl")
50VERTEX_OUT(eevee_surf_iface)
51ADDITIONAL_INFO(draw_modelmat)
52ADDITIONAL_INFO(draw_object_infos)
53ADDITIONAL_INFO(draw_resource_id_varying)
54ADDITIONAL_INFO(draw_view)
56
57GPU_SHADER_NAMED_INTERFACE_INFO(eevee_surf_pointcloud_iface, pointcloud_interp)
58SMOOTH(float, radius)
59SMOOTH(float3, position)
60GPU_SHADER_NAMED_INTERFACE_END(pointcloud_interp)
61GPU_SHADER_NAMED_INTERFACE_INFO(eevee_surf_pointcloud_flat_iface, pointcloud_interp_flat)
62FLAT(int, id)
63GPU_SHADER_NAMED_INTERFACE_END(pointcloud_interp_flat)
64
65GPU_SHADER_CREATE_INFO(eevee_geom_pointcloud)
66TYPEDEF_SOURCE("eevee_defines.hh")
67PUSH_CONSTANT(bool, ptcloud_backface)
68DEFINE("MAT_GEOM_POINTCLOUD")
69VERTEX_SOURCE("eevee_geom_pointcloud_vert.glsl")
70VERTEX_OUT(eevee_surf_iface)
71VERTEX_OUT(eevee_surf_pointcloud_iface)
72VERTEX_OUT(eevee_surf_pointcloud_flat_iface)
73ADDITIONAL_INFO(draw_pointcloud)
74ADDITIONAL_INFO(draw_modelmat)
75ADDITIONAL_INFO(draw_object_infos)
76ADDITIONAL_INFO(draw_resource_id_varying)
77ADDITIONAL_INFO(draw_view)
79
80GPU_SHADER_CREATE_INFO(eevee_geom_volume)
81TYPEDEF_SOURCE("eevee_defines.hh")
82DEFINE("MAT_GEOM_VOLUME")
84VERTEX_OUT(eevee_surf_iface)
85VERTEX_SOURCE("eevee_geom_volume_vert.glsl")
86ADDITIONAL_INFO(draw_modelmat)
87ADDITIONAL_INFO(draw_object_infos)
88ADDITIONAL_INFO(draw_resource_id_varying)
89ADDITIONAL_INFO(draw_volume_infos)
90ADDITIONAL_INFO(draw_view)
92
93GPU_SHADER_NAMED_INTERFACE_INFO(eevee_surf_curve_iface, curve_interp)
94SMOOTH(float3, tangent)
95SMOOTH(float3, binormal)
96SMOOTH(float, time)
97SMOOTH(float, time_width)
98SMOOTH(float, radius)
99SMOOTH(float, point_id) /* Smooth to be used for barycentric. */
101GPU_SHADER_NAMED_INTERFACE_INFO(eevee_surf_curve_flat_iface, curve_interp_flat)
102FLAT(int, strand_id)
103GPU_SHADER_NAMED_INTERFACE_END(curve_interp_flat)
104
105GPU_SHADER_CREATE_INFO(eevee_geom_curves)
106TYPEDEF_SOURCE("eevee_defines.hh")
107DEFINE("MAT_GEOM_CURVES")
108VERTEX_SOURCE("eevee_geom_curves_vert.glsl")
109VERTEX_OUT(eevee_surf_iface)
110VERTEX_OUT(eevee_surf_curve_iface)
111VERTEX_OUT(eevee_surf_curve_flat_iface)
112ADDITIONAL_INFO(draw_modelmat)
113ADDITIONAL_INFO(draw_object_infos)
114ADDITIONAL_INFO(draw_resource_id_varying)
115ADDITIONAL_INFO(draw_view)
116ADDITIONAL_INFO(draw_curves)
117ADDITIONAL_INFO(draw_curves_infos)
119
120GPU_SHADER_CREATE_INFO(eevee_geom_world)
121TYPEDEF_SOURCE("eevee_defines.hh")
122DEFINE("MAT_GEOM_WORLD")
123BUILTINS(BuiltinBits::VERTEX_ID)
124VERTEX_SOURCE("eevee_geom_world_vert.glsl")
125VERTEX_OUT(eevee_surf_iface)
126ADDITIONAL_INFO(draw_modelmat)
127ADDITIONAL_INFO(draw_object_infos) /* Unused, but allow debug compilation. */
128ADDITIONAL_INFO(draw_resource_id_varying)
129ADDITIONAL_INFO(draw_view)
131
133
134/* -------------------------------------------------------------------- */
137
138#define image_out(slot, qualifier, format, name) \
139 image(slot, format, qualifier, ImageType::Float2D, name, Frequency::PASS)
140#define image_array_out(slot, qualifier, format, name) \
141 image(slot, format, qualifier, ImageType::Float2DArray, name, Frequency::PASS)
142
143GPU_SHADER_CREATE_INFO(eevee_surf_deferred_base)
144DEFINE("MAT_DEFERRED")
145DEFINE("GBUFFER_WRITE")
146/* NOTE: This removes the possibility of using gl_FragDepth. */
148/* Direct output. (Emissive, Holdout) */
149FRAGMENT_OUT(0, float4, out_radiance)
151FRAGMENT_OUT(2, float2, out_gbuf_normal)
152FRAGMENT_OUT(3, float4, out_gbuf_closure1)
153FRAGMENT_OUT(4, float4, out_gbuf_closure2)
154/* Everything is stored inside a two layered target, one for each format. This is to fit the
155 * limitation of the number of images we can bind on a single shader. */
156IMAGE_FREQ(GBUF_CLOSURE_SLOT, UNORM_10_10_10_2, write, image2DArray, out_gbuf_closure_img, PASS)
157IMAGE_FREQ(GBUF_NORMAL_SLOT, UNORM_16_16, write, image2DArray, out_gbuf_normal_img, PASS)
158/* Storage for additional infos that are shared across closures. */
159IMAGE_FREQ(GBUF_HEADER_SLOT, UINT_32, write, uimage2DArray, out_gbuf_header_img, PASS)
160/* Added at runtime because of test shaders not having `node_tree`. */
161// ADDITIONAL_INFO(eevee_render_pass_out)
162// ADDITIONAL_INFO(eevee_cryptomatte_out)
163ADDITIONAL_INFO(eevee_global_ubo)
164ADDITIONAL_INFO(eevee_utility_texture)
165ADDITIONAL_INFO(eevee_sampling_data)
166ADDITIONAL_INFO(eevee_hiz_data)
168
169GPU_SHADER_CREATE_INFO(eevee_surf_deferred)
170FRAGMENT_SOURCE("eevee_surf_deferred_frag.glsl")
171ADDITIONAL_INFO(eevee_surf_deferred_base)
173
174GPU_SHADER_CREATE_INFO(eevee_surf_deferred_hybrid)
175FRAGMENT_SOURCE("eevee_surf_hybrid_frag.glsl")
176ADDITIONAL_INFO(eevee_surf_deferred_base)
177ADDITIONAL_INFO(eevee_light_data)
178ADDITIONAL_INFO(eevee_lightprobe_data)
179ADDITIONAL_INFO(eevee_shadow_data)
181
182GPU_SHADER_CREATE_INFO(eevee_surf_forward)
183DEFINE("MAT_FORWARD")
184/* Early fragment test is needed for render passes support for forward surfaces. */
185/* NOTE: This removes the possibility of using gl_FragDepth. */
187FRAGMENT_OUT_DUAL(0, float4, out_radiance, SRC_0)
188FRAGMENT_OUT_DUAL(0, float4, out_transmittance, SRC_1)
189FRAGMENT_SOURCE("eevee_surf_forward_frag.glsl")
190/* Optionally added depending on the material. */
191// ADDITIONAL_INFO(eevee_render_pass_out)
192// ADDITIONAL_INFO(eevee_cryptomatte_out)
193ADDITIONAL_INFO(eevee_global_ubo)
194ADDITIONAL_INFO(eevee_light_data)
195ADDITIONAL_INFO(eevee_lightprobe_data)
196ADDITIONAL_INFO(eevee_utility_texture)
197ADDITIONAL_INFO(eevee_sampling_data)
198ADDITIONAL_INFO(eevee_shadow_data)
199ADDITIONAL_INFO(eevee_hiz_data)
200ADDITIONAL_INFO(eevee_volume_lib)
202
203GPU_SHADER_CREATE_INFO(eevee_surf_capture)
204DEFINE("MAT_CAPTURE")
205TYPEDEF_SOURCE("eevee_lightprobe_shared.hh")
206STORAGE_BUF(SURFEL_BUF_SLOT, write, Surfel, surfel_buf[])
207STORAGE_BUF(CAPTURE_BUF_SLOT, read_write, CaptureInfoData, capture_info_buf)
208PUSH_CONSTANT(bool, is_double_sided)
209FRAGMENT_SOURCE("eevee_surf_capture_frag.glsl")
210ADDITIONAL_INFO(eevee_global_ubo)
211ADDITIONAL_INFO(eevee_utility_texture)
213
214GPU_SHADER_CREATE_INFO(eevee_surf_depth)
215DEFINE("MAT_DEPTH")
216FRAGMENT_SOURCE("eevee_surf_depth_frag.glsl")
217ADDITIONAL_INFO(eevee_global_ubo)
218ADDITIONAL_INFO(eevee_sampling_data)
219ADDITIONAL_INFO(eevee_utility_texture)
221
222GPU_SHADER_CREATE_INFO(eevee_surf_world)
223PUSH_CONSTANT(float, world_opacity_fade)
224PUSH_CONSTANT(float, world_background_blur)
225PUSH_CONSTANT(int4, world_coord_packed)
227FRAGMENT_OUT(0, float4, out_background)
228FRAGMENT_SOURCE("eevee_surf_world_frag.glsl")
229ADDITIONAL_INFO(eevee_global_ubo)
230ADDITIONAL_INFO(eevee_lightprobe_sphere_data)
231ADDITIONAL_INFO(eevee_volume_probe_data)
232ADDITIONAL_INFO(eevee_sampling_data)
233/* Optionally added depending on the material. */
234// ADDITIONAL_INFO(eevee_render_pass_out)
235// ADDITIONAL_INFO(eevee_cryptomatte_out)
236ADDITIONAL_INFO(eevee_utility_texture)
238
239GPU_SHADER_CREATE_INFO(eevee_renderpass_clear)
240FRAGMENT_OUT(0, float4, out_background)
241FRAGMENT_SOURCE("eevee_renderpass_clear_frag.glsl")
242ADDITIONAL_INFO(gpu_fullscreen)
243ADDITIONAL_INFO(eevee_global_ubo)
244ADDITIONAL_INFO(eevee_render_pass_out)
245ADDITIONAL_INFO(eevee_cryptomatte_out)
246TYPEDEF_SOURCE("eevee_defines.hh")
249
250GPU_SHADER_NAMED_INTERFACE_INFO(eevee_surf_shadow_atomic_iface, shadow_iface)
251FLAT(int, shadow_view_id)
253
254GPU_SHADER_NAMED_INTERFACE_INFO(eevee_surf_shadow_clipping_iface, shadow_clip)
255SMOOTH(float3, position)
258
259GPU_SHADER_CREATE_INFO(eevee_surf_shadow)
260DEFINE_VALUE("DRW_VIEW_LEN", STRINGIFY(SHADOW_VIEW_MAX))
261DEFINE("MAT_SHADOW")
262TYPEDEF_SOURCE("eevee_shadow_shared.hh")
263BUILTINS(BuiltinBits::VIEWPORT_INDEX)
264VERTEX_OUT(eevee_surf_shadow_clipping_iface)
265STORAGE_BUF(SHADOW_RENDER_VIEW_BUF_SLOT, read, ShadowRenderView, render_view_buf[SHADOW_VIEW_MAX])
266FRAGMENT_SOURCE("eevee_surf_shadow_frag.glsl")
267ADDITIONAL_INFO(eevee_global_ubo)
268ADDITIONAL_INFO(eevee_utility_texture)
269ADDITIONAL_INFO(eevee_sampling_data)
271
272GPU_SHADER_CREATE_INFO(eevee_surf_shadow_atomic)
273ADDITIONAL_INFO(eevee_surf_shadow)
274DEFINE("SHADOW_UPDATE_ATOMIC_RASTER")
275BUILTINS(BuiltinBits::TEXTURE_ATOMIC)
276VERTEX_OUT(eevee_surf_shadow_atomic_iface)
278IMAGE(SHADOW_ATLAS_IMG_SLOT, UINT_32, read_write, uimage2DArrayAtomic, shadow_atlas_img)
280
281GPU_SHADER_CREATE_INFO(eevee_surf_shadow_tbdr)
282ADDITIONAL_INFO(eevee_surf_shadow)
283DEFINE("SHADOW_UPDATE_TBDR")
284BUILTINS(BuiltinBits::LAYER)
285/* Use greater depth write to avoid loosing the early Z depth test but ensure correct fragment
286 * ordering after slope bias. */
287DEPTH_WRITE(DepthWrite::GREATER)
288/* F32 color attachment for on-tile depth accumulation without atomics. */
289FRAGMENT_OUT_ROG(0, float, out_depth, SHADOW_ROG_ID)
291
292#undef image_out
293#undef image_array_out
294
296
297/* -------------------------------------------------------------------- */
300
301GPU_SHADER_CREATE_INFO(eevee_surf_volume)
302DEFINE("MAT_VOLUME")
303/* Only the front fragments have to be invoked. */
305IMAGE(VOLUME_PROP_SCATTERING_IMG_SLOT, UFLOAT_11_11_10, read_write, image3D, out_scattering_img)
306IMAGE(VOLUME_PROP_EXTINCTION_IMG_SLOT, UFLOAT_11_11_10, read_write, image3D, out_extinction_img)
307IMAGE(VOLUME_PROP_EMISSION_IMG_SLOT, UFLOAT_11_11_10, read_write, image3D, out_emissive_img)
308IMAGE(VOLUME_PROP_PHASE_IMG_SLOT, SFLOAT_16, read_write, image3D, out_phase_img)
309IMAGE(VOLUME_PROP_PHASE_WEIGHT_IMG_SLOT, SFLOAT_16, read_write, image3D, out_phase_weight_img)
310IMAGE(VOLUME_OCCUPANCY_SLOT, UINT_32, read, uimage3DAtomic, occupancy_img)
311FRAGMENT_SOURCE("eevee_surf_volume_frag.glsl")
312ADDITIONAL_INFO(draw_modelmat_common)
313ADDITIONAL_INFO(draw_view)
314TYPEDEF_SOURCE("eevee_defines.hh")
315ADDITIONAL_INFO(eevee_global_ubo)
316ADDITIONAL_INFO(eevee_sampling_data)
317ADDITIONAL_INFO(eevee_utility_texture)
319
320GPU_SHADER_CREATE_INFO(eevee_surf_occupancy)
321DEFINE("MAT_OCCUPANCY")
322/* All fragments need to be invoked even if we write to the depth buffer. */
324BUILTINS(BuiltinBits::TEXTURE_ATOMIC)
325PUSH_CONSTANT(bool, use_fast_method)
326IMAGE(VOLUME_HIT_DEPTH_SLOT, SFLOAT_32, write, image3D, hit_depth_img)
327IMAGE(VOLUME_HIT_COUNT_SLOT, UINT_32, read_write, uimage2DAtomic, hit_count_img)
328IMAGE(VOLUME_OCCUPANCY_SLOT, UINT_32, read_write, uimage3DAtomic, occupancy_img)
329FRAGMENT_SOURCE("eevee_surf_occupancy_frag.glsl")
330ADDITIONAL_INFO(eevee_global_ubo)
331ADDITIONAL_INFO(eevee_sampling_data)
333
335
336/* -------------------------------------------------------------------- */
341
342#ifndef NDEBUG
343
344GPU_SHADER_CREATE_INFO(eevee_material_stub)
345/* Dummy uniform buffer to detect overlap with material node-tree. */
346UNIFORM_BUF(0, int, node_tree)
348
349# define EEVEE_MAT_GEOM_VARIATIONS(prefix, ...) \
350 CREATE_INFO_VARIANT(prefix##_world, eevee_geom_world, __VA_ARGS__) \
351 CREATE_INFO_VARIANT(prefix##_curves, eevee_geom_curves, __VA_ARGS__) \
352 CREATE_INFO_VARIANT(prefix##_mesh, eevee_geom_mesh, __VA_ARGS__) \
353 CREATE_INFO_VARIANT(prefix##_pointcloud, eevee_geom_pointcloud, __VA_ARGS__) \
354 CREATE_INFO_VARIANT(prefix##_volume, eevee_geom_volume, __VA_ARGS__)
355
356# define EEVEE_MAT_PIPE_VARIATIONS(name, ...) \
357 EEVEE_MAT_GEOM_VARIATIONS(name##_world, eevee_surf_world, __VA_ARGS__) \
358 EEVEE_MAT_GEOM_VARIATIONS(name##_depth, eevee_surf_depth, __VA_ARGS__) \
359 EEVEE_MAT_GEOM_VARIATIONS(name##_deferred, eevee_surf_deferred, __VA_ARGS__) \
360 EEVEE_MAT_GEOM_VARIATIONS(name##_forward, eevee_surf_forward, __VA_ARGS__) \
361 EEVEE_MAT_GEOM_VARIATIONS(name##_capture, eevee_surf_capture, __VA_ARGS__) \
362 EEVEE_MAT_GEOM_VARIATIONS(name##_volume, eevee_surf_volume, __VA_ARGS__) \
363 EEVEE_MAT_GEOM_VARIATIONS(name##_occupancy, eevee_surf_occupancy, __VA_ARGS__) \
364 EEVEE_MAT_GEOM_VARIATIONS(name##_shadow_atomic, eevee_surf_shadow_atomic, __VA_ARGS__) \
365 EEVEE_MAT_GEOM_VARIATIONS(name##_shadow_tbdr, eevee_surf_shadow_tbdr, __VA_ARGS__)
366
367EEVEE_MAT_PIPE_VARIATIONS(eevee_surface, eevee_material_stub)
368
369#endif
370
unsigned int uint
#define STRINGIFY(x)
return true
#define VOLUME_PROP_SCATTERING_IMG_SLOT
#define DEFERRED_GBUFFER_ROG_ID
#define SHADOW_VIEW_MAX
#define VOLUME_HIT_DEPTH_SLOT
#define CAPTURE_BUF_SLOT
#define VOLUME_PROP_PHASE_WEIGHT_IMG_SLOT
#define VOLUME_HIT_COUNT_SLOT
#define VOLUME_OCCUPANCY_SLOT
#define GBUF_CLOSURE_SLOT
#define SHADOW_ATLAS_IMG_SLOT
#define SHADOW_RENDER_MAP_BUF_SLOT
#define GBUF_HEADER_SLOT
#define VOLUME_PROP_EXTINCTION_IMG_SLOT
#define SHADOW_RENDER_VIEW_BUF_SLOT
#define VOLUME_PROP_PHASE_IMG_SLOT
#define GBUF_NORMAL_SLOT
#define VOLUME_PROP_EMISSION_IMG_SLOT
#define SHADOW_RENDER_MAP_SIZE
#define SHADOW_ROG_ID
#define SURFEL_BUF_SLOT
#define EEVEE_MAT_PIPE_VARIATIONS(name,...)
uint pos
uint nor
#define GPU_SHADER_NAMED_INTERFACE_INFO(_interface, _inst_name)
#define GPU_SHADER_NAMED_INTERFACE_END(_inst_name)
#define GPU_SHADER_CREATE_INFO(_info)
#define GPU_SHADER_CREATE_END()
#define TYPEDEF_SOURCE(filename)
#define VERTEX_OUT(stage_interface)
#define FRAGMENT_OUT_DUAL(slot, type, name, blend)
#define SMOOTH(type, name)
#define UNIFORM_BUF(slot, type_name, name)
#define FRAGMENT_SOURCE(filename)
#define IMAGE_FREQ(slot, format, qualifiers, type, name, freq)
#define ADDITIONAL_INFO(info_name)
#define PUSH_CONSTANT(type, name)
#define DEFINE(name)
#define FLAT(type, name)
#define FRAGMENT_OUT(slot, type, name)
#define BUILTINS(builtin)
#define STORAGE_BUF(slot, qualifiers, type_name, name)
#define VERTEX_SOURCE(filename)
#define VERTEX_IN(slot, type, name)
#define IMAGE(slot, format, qualifiers, type, name)
#define DO_STATIC_COMPILATION()
#define DEPTH_WRITE(value)
#define EARLY_FRAGMENT_TEST(enable)
#define DEFINE_VALUE(name, value)
#define FRAGMENT_OUT_ROG(slot, type, name, rog)
ImageBase< uint, 2, true, true > uimage2DArrayAtomic
ImageBase< uint, 2, false, true > uimage2DAtomic
ImageBase< uint, 3, false, true > uimage3DAtomic
ImageBase< uint, 2, true > uimage2DArray
ImageBase< float, 2, true > image2DArray
ImageBase< float, 3 > image3D
ccl_device_inline float interp(const float a, const float b, const float t)
Definition math_base.h:502
#define N