diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2022-01-26 14:46:37 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2022-01-26 14:46:37 +0300 |
commit | 5b299e5999e2b59e30edd4e770f64aa700e482d6 (patch) | |
tree | 17052358b339e20c44ca942e62b735ef63b23f88 /source/blender/draw/engines/workbench/shaders/infos | |
parent | 9bce134e56c28045aee37080f5c5b6622a07927b (diff) |
D13910: Workbench: Port shaders to use GPUShaderCreateInfo
Also adds a few things to GPUShader for easily create shaders.
Heavy usage of macros to compose the createInfo and avoid
duplications and copy paste bugs.
This makes the link between the shader request functions
(in workbench_shader.cc) and the actual createInfo a bit
obscure since the names are composed and not searchable.
Reviewed By: jbakker
Differential Revision: https://developer.blender.org/D13910
Diffstat (limited to 'source/blender/draw/engines/workbench/shaders/infos')
10 files changed, 582 insertions, 0 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh new file mode 100644 index 00000000000..030be382a14 --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh @@ -0,0 +1,41 @@ + +#include "gpu_shader_create_info.hh" + +/* -------------------------------------------------------------------- */ +/** \name Base Composite + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_composite) + .sampler(0, ImageType::FLOAT_2D, "normalBuffer", Frequency::PASS) + .sampler(1, ImageType::FLOAT_2D, "materialBuffer", Frequency::PASS) + .uniform_buf(4, "WorldData", "world_data", Frequency::PASS) + .push_constant(0, Type::BOOL, "forceShadowing") + .fragment_out(0, Type::VEC4, "fragColor") + .typedef_source("workbench_shader_shared.h") + .fragment_source("workbench_composite_frag.glsl") + .additional_info("draw_fullscreen"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Lighting Type + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_composite_studio) + .define("V3D_LIGHTING_STUDIO") + .additional_info("workbench_composite") + .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(workbench_composite_matcap) + .define("V3D_LIGHTING_MATCAP") + .sampler(2, ImageType::FLOAT_2D, "matcap_diffuse_tx", Frequency::PASS) + .sampler(3, ImageType::FLOAT_2D, "matcap_specular_tx", Frequency::PASS) + .additional_info("workbench_composite") + .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(workbench_composite_flat) + .define("V3D_LIGHTING_FLAT") + .additional_info("workbench_composite") + .do_static_compilation(true); + +/** \} */ diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_effect_antialiasing_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_effect_antialiasing_info.hh new file mode 100644 index 00000000000..00978b5c43b --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_effect_antialiasing_info.hh @@ -0,0 +1,64 @@ + +#include "gpu_shader_create_info.hh" + +/* -------------------------------------------------------------------- */ +/** \name TAA + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_taa) + .sampler(0, ImageType::FLOAT_2D, "colorBuffer") + .push_constant(0, Type::FLOAT, "samplesWeights", 9) + .fragment_out(0, Type::VEC4, "fragColor") + .fragment_source("workbench_effect_taa_frag.glsl") + .additional_info("draw_fullscreen") + .do_static_compilation(true); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name SMAA + * \{ */ + +GPU_SHADER_INTERFACE_INFO(workbench_smaa_iface, "") + .smooth(Type::VEC2, "uvs") + .smooth(Type::VEC2, "pixcoord") + .smooth(Type::VEC4, "offset[3]"); + +GPU_SHADER_CREATE_INFO(workbench_smaa) + .define("SMAA_GLSL_3") + .define("SMAA_RT_METRICS", "viewportMetrics") + .define("SMAA_PRESET_HIGH") + .define("SMAA_LUMA_WEIGHT", "float4(1.0, 1.0, 1.0, 1.0)") + .define("SMAA_NO_DISCARD") + .vertex_out(workbench_smaa_iface) + .push_constant(1, Type::VEC4, "viewportMetrics") + .vertex_source("workbench_effect_smaa_vert.glsl") + .fragment_source("workbench_effect_smaa_frag.glsl"); + +GPU_SHADER_CREATE_INFO(workbench_smaa_stage_0) + .define("SMAA_STAGE", "0") + .sampler(0, ImageType::FLOAT_2D, "colorTex") + .fragment_out(0, Type::VEC2, "out_edges") + .additional_info("workbench_smaa") + .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(workbench_smaa_stage_1) + .define("SMAA_STAGE", "1") + .sampler(0, ImageType::FLOAT_2D, "edgesTex") + .sampler(1, ImageType::FLOAT_2D, "areaTex") + .sampler(2, ImageType::FLOAT_2D, "searchTex") + .fragment_out(0, Type::VEC4, "out_weights") + .additional_info("workbench_smaa") + .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(workbench_smaa_stage_2) + .define("SMAA_STAGE", "2") + .sampler(0, ImageType::FLOAT_2D, "colorTex") + .sampler(1, ImageType::FLOAT_2D, "blendTex") + .push_constant(2, Type::FLOAT, "mixFactor") + .push_constant(3, Type::FLOAT, "taaAccumulatedWeight") + .fragment_out(0, Type::VEC4, "out_color") + .additional_info("workbench_smaa") + .do_static_compilation(true); + +/** \} */ diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_effect_cavity_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_effect_cavity_info.hh new file mode 100644 index 00000000000..60d79ed50d9 --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_effect_cavity_info.hh @@ -0,0 +1,31 @@ + +#include "gpu_shader_create_info.hh" + +GPU_SHADER_CREATE_INFO(workbench_effect_cavity_common) + .fragment_out(0, Type::VEC4, "fragColor") + .sampler(0, ImageType::DEPTH_2D, "depthBuffer") + .sampler(1, ImageType::FLOAT_2D, "normalBuffer") + .sampler(2, ImageType::UINT_2D, "objectIdBuffer") + .sampler(3, ImageType::FLOAT_2D, "cavityJitter") + .uniform_buf(3, "vec4", "samples_coords[512]") + .uniform_buf(4, "WorldData", "world_data", Frequency::PASS) + .typedef_source("workbench_shader_shared.h") + .fragment_source("workbench_effect_cavity_frag.glsl") + .additional_info("draw_fullscreen") + .additional_info("draw_view"); + +GPU_SHADER_CREATE_INFO(workbench_effect_cavity) + .do_static_compilation(true) + .define("USE_CAVITY") + .additional_info("workbench_effect_cavity_common"); + +GPU_SHADER_CREATE_INFO(workbench_effect_curvature) + .do_static_compilation(true) + .define("USE_CURVATURE") + .additional_info("workbench_effect_cavity_common"); + +GPU_SHADER_CREATE_INFO(workbench_effect_cavity_curvature) + .do_static_compilation(true) + .define("USE_CAVITY") + .define("USE_CURVATURE") + .additional_info("workbench_effect_cavity_common"); diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_effect_dof_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_effect_dof_info.hh new file mode 100644 index 00000000000..a885fca6f07 --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_effect_dof_info.hh @@ -0,0 +1,55 @@ + +#include "gpu_shader_create_info.hh" + +GPU_SHADER_CREATE_INFO(workbench_effect_dof) + /* TODO(fclem): Split resources per stage. */ + .sampler(0, ImageType::FLOAT_2D, "inputCocTex") + .sampler(1, ImageType::FLOAT_2D, "maxCocTilesTex") + .sampler(2, ImageType::FLOAT_2D, "sceneColorTex") + .sampler(3, ImageType::FLOAT_2D, "sceneDepthTex") + .sampler(4, ImageType::FLOAT_2D, "backgroundTex") + .sampler(5, ImageType::FLOAT_2D, "halfResColorTex") + .sampler(6, ImageType::FLOAT_2D, "blurTex") + .sampler(7, ImageType::FLOAT_2D, "noiseTex") + .push_constant(0, Type::VEC2, "invertedViewportSize") + .push_constant(1, Type::VEC2, "nearFar") + .push_constant(2, Type::VEC3, "dofParams") + .push_constant(3, Type::FLOAT, "noiseOffset") + .fragment_source("workbench_effect_dof_frag.glsl") + .additional_info("draw_fullscreen") + .additional_info("draw_view"); + +GPU_SHADER_CREATE_INFO(workbench_effect_dof_prepare) + .define("PREPARE") + .fragment_out(0, Type::VEC4, "halfResColor") + .fragment_out(1, Type::VEC2, "normalizedCoc") + .additional_info("workbench_effect_dof") + .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(workbench_effect_dof_downsample) + .define("DOWNSAMPLE") + .fragment_out(0, Type::VEC4, "outColor") + .fragment_out(1, Type::VEC2, "outCocs") + .additional_info("workbench_effect_dof") + .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(workbench_effect_dof_blur1) + .define("BLUR1") + .define("NUM_SAMPLES", "49") + .uniform_buf(1, "vec4", "samples[49]") + .fragment_out(0, Type::VEC4, "blurColor") + .additional_info("workbench_effect_dof") + .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(workbench_effect_dof_blur2) + .define("BLUR2") + .fragment_out(0, Type::VEC4, "finalColor") + .additional_info("workbench_effect_dof") + .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(workbench_effect_dof_resolve) + .define("RESOLVE") + .fragment_out(0, Type::VEC4, "finalColorAdd", DualBlend::SRC_0) + .fragment_out(0, Type::VEC4, "finalColorMul", DualBlend::SRC_1) + .additional_info("workbench_effect_dof") + .do_static_compilation(true);
\ No newline at end of file diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_effect_outline_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_effect_outline_info.hh new file mode 100644 index 00000000000..3849fe57a25 --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_effect_outline_info.hh @@ -0,0 +1,11 @@ + +#include "gpu_shader_create_info.hh" + +GPU_SHADER_CREATE_INFO(workbench_effect_outline) + .typedef_source("workbench_shader_shared.h") + .fragment_source("workbench_effect_outline_frag.glsl") + .sampler(0, ImageType::UINT_2D, "objectIdBuffer") + .uniform_buf(4, "WorldData", "world_data", Frequency::PASS) + .fragment_out(0, Type::VEC4, "fragColor") + .additional_info("draw_fullscreen") + .do_static_compilation(true); diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh new file mode 100644 index 00000000000..78403c292f0 --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh @@ -0,0 +1,9 @@ + +#include "gpu_shader_create_info.hh" + +GPU_SHADER_CREATE_INFO(workbench_merge_infront) + .fragment_out(0, Type::VEC4, "fragColor") + .sampler(0, ImageType::DEPTH_2D, "depthBuffer") + .fragment_source("workbench_merge_infront_frag.glsl") + .additional_info("draw_fullscreen") + .do_static_compilation(true); diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh new file mode 100644 index 00000000000..5e3b593ee6f --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh @@ -0,0 +1,149 @@ + +#include "gpu_shader_create_info.hh" + +/* -------------------------------------------------------------------- */ +/** \name Object Type + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_mesh) + .vertex_in(0, Type::VEC3, "pos") + .vertex_in(1, Type::VEC3, "nor") + .vertex_in(2, Type::VEC4, "ac") + .vertex_in(3, Type::VEC2, "au") + .vertex_source("workbench_prepass_vert.glsl") + .additional_info("draw_mesh") + .additional_info("draw_resource_handle"); + +GPU_SHADER_CREATE_INFO(workbench_hair) + .sampler(0, ImageType::FLOAT_BUFFER, "ac", Frequency::BATCH) + .sampler(1, ImageType::FLOAT_BUFFER, "au", Frequency::BATCH) + .vertex_source("workbench_prepass_hair_vert.glsl") + .additional_info("draw_hair") + .additional_info("draw_resource_handle"); + +GPU_SHADER_CREATE_INFO(workbench_pointcloud) + .vertex_source("workbench_prepass_pointcloud_vert.glsl") + .additional_info("draw_pointcloud") + .additional_info("draw_resource_handle"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Texture Type + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_texture_none).define("TEXTURE_NONE"); + +GPU_SHADER_CREATE_INFO(workbench_texture_single) + .sampler(2, ImageType::FLOAT_2D, "imageTexture", Frequency::BATCH) + .push_constant(1, Type::BOOL, "imagePremult") + .push_constant(2, Type::FLOAT, "imageTransparencyCutoff") + .define("V3D_SHADING_TEXTURE_COLOR"); + +GPU_SHADER_CREATE_INFO(workbench_texture_tile) + .sampler(2, ImageType::FLOAT_2D_ARRAY, "imageTileArray", Frequency::BATCH) + .sampler(3, ImageType::FLOAT_1D_ARRAY, "imageTileData", Frequency::BATCH) + .push_constant(1, Type::BOOL, "imagePremult") + .push_constant(2, Type::FLOAT, "imageTransparencyCutoff") + .define("V3D_SHADING_TEXTURE_COLOR") + .define("TEXTURE_IMAGE_ARRAY"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Lighting Type (only for transparent) + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_lighting_flat).define("V3D_LIGHTING_FLAT"); +GPU_SHADER_CREATE_INFO(workbench_lighting_studio).define("V3D_LIGHTING_STUDIO"); +GPU_SHADER_CREATE_INFO(workbench_lighting_matcap) + .define("V3D_LIGHTING_MATCAP") + .sampler(4, ImageType::FLOAT_2D, "matcap_diffuse_tx", Frequency::PASS) + .sampler(5, ImageType::FLOAT_2D, "matcap_specular_tx", Frequency::PASS); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Material Interface + * \{ */ + +GPU_SHADER_INTERFACE_INFO(workbench_material_iface, "") + .smooth(Type::VEC3, "normal_interp") + .smooth(Type::VEC3, "color_interp") + .smooth(Type::FLOAT, "alpha_interp") + .smooth(Type::VEC2, "uv_interp") + .flat(Type::INT, "object_id") + .flat(Type::FLOAT, "roughness") + .flat(Type::FLOAT, "metallic"); + +GPU_SHADER_CREATE_INFO(workbench_material) + .uniform_buf(4, "WorldData", "world_data", Frequency::PASS) + .uniform_buf(5, "vec4", "materials_data[4096]", Frequency::PASS) + .push_constant(4, Type::INT, "materialIndex") + .push_constant(5, Type::BOOL, "useMatcap") + .vertex_out(workbench_material_iface); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Pipeline Type + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_transparent_accum) + /* Note: Blending will be skipped on objectId because output is a + non-normalized integer buffer. */ + .fragment_out(0, Type::VEC4, "transparentAccum") + .fragment_out(1, Type::VEC4, "revealageAccum") + .fragment_out(2, Type::UINT, "objectId") + .push_constant(3, Type::BOOL, "forceShadowing") + .typedef_source("workbench_shader_shared.h") + .fragment_source("workbench_transparent_accum_frag.glsl"); + +GPU_SHADER_CREATE_INFO(workbench_opaque) + .fragment_out(0, Type::VEC4, "materialData") + .fragment_out(1, Type::VEC2, "normalData") + .fragment_out(2, Type::UINT, "objectId") + .typedef_source("workbench_shader_shared.h") + .fragment_source("workbench_prepass_frag.glsl"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Variations Declaration + * \{ */ + +#define WORKBENCH_FINAL_VARIATION(name, ...) \ + GPU_SHADER_CREATE_INFO(name).additional_info(__VA_ARGS__).do_static_compilation(true); + +#define WORKBENCH_CLIPPING_VARIATIONS(prefix, ...) \ + WORKBENCH_FINAL_VARIATION(prefix##_clip, "drw_clipped", __VA_ARGS__) \ + WORKBENCH_FINAL_VARIATION(prefix##_no_clip, __VA_ARGS__) + +#define WORKBENCH_TEXTURE_VARIATIONS(prefix, ...) \ + WORKBENCH_CLIPPING_VARIATIONS(prefix##_tex_none, "workbench_texture_none", __VA_ARGS__) \ + WORKBENCH_CLIPPING_VARIATIONS(prefix##_tex_single, "workbench_texture_single", __VA_ARGS__) \ + WORKBENCH_CLIPPING_VARIATIONS(prefix##_tex_tile, "workbench_texture_tile", __VA_ARGS__) + +#define WORKBENCH_DATATYPE_VARIATIONS(prefix, ...) \ + WORKBENCH_TEXTURE_VARIATIONS(prefix##_mesh, "workbench_mesh", __VA_ARGS__) \ + WORKBENCH_TEXTURE_VARIATIONS(prefix##_hair, "workbench_hair", __VA_ARGS__) \ + WORKBENCH_TEXTURE_VARIATIONS(prefix##_ptcloud, "workbench_pointcloud", __VA_ARGS__) + +#define WORKBENCH_PIPELINE_VARIATIONS(prefix, ...) \ + WORKBENCH_DATATYPE_VARIATIONS(prefix##_transp_studio, \ + "workbench_transparent_accum", \ + "workbench_lighting_studio", \ + __VA_ARGS__) \ + WORKBENCH_DATATYPE_VARIATIONS(prefix##_transp_matcap, \ + "workbench_transparent_accum", \ + "workbench_lighting_matcap", \ + __VA_ARGS__) \ + WORKBENCH_DATATYPE_VARIATIONS(prefix##_transp_flat, \ + "workbench_transparent_accum", \ + "workbench_lighting_flat", \ + __VA_ARGS__) \ + WORKBENCH_DATATYPE_VARIATIONS(prefix##_opaque, "workbench_opaque", __VA_ARGS__) + +WORKBENCH_PIPELINE_VARIATIONS(workbench, "workbench_material"); + +/** \} */ diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh new file mode 100644 index 00000000000..64f491aa201 --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh @@ -0,0 +1,98 @@ + +#include "gpu_shader_create_info.hh" + +/* -------------------------------------------------------------------- */ +/** \name Common + * \{ */ + +GPU_SHADER_INTERFACE_INFO(workbench_shadow_iface, "vData") + .smooth(Type::VEC3, "pos") + .smooth(Type::VEC4, "frontPosition") + .smooth(Type::VEC4, "backPosition"); + +GPU_SHADER_CREATE_INFO(workbench_shadow_common) + .vertex_in(0, Type::VEC3, "pos") + .vertex_out(workbench_shadow_iface) + .push_constant(0, Type::FLOAT, "lightDistance") + .push_constant(1, Type::VEC3, "lightDirection") + .vertex_source("workbench_shadow_vert.glsl") + .additional_info("draw_mesh"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Manifold Type + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_shadow_manifold) + .geometry_layout(PrimitiveIn::LINES_ADJACENCY, PrimitiveOut::TRIANGLE_STRIP, 4, 1) + .geometry_source("workbench_shadow_geom.glsl"); + +GPU_SHADER_CREATE_INFO(workbench_shadow_no_manifold) + .geometry_layout(PrimitiveIn::LINES_ADJACENCY, PrimitiveOut::TRIANGLE_STRIP, 4, 2) + .geometry_source("workbench_shadow_geom.glsl"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Caps Type + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_shadow_caps) + .geometry_layout(PrimitiveIn::TRIANGLES, PrimitiveOut::TRIANGLE_STRIP, 3, 2) + .geometry_source("workbench_shadow_caps_geom.glsl"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Debug Type + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_shadow_no_debug) + .fragment_source("gpu_shader_depth_only_frag.glsl"); + +GPU_SHADER_CREATE_INFO(workbench_shadow_debug) + .fragment_out(0, Type::VEC4, "materialData") + .fragment_out(1, Type::VEC4, "normalData") + .fragment_out(2, Type::UINT, "objectId") + .fragment_source("workbench_shadow_debug_frag.glsl"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Variations Declaration + * \{ */ + +#define WORKBENCH_SHADOW_VARIATIONS(suffix, ...) \ + GPU_SHADER_CREATE_INFO(workbench_shadow_pass_manifold_no_caps##suffix) \ + .define("SHADOW_PASS") \ + .additional_info("workbench_shadow_common", "workbench_shadow_manifold", __VA_ARGS__) \ + .do_static_compilation(true); \ + GPU_SHADER_CREATE_INFO(workbench_shadow_pass_no_manifold_no_caps##suffix) \ + .define("SHADOW_PASS") \ + .define("DOUBLE_MANIFOLD") \ + .additional_info("workbench_shadow_common", "workbench_shadow_no_manifold", __VA_ARGS__) \ + .do_static_compilation(true); \ + GPU_SHADER_CREATE_INFO(workbench_shadow_fail_manifold_caps##suffix) \ + .define("SHADOW_FAIL") \ + .additional_info("workbench_shadow_common", "workbench_shadow_caps", __VA_ARGS__) \ + .do_static_compilation(true); \ + GPU_SHADER_CREATE_INFO(workbench_shadow_fail_manifold_no_caps##suffix) \ + .define("SHADOW_FAIL") \ + .additional_info("workbench_shadow_common", "workbench_shadow_manifold", __VA_ARGS__) \ + .do_static_compilation(true); \ + GPU_SHADER_CREATE_INFO(workbench_shadow_fail_no_manifold_caps##suffix) \ + .define("SHADOW_FAIL") \ + .define("DOUBLE_MANIFOLD") \ + .additional_info("workbench_shadow_common", "workbench_shadow_caps", __VA_ARGS__) \ + .do_static_compilation(true); \ + GPU_SHADER_CREATE_INFO(workbench_shadow_fail_no_manifold_no_caps##suffix) \ + .define("SHADOW_FAIL") \ + .define("DOUBLE_MANIFOLD") \ + .additional_info("workbench_shadow_common", "workbench_shadow_no_manifold", __VA_ARGS__) \ + .do_static_compilation(true); + +WORKBENCH_SHADOW_VARIATIONS(, "workbench_shadow_no_debug") +WORKBENCH_SHADOW_VARIATIONS(_debug, "workbench_shadow_debug") + +/** \} */ diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_transparent_resolve_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_transparent_resolve_info.hh new file mode 100644 index 00000000000..e5b7bc8e2a7 --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_transparent_resolve_info.hh @@ -0,0 +1,10 @@ + +#include "gpu_shader_create_info.hh" + +GPU_SHADER_CREATE_INFO(workbench_transparent_resolve) + .fragment_out(0, Type::VEC4, "fragColor") + .sampler(0, ImageType::FLOAT_2D, "transparentAccum") + .sampler(1, ImageType::FLOAT_2D, "transparentRevealage") + .fragment_source("workbench_transparent_resolve_frag.glsl") + .additional_info("draw_fullscreen") + .do_static_compilation(true); diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_volume_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_volume_info.hh new file mode 100644 index 00000000000..f212ba9ec1d --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_volume_info.hh @@ -0,0 +1,114 @@ + +#include "gpu_shader_create_info.hh" + +/* -------------------------------------------------------------------- */ +/** \name Volume shader base + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_volume) + .vertex_in(0, Type::VEC3, "pos") + .fragment_out(0, Type::VEC4, "fragColor") + .sampler(0, ImageType::DEPTH_2D, "depthBuffer") + .sampler(1, ImageType::FLOAT_3D, "densityTexture") + .push_constant(28, Type::INT, "samplesLen") + .push_constant(29, Type::FLOAT, "noiseOfs") + .push_constant(30, Type::FLOAT, "stepLength") + .push_constant(31, Type::FLOAT, "densityScale") + .vertex_source("workbench_volume_vert.glsl") + .fragment_source("workbench_volume_frag.glsl") + .additional_info("draw_object_infos"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Smoke variation + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_volume_smoke) + .define("VOLUME_SMOKE") + .sampler(2, ImageType::FLOAT_3D, "flameTexture") + .sampler(3, ImageType::FLOAT_1D, "flameColorTexture") + .additional_info("draw_mesh", "draw_resource_id_varying"); + +GPU_SHADER_CREATE_INFO(workbench_volume_object) + .define("VOLUME_OBJECT") + .push_constant(0, Type::MAT4, "volumeTextureToObject") + /* FIXME(fclem): This overflow the push_constant limit. */ + .push_constant(16, Type::MAT4, "volumeObjectToTexture") + .additional_info("draw_volume", "draw_resource_id_varying"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Color Band variation + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_volume_coba) + .define("USE_COBA") + .sampler(4, ImageType::UINT_3D, "flagTexture") + .sampler(5, ImageType::FLOAT_1D, "transferTexture") + .push_constant(18, Type::BOOL, "showPhi") + .push_constant(19, Type::BOOL, "showFlags") + .push_constant(20, Type::BOOL, "showPressure") + .push_constant(21, Type::FLOAT, "gridScale"); + +GPU_SHADER_CREATE_INFO(workbench_volume_no_coba) + .sampler(4, ImageType::FLOAT_3D, "shadowTexture") + .sampler(5, ImageType::UINT_2D, "transferTexture") + .push_constant(18, Type::VEC3, "activeColor"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Sampling variation + * \{ */ + +GPU_SHADER_CREATE_INFO(workbench_volume_linear).define("USE_TRILINEAR"); +GPU_SHADER_CREATE_INFO(workbench_volume_cubic).define("USE_TRICUBIC"); +GPU_SHADER_CREATE_INFO(workbench_volume_closest).define("USE_CLOSEST"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Slice variation + * \{ */ + +GPU_SHADER_INTERFACE_INFO(workbench_volume_iface, "").smooth(Type::VEC3, "localPos"); + +GPU_SHADER_CREATE_INFO(workbench_volume_slice) + .define("VOLUME_SLICE") + .vertex_in(1, Type::VEC3, "uvs") + .vertex_out(workbench_volume_iface) + .push_constant(32, Type::INT, "sliceAxis") /* -1 is no slice. */ + .push_constant(33, Type::FLOAT, "slicePosition"); + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Variations Declaration + * \{ */ + +#define WORKBENCH_VOLUME_SLICE_VARIATIONS(prefix, ...) \ + GPU_SHADER_CREATE_INFO(prefix##_slice) \ + .additional_info("workbench_volume_slice", __VA_ARGS__) \ + .do_static_compilation(true); \ + GPU_SHADER_CREATE_INFO(prefix##_no_slice) \ + .additional_info(__VA_ARGS__) \ + .do_static_compilation(true); + +#define WORKBENCH_VOLUME_COBA_VARIATIONS(prefix, ...) \ + WORKBENCH_VOLUME_SLICE_VARIATIONS(prefix##_coba, "workbench_volume_coba", __VA_ARGS__) \ + WORKBENCH_VOLUME_SLICE_VARIATIONS(prefix##_no_coba, "workbench_volume_no_coba", __VA_ARGS__) + +#define WORKBENCH_VOLUME_INTERP_VARIATIONS(prefix, ...) \ + WORKBENCH_VOLUME_COBA_VARIATIONS(prefix##_linear, "workbench_volume_linear", __VA_ARGS__) \ + WORKBENCH_VOLUME_COBA_VARIATIONS(prefix##_cubic, "workbench_volume_cubic", __VA_ARGS__) \ + WORKBENCH_VOLUME_COBA_VARIATIONS(prefix##_closest, "workbench_volume_closest", __VA_ARGS__) + +#define WORKBENCH_VOLUME_SMOKE_VARIATIONS(prefix, ...) \ + WORKBENCH_VOLUME_INTERP_VARIATIONS(prefix##_smoke, "workbench_volume_smoke", __VA_ARGS__) \ + WORKBENCH_VOLUME_INTERP_VARIATIONS(prefix##_object, "workbench_volume_object", __VA_ARGS__) + +WORKBENCH_VOLUME_SMOKE_VARIATIONS(workbench_volume, "workbench_volume") + +/** \} */ |