From dcfddce13779682627e7f3ecaa99e7dc22238d4d Mon Sep 17 00:00:00 2001 From: Patrick Morgenstern Date: Mon, 23 Mar 2026 17:28:04 +0100 Subject: [PATCH] Added depthpeeling example --- CMakeLists.txt | 1 + data/shaders/dp_combine.frag | 25 + data/shaders/dp_fullscreen.vert | 33 ++ data/shaders/dp_pass_flat.frag | 106 +++++ data/shaders/dp_pass_phong.frag | 373 +++++++++++++++ data/textures/wood.png | Bin 0 -> 178934 bytes examples/oit/CMakeLists.txt | 3 + examples/oit/vsgdepthpeeling/CMakeLists.txt | 26 + .../vsgdepthpeeling/depthpeeling/Bindings.cpp | 127 +++++ .../vsgdepthpeeling/depthpeeling/Bindings.h | 140 ++++++ .../vsgdepthpeeling/depthpeeling/Builder.cpp | 225 +++++++++ .../vsgdepthpeeling/depthpeeling/Builder.h | 84 ++++ .../depthpeeling/PipelineConfigurator.cpp | 175 +++++++ .../depthpeeling/PipelineConfigurator.h | 45 ++ .../depthpeeling/RenderGraph.cpp | 97 ++++ .../depthpeeling/RenderGraph.h | 38 ++ .../depthpeeling/Resources.cpp | 389 +++++++++++++++ .../vsgdepthpeeling/depthpeeling/Resources.h | 111 +++++ .../depthpeeling/ShaderSet.cpp | 252 ++++++++++ .../vsgdepthpeeling/depthpeeling/ShaderSet.h | 23 + .../oit/vsgdepthpeeling/vsgdepthpeeling.cpp | 446 ++++++++++++++++++ 21 files changed, 2719 insertions(+) create mode 100644 data/shaders/dp_combine.frag create mode 100644 data/shaders/dp_fullscreen.vert create mode 100644 data/shaders/dp_pass_flat.frag create mode 100644 data/shaders/dp_pass_phong.frag create mode 100644 data/textures/wood.png create mode 100644 examples/oit/CMakeLists.txt create mode 100644 examples/oit/vsgdepthpeeling/CMakeLists.txt create mode 100644 examples/oit/vsgdepthpeeling/depthpeeling/Bindings.cpp create mode 100644 examples/oit/vsgdepthpeeling/depthpeeling/Bindings.h create mode 100644 examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp create mode 100644 examples/oit/vsgdepthpeeling/depthpeeling/Builder.h create mode 100644 examples/oit/vsgdepthpeeling/depthpeeling/PipelineConfigurator.cpp create mode 100644 examples/oit/vsgdepthpeeling/depthpeeling/PipelineConfigurator.h create mode 100644 examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.cpp create mode 100644 examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.h create mode 100644 examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp create mode 100644 examples/oit/vsgdepthpeeling/depthpeeling/Resources.h create mode 100644 examples/oit/vsgdepthpeeling/depthpeeling/ShaderSet.cpp create mode 100644 examples/oit/vsgdepthpeeling/depthpeeling/ShaderSet.h create mode 100644 examples/oit/vsgdepthpeeling/vsgdepthpeeling.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ea413441..4ddaf357 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,6 +89,7 @@ add_subdirectory(examples/ui) add_subdirectory(examples/utils) add_subdirectory(examples/vk) add_subdirectory(examples/volume) +add_subdirectory(examples/oit) # VSG tests add_subdirectory(tests) diff --git a/data/shaders/dp_combine.frag b/data/shaders/dp_combine.frag new file mode 100644 index 00000000..6ce66cd7 --- /dev/null +++ b/data/shaders/dp_combine.frag @@ -0,0 +1,25 @@ +#version 450 + +#extension GL_ARB_separate_shader_objects : enable +#extension GL_KHR_vulkan_glsl : enable + +#pragma import_defines (DEPTHPEELING_PASS) + +#define PEEL_DESCRIPTOR_SET 2 + +layout(input_attachment_index = 0, set = PEEL_DESCRIPTOR_SET, binding = 2) uniform subpassInput peelOutput; + +layout(location = 0) out vec4 outColor; + +void main() +{ + // (!) in case of final compose pass input is already premultiplied + // in this case over-blending is done in fixed function pipeline by using blending operation + outColor = subpassLoad(peelOutput); + +#ifdef DEPTHPEELING_PASS + // (!) premultiplied alpha because of under-blending-usage + // under-blending is done in fixed function pipeline by using blending operation + outColor.rgb *= outColor.a; +#endif +} diff --git a/data/shaders/dp_fullscreen.vert b/data/shaders/dp_fullscreen.vert new file mode 100644 index 00000000..c06fbc83 --- /dev/null +++ b/data/shaders/dp_fullscreen.vert @@ -0,0 +1,33 @@ +#version 450 + +#extension GL_ARB_separate_shader_objects : enable +#extension GL_KHR_vulkan_glsl : enable + +layout(push_constant) uniform PushConstants { + mat4 projection; + mat4 modelView; +} pc; + +void main() +{ + // 0---^-----------2 + // | S | S | / + // <---.---|---/---> x+ + // | S | S | / + // |-------/ + // | | / + // | / + // | / | + // 1 V + // y+ + + // gl_VertexIndex: + // 0 = 0.0, 0.0, 0.0, 1.0 + // 1 = 0.0, 4.0, 0.0, 1.0 + // 2 = 4.0, 0.0, 0.0, 1.0 + vec4 pos = vec4((float((gl_VertexIndex >> 1U) & 1U)) * 4.0, (float(gl_VertexIndex & 1U)) * 4.0, 0, 1.0); + // screen space for x/y from -1 to 1 -> so offset coordinates by -1 + pos.xy -= vec2(1.0, 1.0); + + gl_Position = pos; +} diff --git a/data/shaders/dp_pass_flat.frag b/data/shaders/dp_pass_flat.frag new file mode 100644 index 00000000..fe685cf4 --- /dev/null +++ b/data/shaders/dp_pass_flat.frag @@ -0,0 +1,106 @@ +#version 450 + +#extension GL_ARB_separate_shader_objects : enable +#extension GL_KHR_vulkan_glsl : enable + +#pragma import_defines (VSG_TEXTURECOORD_0, VSG_TEXTURECOORD_1, VSG_TEXTURECOORD_2, VSG_TEXTURECOORD_3, VSG_POINT_SPRITE, VSG_DIFFUSE_MAP, VSG_GREYSCALE_DIFFUSE_MAP, VSG_DETAIL_MAP, DEPTHPEELING_PASS, DEPTHPEELING_FIRSTPASS) + +#define VIEW_DESCRIPTOR_SET 0 +#define MATERIAL_DESCRIPTOR_SET 1 +#define PEEL_DESCRIPTOR_SET 2 + +#if defined(VSG_TEXTURECOORD_3) + #define VSG_TEXCOORD_COUNT 4 +#elif defined(VSG_TEXTURECOORD_2) + #define VSG_TEXCOORD_COUNT 3 +#elif defined(VSG_TEXTURECOORD_1) + #define VSG_TEXCOORD_COUNT 2 +#else + #define VSG_TEXCOORD_COUNT 1 +#endif + +#ifdef VSG_DIFFUSE_MAP +layout(set = MATERIAL_DESCRIPTOR_SET, binding = 0) uniform sampler2D diffuseMap; +#endif + +#ifdef VSG_DETAIL_MAP +layout(set = MATERIAL_DESCRIPTOR_SET, binding = 1) uniform sampler2D detailMap; +#endif + +layout(set = MATERIAL_DESCRIPTOR_SET, binding = 10) uniform MaterialData +{ + vec4 ambientColor; + vec4 diffuseColor; + vec4 specularColor; + vec4 emissiveColor; + float shininess; + float alphaMask; + float alphaMaskCutoff; +} material; + +layout(set = MATERIAL_DESCRIPTOR_SET, binding = 11) uniform TexCoordIndices +{ + // indices into texCoord[] array for each texture type + int diffuseMap; + int detailMap; + int normalMap; + int aoMap; + int emissiveMap; + int specularMap; + int mrMap; +} texCoordIndices; + +layout(location = 2) in vec4 vertexColor; +layout(location = 4) in vec2 texCoord[VSG_TEXCOORD_COUNT]; + +#ifdef DEPTHPEELING_PASS +layout(input_attachment_index = 0, set = PEEL_DESCRIPTOR_SET, binding = 0) uniform subpassInput opaqueDepth; +layout(input_attachment_index = 1, set = PEEL_DESCRIPTOR_SET, binding = 1) uniform subpassInput prevPassDepth; +#endif + +layout(location = 0) out vec4 outColor; + +void main() +{ +#ifdef DEPTHPEELING_PASS + if (gl_FragCoord.z <= subpassLoad(opaqueDepth).r) + discard; + +#ifndef DEPTHPEELING_FIRSTPASS + if (gl_FragCoord.z >= subpassLoad(prevPassDepth).r) + discard; +#endif +#endif + +#ifdef VSG_POINT_SPRITE + const vec2 texCoordDiffuse = gl_PointCoord.xy; +#else + const vec2 texCoordDiffuse = texCoord[texCoordIndices.diffuseMap].st; +#endif + + vec4 diffuseColor = vertexColor * material.diffuseColor; + +#ifdef VSG_DIFFUSE_MAP + #ifdef VSG_GREYSCALE_DIFFUSE_MAP + float v = texture(diffuseMap, texCoordDiffuse); + diffuseColor *= vec4(v, v, v, 1); + #else + diffuseColor *= texture(diffuseMap, texCoordDiffuse); + #endif +#endif + +#ifdef VSG_DETAIL_MAP + vec4 detailColor = texture(detailMap, texCoord[texCoordIndices.detailMap].st); + diffuseColor.rgb = mix(diffuseColor.rgb, detailColor.rgb, detailColor.a); +#endif + + +#ifdef DEPTHPEELING_PASS + if (diffuseColor.a < (1.0 - material.alphaMaskCutoff) || diffuseColor.a >= material.alphaMaskCutoff) discard; +#else + if (diffuseColor.a < material.alphaMaskCutoff) discard; + diffuseColor.a = 1.0; +#endif + + outColor = vec4(diffuseColor.rgb, diffuseColor.a); +} diff --git a/data/shaders/dp_pass_phong.frag b/data/shaders/dp_pass_phong.frag new file mode 100644 index 00000000..2bd96857 --- /dev/null +++ b/data/shaders/dp_pass_phong.frag @@ -0,0 +1,373 @@ +#version 450 + +#extension GL_ARB_separate_shader_objects : enable +#extension GL_KHR_vulkan_glsl : enable + +#pragma import_defines (VSG_TEXTURECOORD_0, VSG_TEXTURECOORD_1, VSG_TEXTURECOORD_2, VSG_TEXTURECOORD_3, VSG_POINT_SPRITE, VSG_DIFFUSE_MAP, VSG_GREYSCALE_DIFFUSE_MAP, VSG_DETAIL_MAP, VSG_EMISSIVE_MAP, VSG_LIGHTMAP_MAP, VSG_NORMAL_MAP, VSG_SPECULAR_MAP, VSG_TWO_SIDED_LIGHTING, VSG_SHADOWS_PCSS, VSG_SHADOWS_SOFT, VSG_SHADOWS_HARD, SHADOWMAP_DEBUG, DEPTHPEELING_PASS, DEPTHPEELING_FIRSTPASS) + +// define by default for backwards compatibility +#define VSG_SHADOWS_HARD + +#if defined(VSG_TEXTURECOORD_3) + #define VSG_TEXCOORD_COUNT 4 +#elif defined(VSG_TEXTURECOORD_2) + #define VSG_TEXCOORD_COUNT 3 +#elif defined(VSG_TEXTURECOORD_1) + #define VSG_TEXCOORD_COUNT 2 +#else + #define VSG_TEXCOORD_COUNT 1 +#endif + +#define VIEW_DESCRIPTOR_SET 0 +#define MATERIAL_DESCRIPTOR_SET 1 +#define PEEL_DESCRIPTOR_SET 2 + +const float PI = radians(180); + +#ifdef VSG_DIFFUSE_MAP +layout(set = MATERIAL_DESCRIPTOR_SET, binding = 0) uniform sampler2D diffuseMap; +#endif + +#ifdef VSG_DETAIL_MAP +layout(set = MATERIAL_DESCRIPTOR_SET, binding = 1) uniform sampler2D detailMap; +#endif + +#ifdef VSG_NORMAL_MAP +layout(set = MATERIAL_DESCRIPTOR_SET, binding = 2) uniform sampler2D normalMap; +#endif + +#ifdef VSG_LIGHTMAP_MAP +layout(set = MATERIAL_DESCRIPTOR_SET, binding = 3) uniform sampler2D aoMap; +#endif + +#ifdef VSG_EMISSIVE_MAP +layout(set = MATERIAL_DESCRIPTOR_SET, binding = 4) uniform sampler2D emissiveMap; +#endif + +#ifdef VSG_SPECULAR_MAP +layout(set = MATERIAL_DESCRIPTOR_SET, binding = 5) uniform sampler2D specularMap; +#endif + +layout(set = MATERIAL_DESCRIPTOR_SET, binding = 10) uniform MaterialData +{ + vec4 ambientColor; + vec4 diffuseColor; + vec4 specularColor; + vec4 emissiveColor; + float shininess; + float alphaMask; + float alphaMaskCutoff; +} material; + +layout(set = MATERIAL_DESCRIPTOR_SET, binding = 11) uniform TexCoordIndices +{ + // indices into texCoord[] array for each texture type + int diffuseMap; + int detailMap; + int normalMap; + int aoMap; + int emissiveMap; + int specularMap; + int mrMap; +} texCoordIndices; + +layout(constant_id = 3) const int lightDataSize = 256; +layout(set = VIEW_DESCRIPTOR_SET, binding = 0) uniform LightData +{ + vec4 values[lightDataSize]; +} lightData; + +layout(location = 0) in vec3 eyePos; +layout(location = 1) in vec3 normalDir; +layout(location = 2) in vec4 vertexColor; +layout(location = 3) in vec3 viewDir; +layout(location = 4) in vec2 texCoord[VSG_TEXCOORD_COUNT]; + +#ifdef DEPTHPEELING_PASS +layout(input_attachment_index = 0, set = PEEL_DESCRIPTOR_SET, binding = 0) uniform subpassInput opaqueDepth; +layout(input_attachment_index = 1, set = PEEL_DESCRIPTOR_SET, binding = 1) uniform subpassInput prevPassDepth; +#endif + +layout(location = 0) out vec4 outColor; + +// include the calculateShadowCoverageForDirectionalLight(..) implementation +#include "shadows.glsl" + +// Find the normal for this fragment, pulling either from a predefined normal map +// or from the interpolated mesh normal and tangent attributes. +vec3 getNormal() +{ + vec3 result; +#ifdef VSG_NORMAL_MAP + // Perturb normal, see http://www.thetenthplanet.de/archives/1180 + vec3 tangentNormal = texture(normalMap, texCoord[texCoordIndices.normalMap]).xyz * 2.0 - 1.0; + + //tangentNormal *= vec3(2,2,1); + + vec3 q1 = dFdx(eyePos); + vec3 q2 = dFdy(eyePos); + vec2 st1 = dFdx(texCoord[texCoordIndices.normalMap]); + vec2 st2 = dFdy(texCoord[texCoordIndices.normalMap]); + + vec3 N = normalize(normalDir); + vec3 T = normalize(q1 * st2.t - q2 * st1.t); + vec3 B = -normalize(cross(N, T)); + mat3 TBN = mat3(T, B, N); + + result = normalize(TBN * tangentNormal); +#else + result = normalize(normalDir); +#endif +#ifdef VSG_TWO_SIDED_LIGHTING + if (!gl_FrontFacing) + result = -result; +#endif + return result; +} + +vec3 computeLighting(vec3 ambientColor, vec3 diffuseColor, vec3 specularColor, vec3 emissiveColor, float shininess, float ambientOcclusion, vec3 ld, vec3 nd, vec3 vd) +{ + vec3 color = vec3(0.0); + color.rgb += ambientColor; + + float diff = max(dot(ld, nd), 0.0); + color.rgb += diffuseColor * diff; + + if (diff > 0.0) + { + vec3 halfDir = normalize(ld + vd); + color.rgb += specularColor * pow(max(dot(halfDir, nd), 0.0), shininess); + } + + vec3 result = color + emissiveColor; + result *= ambientOcclusion; + + return result; +} + + +void main() +{ +#ifdef DEPTHPEELING_PASS + if (gl_FragCoord.z <= subpassLoad(opaqueDepth).r) + discard; + +#ifndef DEPTHPEELING_FIRSTPASS + if (gl_FragCoord.z >= subpassLoad(prevPassDepth).r) + discard; +#endif +#endif + + float intensityMinimum = 0.001; + +#ifdef VSG_POINT_SPRITE + const vec2 texCoordDiffuse = gl_PointCoord.xy; +#else + const vec2 texCoordDiffuse = texCoord[texCoordIndices.diffuseMap].st; +#endif + + vec4 diffuseColor = vertexColor * material.diffuseColor; +#ifdef VSG_DIFFUSE_MAP + #ifdef VSG_GREYSCALE_DIFFUSE_MAP + float v = texture(diffuseMap, texCoordDiffuse).s; + diffuseColor *= vec4(v, v, v, 1.0); + #else + diffuseColor *= texture(diffuseMap, texCoordDiffuse); + #endif +#endif + +#ifdef VSG_DETAIL_MAP + vec4 detailColor = texture(detailMap, texCoord[texCoordIndices.detailMap].st); + diffuseColor.rgb = mix(diffuseColor.rgb, detailColor.rgb, detailColor.a); +#endif + + vec4 ambientColor = diffuseColor * material.ambientColor * material.ambientColor.a; + vec4 specularColor = material.specularColor; + vec4 emissiveColor = material.emissiveColor; + float shininess = material.shininess; + float ambientOcclusion = 1.0; + +#ifdef DEPTHPEELING_PASS + if (diffuseColor.a < (1.0 - material.alphaMaskCutoff) || diffuseColor.a >= material.alphaMaskCutoff) discard; +#else + if (diffuseColor.a < material.alphaMaskCutoff) discard; + diffuseColor.a = 1.0; +#endif + +#ifdef VSG_EMISSIVE_MAP + emissiveColor *= texture(emissiveMap, texCoord[texCoordIndices.emissiveMap].st); +#endif + +#ifdef VSG_LIGHTMAP_MAP + ambientOcclusion *= texture(aoMap, texCoord[texCoordIndices.aoMap].st).r; +#endif + +#ifdef VSG_SPECULAR_MAP + specularColor *= texture(specularMap, texCoord[texCoordIndices.specularMap].st); +#endif + + vec3 nd = getNormal(); + vec3 vd = normalize(viewDir); + + vec3 color = vec3(0.0, 0.0, 0.0); + + vec4 lightNums = lightData.values[0]; + int numAmbientLights = int(lightNums[0]); + int numDirectionalLights = int(lightNums[1]); + int numPointLights = int(lightNums[2]); + int numSpotLights = int(lightNums[3]); + int lightDataIndex = 1; + + if (numAmbientLights>0) + { + // ambient lights + for(int i = 0; i0) + { + vec3 q1 = dFdx(eyePos); + vec3 q2 = dFdy(eyePos); + vec2 st1 = dFdx(texCoord[0]); + vec2 st2 = dFdy(texCoord[0]); + + vec3 N = normalize(normalDir); + vec3 T = normalize(q1 * st2.t - q2 * st1.t); + vec3 B = -normalize(cross(N, T)); + + // directional lights + for(int i = 0; i 0) + { + if (intensity > intensityMinimum) + intensity *= (1.0-calculateShadowCoverageForDirectionalLight(lightDataIndex, shadowMapIndex, T, B, color)); + + lightDataIndex += 1 + 8 * shadowMapCount; + shadowMapIndex += shadowMapCount; + } + else + lightDataIndex++; + + // if light is too shadowed to effect the rendering skip it + if (intensity < intensityMinimum ) continue; + + color.rgb += (diffuseColor.rgb * lightColor.rgb) * (intensity); + + if (shininess > 0.0 && diff > 0.0) + { + vec3 halfDir = normalize(direction + vd); + color.rgb += specularColor.rgb * (pow(max(dot(halfDir, nd), 0.0), shininess) * intensity); + } + } + } + + if (numPointLights>0) + { + // point light + for(int i = 0; i 0.0 && diff > 0.0) + { + vec3 halfDir = normalize(direction + vd); + color.rgb += specularColor.rgb * (pow(max(dot(halfDir, nd), 0.0), shininess) * scale); + } + } + } + + if (numSpotLights>0) + { + vec3 q1 = dFdx(eyePos); + vec3 q2 = dFdy(eyePos); + vec2 st1 = dFdx(texCoord[0]); + vec2 st2 = dFdy(texCoord[0]); + + vec3 N = normalize(normalDir); + vec3 T = normalize(q1 * st2.t - q2 * st1.t); + vec3 B = -normalize(cross(N, T)); + + // spot light + for(int i = 0; i 0) + { + if (lightDirection_cosOuterAngle.w < dot_lightdirection) + intensity *= (1.0-calculateShadowCoverageForSpotLight(lightDataIndex, shadowMapIndex, T, B, dist, color)); + + lightDataIndex += 1 + 8 * shadowMapCount; + shadowMapIndex += shadowMapCount; + } + else + lightDataIndex++; + + // if light is too shadowed to effect the rendering skip it + if (intensity < intensityMinimum ) continue; + + float scale = (intensity * smoothstep(lightDirection_cosOuterAngle.w, position_cosInnerAngle.w, dot_lightdirection)) / distance2; + + float unclamped_LdotN = dot(direction, nd); + + float diff = scale * max(unclamped_LdotN, 0.0); + color.rgb += (diffuseColor.rgb * lightColor.rgb) * diff; + if (shininess > 0.0 && diff > 0.0) + { + vec3 halfDir = normalize(direction + vd); + color.rgb += specularColor.rgb * (pow(max(dot(halfDir, nd), 0.0), shininess) * scale); + } + } + } + + outColor.rgb = (color * ambientOcclusion) + emissiveColor.rgb; + outColor.a = diffuseColor.a; +} diff --git a/data/textures/wood.png b/data/textures/wood.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f38e25c999e0107afba73ea36f25166b0daefa GIT binary patch literal 178934 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�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

E+x>WDbN*X404pfxrDf*B}tDKZ3%;&@$w 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 KMNUMnLSTZjQit~d literal 0 HcmV?d00001 diff --git a/examples/oit/CMakeLists.txt b/examples/oit/CMakeLists.txt new file mode 100644 index 00000000..39b39f4a --- /dev/null +++ b/examples/oit/CMakeLists.txt @@ -0,0 +1,3 @@ +if (vsgXchange_FOUND) + add_subdirectory(vsgdepthpeeling) +endif() diff --git a/examples/oit/vsgdepthpeeling/CMakeLists.txt b/examples/oit/vsgdepthpeeling/CMakeLists.txt new file mode 100644 index 00000000..a13b35c0 --- /dev/null +++ b/examples/oit/vsgdepthpeeling/CMakeLists.txt @@ -0,0 +1,26 @@ +set(SOURCES + depthpeeling/Bindings.cpp + depthpeeling/Bindings.h + depthpeeling/Builder.cpp + depthpeeling/Builder.h + depthpeeling/PipelineConfigurator.cpp + depthpeeling/PipelineConfigurator.h + depthpeeling/RenderGraph.cpp + depthpeeling/RenderGraph.h + depthpeeling/Resources.cpp + depthpeeling/Resources.h + depthpeeling/ShaderSet.cpp + depthpeeling/ShaderSet.h + vsgdepthpeeling.cpp +) + +add_executable(vsgdepthpeeling ${SOURCES}) + +target_link_libraries(vsgdepthpeeling vsg::vsg) + +if (vsgXchange_FOUND) + target_compile_definitions(vsgdepthpeeling PRIVATE vsgXchange_FOUND) + target_link_libraries(vsgdepthpeeling vsgXchange::vsgXchange) +endif() + +install(TARGETS vsgdepthpeeling RUNTIME DESTINATION bin) diff --git a/examples/oit/vsgdepthpeeling/depthpeeling/Bindings.cpp b/examples/oit/vsgdepthpeeling/depthpeeling/Bindings.cpp new file mode 100644 index 00000000..e8612433 --- /dev/null +++ b/examples/oit/vsgdepthpeeling/depthpeeling/Bindings.cpp @@ -0,0 +1,127 @@ +#include "Bindings.h" +#include "Resources.h" + +using namespace vsg::oit::depthpeeling; +using namespace vsg; + +DescriptorSetBinding::DescriptorSetBinding(Resources& r, ref_ptr s, ref_ptr l) + : Inherit(3) + , _resources(&r) + , _shaderSet(s) + , _layout(l) +{ +} + +void DescriptorSetBinding::compile(Context& context) +{ + _context = &context; + + if (_layout.valid()) + { + _layout->compile(context); + } + + ensureBindingUpToDate(); +} + +void DescriptorSetBinding::record(CommandBuffer& commandBuffer) const +{ + if (ensureBindingUpToDate()) + { + _binding->record(commandBuffer); + } +} + +BindPeelDescriptorSet::BindPeelDescriptorSet( + Resources& r, ref_ptr s, ref_ptr l, int32_t i) + : Inherit(r, s, l) + , _peelIndex(i) +{ +} + +ref_ptr BindPeelDescriptorSet::createBinding() const +{ + auto resources = _resources.valid() ? _resources.ref_ptr() : nullptr; + if (!resources.valid()) + { + return {}; + } + + const auto peelIdx = (_peelIndex + 1) % 2; + + auto opaqueDepthImageInfo = ImageInfo::create(nullptr, + resources->attachments().opaqueDepth.view, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL); + auto prevPassDepthImageInfo = ImageInfo::create(nullptr, + resources->attachments().depth[peelIdx].view, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL); + + auto& baseBinding = _shaderSet->getDescriptorBinding("opaqueDepth"); + + DescriptorConfigurator descriptorConfigurator{ _shaderSet }; + descriptorConfigurator.assignTexture("opaqueDepth", { opaqueDepthImageInfo }, 0); + descriptorConfigurator.assignTexture("prevPassDepth", { prevPassDepthImageInfo }, 0); + + if (_peelIndex == 0) + { + descriptorConfigurator.defines.insert("DEPTHPEELING_FIRSTPASS"); + } + + return BindDescriptorSet::create(VK_PIPELINE_BIND_POINT_GRAPHICS, _layout, + baseBinding.set, descriptorConfigurator.descriptorSets.at(baseBinding.set)); +} + +CombineDescriptorSetBinding::CombineDescriptorSetBinding( + Resources& r, ref_ptr s, ref_ptr l) + : Inherit(r, s, l) +{ +} + +ref_ptr CombineDescriptorSetBinding::createBinding() const +{ + auto outputImageInfo = ImageInfo::create(nullptr, + getInputImageView(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + + auto& baseBinding = _shaderSet->getDescriptorBinding("peelOutput"); + + DescriptorConfigurator descriptorConfigurator{ _shaderSet }; + descriptorConfigurator.assignTexture("peelOutput", { outputImageInfo }, 0); + + if (auto define = inputImageViewDefine(); !define.empty()) + { + descriptorConfigurator.defines.insert(define); + } + + return BindDescriptorSet::create(VK_PIPELINE_BIND_POINT_GRAPHICS, _layout, + baseBinding.set, descriptorConfigurator.descriptorSets.at(baseBinding.set)); +} + +BindPeelCombineDescriptorSet::BindPeelCombineDescriptorSet( + Resources& r, ref_ptr s, ref_ptr l) + : Inherit(r, s, l) +{ +} + +ref_ptr BindPeelCombineDescriptorSet::getInputImageView() const +{ + return _resources.valid() ? _resources.ref_ptr()->attachments().color.view : nullptr; +} + +std::string BindPeelCombineDescriptorSet::inputImageViewDefine() const +{ + return "DEPTHPEELING_PASS"; +} + +BindFinalCombineDescriptorSet::BindFinalCombineDescriptorSet( + Resources& r, ref_ptr s, ref_ptr l) + : Inherit(r, s, l) +{ +} + +ref_ptr BindFinalCombineDescriptorSet::getInputImageView() const +{ + return _resources.valid() ? _resources.ref_ptr()->attachments().accum.view : nullptr; +} + +std::string BindFinalCombineDescriptorSet::inputImageViewDefine() const +{ + return ""; +} diff --git a/examples/oit/vsgdepthpeeling/depthpeeling/Bindings.h b/examples/oit/vsgdepthpeeling/depthpeeling/Bindings.h new file mode 100644 index 00000000..f0be918a --- /dev/null +++ b/examples/oit/vsgdepthpeeling/depthpeeling/Bindings.h @@ -0,0 +1,140 @@ +#pragma once + +#include + +#include +#include + +#include +#include +#include + +namespace vsg::oit::depthpeeling { + + class Resources; + + class DescriptorSetBinding : public Inherit + { + protected: + vsg::observer_ptr _resources; + + vsg::ref_ptr _context; + mutable vsg::Context* _compiledWithContext = nullptr; + + vsg::ref_ptr _shaderSet; + vsg::ref_ptr _layout; + + mutable vsg::ref_ptr _binding; + + public: + DescriptorSetBinding(Resources& r, + vsg::ref_ptr s, vsg::ref_ptr l); + + template + static void t_traverse(N& dsb, V& visitor) + { + if (dsb._layout.valid()) + { + dsb._layout->accept(visitor); + } + if (dsb._binding.valid()) + { + dsb._binding->accept(visitor); + } + } + + void traverse(Visitor& visitor) override + { + t_traverse(*this, visitor); + } + void traverse(ConstVisitor& visitor) const override + { + t_traverse(*this, visitor); + } + + void dirty() + { + _compiledWithContext = nullptr; + } + + void compile(Context& context) override; + void record(CommandBuffer& commandBuffer) const override; + + protected: + bool ensureBindingUpToDate() const + { + if (_compiledWithContext != nullptr || !_resources.valid() + || !_context.valid() || !_layout.valid() || !_shaderSet.valid()) + { + return _binding.valid(); + } + + _binding = createBinding(); + if (!_binding.valid()) + { + return false; + } + + _binding->compile(*_context); + const_cast(slot) = _binding->slot; + + _compiledWithContext = _context.get(); + return true; + } + virtual vsg::ref_ptr createBinding() const = 0; + }; + + class BindPeelDescriptorSet final : public Inherit + { + int32_t _peelIndex; + + public: + BindPeelDescriptorSet(Resources& r, + vsg::ref_ptr s, vsg::ref_ptr l, int32_t i); + + protected: + ref_ptr createBinding() const override; + }; + + class CombineDescriptorSetBinding : public Inherit + { + public: + CombineDescriptorSetBinding(Resources& r, + vsg::ref_ptr s, vsg::ref_ptr l); + + protected: + virtual ref_ptr getInputImageView() const = 0; + virtual std::string inputImageViewDefine() const = 0; + + ref_ptr createBinding() const override; + }; + + class BindPeelCombineDescriptorSet final : public Inherit + { + public: + BindPeelCombineDescriptorSet(Resources& r, + vsg::ref_ptr s, vsg::ref_ptr l); + + protected: + ref_ptr getInputImageView() const override; + std::string inputImageViewDefine() const override; + }; + + class BindFinalCombineDescriptorSet : public Inherit + { + public: + BindFinalCombineDescriptorSet(Resources& r, + vsg::ref_ptr s, vsg::ref_ptr l); + + protected: + ref_ptr getInputImageView() const override; + std::string inputImageViewDefine() const override; + }; + +} + +EVSG_type_name(vsg::oit::depthpeeling::DescriptorSetBinding); +EVSG_type_name(vsg::oit::depthpeeling::BindPeelDescriptorSet); +EVSG_type_name(vsg::oit::depthpeeling::CombineDescriptorSetBinding); +EVSG_type_name(vsg::oit::depthpeeling::BindPeelCombineDescriptorSet); +EVSG_type_name(vsg::oit::depthpeeling::BindFinalCombineDescriptorSet); diff --git a/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp b/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp new file mode 100644 index 00000000..be9c177e --- /dev/null +++ b/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp @@ -0,0 +1,225 @@ +#include "Builder.h" + +#include "PipelineConfigurator.h" +#include "Bindings.h" + +#include +#include +#include + +#include +#include +#include + +#include + +using namespace vsg::oit::depthpeeling; +using namespace vsg; + +Builder::Builder(ref_ptr settings) + : _settings(settings) +{ +} + +Builder::RenderGraphs Builder::createRenderGraphs() +{ + ref_ptr headlight = _settings->headlight ? createHeadlight() : nullptr; + return { + createOpaqueRenderGraph(headlight), + createTransparencyRenderGraph(headlight) + }; +} + +void Builder::setCamera(ref_ptr camera) +{ + _camera = camera; +} + +ref_ptr Builder::getCamera() const +{ + return _camera; +} + +void Builder::setScene(Pass pass, ref_ptr scene) +{ + switch (pass) + { + case Pass::Opaque: + _opaqueScene = scene; + break; + case Pass::Transparency: + _transparencyScene = scene; + break; + } +} + +ref_ptr Builder::getScene(Pass pass) const +{ + switch (pass) + { + case Pass::Opaque: + return _opaqueScene; + case Pass::Transparency: + return _transparencyScene; + default: + return nullptr; + } +} + +ref_ptr Builder::getOrCreateMaterialBinding(MaterialConfigurator configurator, bool share) const +{ + if (!configurator || !_settings.valid()) + { + return {}; + } + + auto graphicsPipelineConfigurator = OpaquePipelineConfigurator::getOrCreate(_settings->shadingModel, _settings->options); + DescriptorConfigurator descriptorConfigurator{ graphicsPipelineConfigurator->shaderSet }; + + configurator(descriptorConfigurator, _settings->options); + + auto& materialDescriptorBinding = graphicsPipelineConfigurator->shaderSet->getDescriptorBinding("material"); + auto binding = vsg::BindDescriptorSet::create(VK_PIPELINE_BIND_POINT_GRAPHICS, + graphicsPipelineConfigurator->layout, materialDescriptorBinding.set, + descriptorConfigurator.descriptorSets.at(materialDescriptorBinding.set)); + + if (share && _settings->options.valid() && _settings->options->sharedObjects.valid()) + { + _settings->options->sharedObjects->share(binding); + } + + return binding; +} + +ref_ptr Builder::createView(const ref_ptr& headlight) const +{ + auto proj = Perspective::create(*_camera->projectionMatrix.cast()); + auto cam = Camera::create(proj, _camera->viewMatrix, _camera->viewportState); + + auto view = View::create(cam); + if (headlight.valid()) + { + view->addChild(headlight); + } + + return view; +} + +ref_ptr Builder::createClearAttachments() const +{ + ClearAttachments::Attachments attachments; + attachments.push_back({ VK_IMAGE_ASPECT_COLOR_BIT, 0, {0.0f, 0.0f, 0.0f, 0.0f} }); + attachments.push_back({ VK_IMAGE_ASPECT_DEPTH_BIT, 0, {0.0f, 0} }); + + VkClearRect clearRect; + clearRect.rect.offset = { 0, 0 }; + clearRect.rect.extent = _settings->window->extent2D(); + clearRect.baseArrayLayer = 0; + clearRect.layerCount = 1; + + ClearAttachments::Rects clearRects; + clearRects.emplace_back(clearRect); + + return ClearAttachments::create(attachments, clearRects); +} + +ref_ptr Builder::createPeelScene(Resources& resources, int32_t peelIndex) const +{ + auto scene = StateGroup::create(); + + auto configurator = PeelPipelineConfigurator::getOrCreate(_settings->shadingModel, peelIndex, _settings->options); + configurator->copyTo(scene); + + auto bindDescriptorSet = BindPeelDescriptorSet::create( + resources, configurator->shaderSet, configurator->layout, peelIndex); + scene->add(bindDescriptorSet); + resources.registerDescriptorSetBinding(*bindDescriptorSet); + + scene->addChild(createClearAttachments()); + scene->addChild(_transparencyScene); + + return scene; +} + +ref_ptr Builder::createPeelCombineScene(Resources& resources, int32_t peelIndex) const +{ + auto scene = StateGroup::create(); + + auto configurator = PeelCombinePipelineConfigurator::getOrCreate(peelIndex, _settings->options); + configurator->copyTo(scene); + + auto bindDescriptorSet = BindPeelCombineDescriptorSet::create( + resources, configurator->shaderSet, configurator->layout); + scene->add(bindDescriptorSet); + resources.registerDescriptorSetBinding(*bindDescriptorSet); + + scene->addChild(Draw::create(3, 1, 0, 0)); + + return scene; +} + +ref_ptr Builder::createFinalCombineScene(Resources& resources) const +{ + auto scene = StateGroup::create(); + + auto configurator = FinalCombinePipelineConfigurator::getOrCreate(_settings->numPeelLayers, _settings->options); + configurator->copyTo(scene); + + auto bindDescriptorSet = BindFinalCombineDescriptorSet::create( + resources, configurator->shaderSet, configurator->layout); + scene->add(bindDescriptorSet); + resources.registerDescriptorSetBinding(*bindDescriptorSet); + + scene->addChild(Draw::create(3, 1, 0, 0)); + + return scene; +} + +ref_ptr Builder::createOpaqueRenderGraph(const ref_ptr& headlight) const +{ + if (_settings == nullptr || _opaqueScene == nullptr) + { + return {}; + } + + auto configurator = OpaquePipelineConfigurator::getOrCreate(_settings->shadingModel, _settings->options); + + auto scene = StateGroup::create(); + configurator->copyTo(scene); + scene->addChild(_opaqueScene); + + auto view = createView(headlight); + view->addChild(scene); + + auto renderGraph = vsg::RenderGraph::create(_settings->window, view); + renderGraph->contents = VK_SUBPASS_CONTENTS_INLINE; + + return renderGraph; +} + +ref_ptr Builder::createTransparencyRenderGraph(const ref_ptr& headlight) const +{ + if (_settings == nullptr || _transparencyScene == nullptr || _settings->numPeelLayers == 0) + { + return {}; + } + + auto view = createView(headlight); + auto renderGraph = RenderGraph::create(_settings->window, view); + renderGraph->contents = VK_SUBPASS_CONTENTS_INLINE; + renderGraph->numPeelLayers = _settings->numPeelLayers; + + auto scene = Group::create(); + for (auto peelIndex = 0; peelIndex < _settings->numPeelLayers; ++peelIndex) + { + scene->addChild(createPeelScene(*renderGraph->resources(), peelIndex)); + scene->addChild(NextSubPass::create()); + scene->addChild(createPeelCombineScene(*renderGraph->resources(), peelIndex)); + scene->addChild(NextSubPass::create()); + } + scene->addChild(createFinalCombineScene(*renderGraph->resources())); + + view->addChild(scene); + + return renderGraph; +} diff --git a/examples/oit/vsgdepthpeeling/depthpeeling/Builder.h b/examples/oit/vsgdepthpeeling/depthpeeling/Builder.h new file mode 100644 index 00000000..bfb8f6f5 --- /dev/null +++ b/examples/oit/vsgdepthpeeling/depthpeeling/Builder.h @@ -0,0 +1,84 @@ +#pragma once + +#include "RenderGraph.h" +#include "ShaderSet.h" + +#include +#include + +namespace vsg::oit::depthpeeling { + + class Resources; + + class Builder final : public Inherit + { + public: + struct Settings : Inherit + { + Settings() = default; + explicit Settings(ref_ptr w, ref_ptr o, + ShadingModel m = ShadingModel::Phong, bool h = true, uint32_t n = 8) + : window(w) + , options(o) + , shadingModel(m) + , headlight(h) + , numPeelLayers(n) + { + } + + ref_ptr window; + ref_ptr options; + + ShadingModel shadingModel = ShadingModel::Phong; + bool headlight = true; + + int32_t numPeelLayers = 8; + }; + + enum class Pass + { + Opaque, + Transparency + }; + + Builder(ref_ptr settings); + + struct RenderGraphs + { + ref_ptr opaque; + ref_ptr transparency; + }; + + RenderGraphs createRenderGraphs(); + + void setCamera(ref_ptr camera); + ref_ptr getCamera() const; + + void setScene(Pass pass, ref_ptr scene); + ref_ptr getScene(Pass pass) const; + + using MaterialConfigurator = std::function&)>; + ref_ptr getOrCreateMaterialBinding(MaterialConfigurator configurator, bool share = true) const; + + private: + ref_ptr createView(const ref_ptr& headlight) const; + + ref_ptr createClearAttachments() const; + ref_ptr createPeelScene(Resources& resources, int32_t peelIndex) const; + ref_ptr createPeelCombineScene(Resources& resources, int32_t peelIndex) const; + ref_ptr createFinalCombineScene(Resources& resources) const; + + ref_ptr createOpaqueRenderGraph(const ref_ptr& headlight) const; + ref_ptr createTransparencyRenderGraph(const ref_ptr& headlight) const; + + ref_ptr _settings; + + ref_ptr _camera; + ref_ptr _opaqueScene; + ref_ptr _transparencyScene; + }; + +} + +EVSG_type_name(vsg::oit::depthpeeling::Builder) +EVSG_type_name(vsg::oit::depthpeeling::Builder::Settings) diff --git a/examples/oit/vsgdepthpeeling/depthpeeling/PipelineConfigurator.cpp b/examples/oit/vsgdepthpeeling/depthpeeling/PipelineConfigurator.cpp new file mode 100644 index 00000000..d8fe8559 --- /dev/null +++ b/examples/oit/vsgdepthpeeling/depthpeeling/PipelineConfigurator.cpp @@ -0,0 +1,175 @@ +#include "PipelineConfigurator.h" + +using namespace vsg::oit::depthpeeling; +using namespace vsg; + +struct SetPeelCombinePipelineStates : public Visitor +{ + bool underblending = true; + + SetPeelCombinePipelineStates(bool underblend) + : underblending{ underblend } + { + } + + void apply(Object& object) override + { + object.traverse(*this); + } + + void apply(ColorBlendState& cbs) override + { + for (auto& blendAttachment : cbs.attachments) + { + blendAttachment.blendEnable = VK_TRUE; + + if (underblending) + { + // ------------------------------- + // Under-Blending + // ------------------------------- + + // Color: dst.rgb + src.rgb * (1 - dst.a) + blendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA; + blendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE; + blendAttachment.colorBlendOp = VK_BLEND_OP_ADD; + + // Alpha: dst.a + src.a * (1 - dst.a) + blendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA; + blendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE; + blendAttachment.alphaBlendOp = VK_BLEND_OP_ADD; + } + else + { + // ------------------------------- + // Over-Blending + // ------------------------------- + + // Color: src.rgb + dst.rgb * (1 - src.a) + blendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_ONE; + blendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + blendAttachment.colorBlendOp = VK_BLEND_OP_ADD; + + // Alpha: src.a + dst.a * (1 - src.a) + blendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; + blendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + blendAttachment.alphaBlendOp = VK_BLEND_OP_ADD; + } + + blendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT + | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; + } + } + + void apply(RasterizationState& rs) override + { + // disable culling mode completely for blending passes + rs.cullMode = VK_CULL_MODE_NONE; + } + + void apply(DepthStencilState& dss) override + { + // disable depth buffer completely for blending passes + dss.depthTestEnable = VK_FALSE; + dss.depthWriteEnable = VK_FALSE; + } +}; + +void configureSharedBindings(GraphicsPipelineConfigurator& configurator, ref_ptr& options) +{ + if (options.valid()) + { + configurator.assignInheritedState(options->inheritedState); + } + + configurator.enableArray("vsg_Vertex", VK_VERTEX_INPUT_RATE_VERTEX, 12); + configurator.enableArray("vsg_Normal", VK_VERTEX_INPUT_RATE_VERTEX, 12); + configurator.enableArray("vsg_TexCoord0", VK_VERTEX_INPUT_RATE_VERTEX, 8); + configurator.enableArray("vsg_Color", VK_VERTEX_INPUT_RATE_INSTANCE, 4); + + configurator.enableDescriptor("material"); + configurator.enableDescriptor("texCoordIndices"); + + configurator.enableTexture("diffuseMap"); + + if (auto* descriptorConfigurator = configurator.descriptorConfigurator.get(); descriptorConfigurator != nullptr) + { + descriptorConfigurator->assignDefaults(configurator.inheritedSets); + configurator.shaderHints->defines.insert( + descriptorConfigurator->defines.begin(), descriptorConfigurator->defines.end()); + } +} + +void initializePipelineConfigurator(vsg::ref_ptr& configurator, ref_ptr& options) +{ + if (options.valid() && options->sharedObjects.valid()) + { + options->sharedObjects->share(configurator, [](auto gpc) { gpc->init(); }); + } + else + { + configurator->init(); + } +} + +ref_ptr OpaquePipelineConfigurator::getOrCreate(ShadingModel model, ref_ptr options) +{ + auto configurator = GraphicsPipelineConfigurator::create(getOrCreateShadingShaderSet(model, options)); + configureSharedBindings(*configurator, options); + + initializePipelineConfigurator(configurator, options); + return configurator; +} + +vsg::ref_ptr PeelPipelineConfigurator::getOrCreate( + ShadingModel model, uint32_t peelIndex, vsg::ref_ptr options) +{ + auto configurator = GraphicsPipelineConfigurator::create(getOrCreateShadingShaderSet(model, options)); + configurator->subpass = peelIndex * 2; + configureSharedBindings(*configurator, options); + + configurator->shaderHints->defines.insert("DEPTHPEELING_PASS"); + if (peelIndex == 0) + { + configurator->shaderHints->defines.insert("DEPTHPEELING_FIRSTPASS"); + } + + initializePipelineConfigurator(configurator, options); + return configurator; +} + +vsg::ref_ptr PeelCombinePipelineConfigurator::getOrCreate( + uint32_t peelIndex, vsg::ref_ptr options) +{ + auto configurator = GraphicsPipelineConfigurator::create(getOrCreateCombineShaderSet(options)); + configurator->subpass = peelIndex * 2 + 1; + if (options.valid()) + { + configurator->assignInheritedState(options->inheritedState); + } + + configurator->shaderHints->defines.insert("DEPTHPEELING_PASS"); + + SetPeelCombinePipelineStates sps{ true }; + configurator->accept(sps); + + initializePipelineConfigurator(configurator, options); + return configurator; +} + +vsg::ref_ptr FinalCombinePipelineConfigurator::getOrCreate( + uint32_t numPeelLayers, vsg::ref_ptr options) +{ + auto configurator = GraphicsPipelineConfigurator::create(getOrCreateCombineShaderSet(options)); + configurator->subpass = numPeelLayers * 2; + if (options.valid()) + { + configurator->assignInheritedState(options->inheritedState); + } + + SetPeelCombinePipelineStates sps{ false }; + configurator->accept(sps); + + initializePipelineConfigurator(configurator, options); + return configurator; +} diff --git a/examples/oit/vsgdepthpeeling/depthpeeling/PipelineConfigurator.h b/examples/oit/vsgdepthpeeling/depthpeeling/PipelineConfigurator.h new file mode 100644 index 00000000..6e89655b --- /dev/null +++ b/examples/oit/vsgdepthpeeling/depthpeeling/PipelineConfigurator.h @@ -0,0 +1,45 @@ +#pragma once + +#include "ShaderSet.h" + +#include + +namespace vsg::oit::depthpeeling { + + class OpaquePipelineConfigurator + { + public: + OpaquePipelineConfigurator() = delete; + + static vsg::ref_ptr getOrCreate( + ShadingModel model, vsg::ref_ptr options); + }; + + class PeelPipelineConfigurator + { + public: + PeelPipelineConfigurator() = delete; + + static vsg::ref_ptr getOrCreate( + ShadingModel model, uint32_t peelIndex, vsg::ref_ptr options); + }; + + class PeelCombinePipelineConfigurator + { + public: + PeelCombinePipelineConfigurator() = delete; + + static vsg::ref_ptr getOrCreate( + uint32_t peelIndex, vsg::ref_ptr options); + }; + + class FinalCombinePipelineConfigurator + { + public: + FinalCombinePipelineConfigurator() = delete; + + static vsg::ref_ptr getOrCreate( + uint32_t numPeelLayers, vsg::ref_ptr options); + }; + +} diff --git a/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.cpp b/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.cpp new file mode 100644 index 00000000..90558cfc --- /dev/null +++ b/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.cpp @@ -0,0 +1,97 @@ +#include "RenderGraph.h" + +#include "Bindings.h" + +#include + +using namespace vsg::oit::depthpeeling; + +namespace vsg::oit::depthpeeling +{ + + template + class ScopedOverride { + public: + ScopedOverride(T& a, T& b) + : _a(a) + , _b(b) + { + std::swap(_a, _b); + } + + ~ScopedOverride() + { + std::swap(_a, _b); + } + + private: + T& _a; + T& _b; + }; + + template + ScopedOverride make_scoped_override(T& x, T& y) + { + return ScopedOverride(x, y); + } +} + +RenderGraph::RenderGraph(ref_ptr window, ref_ptr view) + : Inherit(window, view) + , _resources(Resources::create()) +{ +} + +template +void RenderGraph::t_accept(V& visitor) +{ + if (numPeelLayers == 0) + { + Inherit::accept(visitor); + return; + } + + // replace with compatible renderpass used in this RenderGraph, + // then restore the original renderpass after traversal + auto select_renderpass = _resources->getOrCreateRenderPass({ window, numPeelLayers }); + auto renderPass_override = make_scoped_override(renderPass, select_renderpass); + + // update the attachments used in the RenderPass + _resources->ensureAttachmentsUpToDate({ window, getExtent() }); + + // traverse the RenderGraph as usual with the base visitor + Inherit::accept(visitor); +} + +void RenderGraph::accept(Visitor& visitor) +{ + t_accept(visitor); +} + +void RenderGraph::accept(ConstVisitor& visitor) const +{ + const_cast(this)->t_accept(visitor); +} + +void RenderGraph::accept(vsg::RecordTraversal& recordTraversal) const +{ + if (numPeelLayers == 0) + { + return; + } + + // VSG exposes accept(RecordTraversal) as const, but for traversal we need to + // temporarily replace the framebuffer and restore it afterwards. + auto& active_framebuffer = const_cast&>(framebuffer); + auto select_framebuffer = _resources->getOrCreateFramebuffer({ window, getExtent() }); + auto framebuffer_override = make_scoped_override(active_framebuffer, select_framebuffer); + + // VSG exposes accept(RecordTraversal) as const, but for traversal we need to + // temporarily replace the clear values and restore it afterwards. + auto& active_clearValues = const_cast(clearValues); + auto select_clearValues = Resources::clearValues(); + auto clearValues_override = make_scoped_override(active_clearValues, select_clearValues); + + // traverse the RenderGraph as usual with the RecordTraversal visitor + vsg::RenderGraph::accept(recordTraversal); +} diff --git a/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.h b/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.h new file mode 100644 index 00000000..d3778462 --- /dev/null +++ b/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.h @@ -0,0 +1,38 @@ +#pragma once + +#include "Resources.h" + +#include + +#include +#include +#include +#include + +namespace vsg::oit::depthpeeling { + + class RenderGraph final : public Inherit + { + mutable ref_ptr _resources; + + template + void t_accept(V& visitor); + + public: + RenderGraph() = default; + explicit RenderGraph(ref_ptr window, ref_ptr view); + + uint32_t numPeelLayers = 0; + + const ref_ptr& resources() const + { + return _resources; + } + + void accept(Visitor& visitor) override; + void accept(ConstVisitor& visitor) const override; + void accept(RecordTraversal& recordTraversal) const override; + }; + +} +EVSG_type_name(vsg::oit::depthpeeling::RenderGraph); diff --git a/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp b/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp new file mode 100644 index 00000000..9e95c095 --- /dev/null +++ b/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp @@ -0,0 +1,389 @@ +#include "Resources.h" + +#include "Bindings.h" + +using namespace vsg::oit::depthpeeling; +using namespace vsg; + +ref_ptr Resources::createTransparencyPass(const CreateRenderPassInfo& createInfo) +{ + if (!createInfo.window.valid()) + { + return {}; + } + + // ======================================================================== + // Attachment descriptions + // ======================================================================== + + auto opaqueColorDescription = defaultColorAttachment(createInfo.window->surfaceFormat().format); + opaqueColorDescription.initialLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + opaqueColorDescription.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + + auto opaqueDepthDescription = defaultDepthAttachment(createInfo.window->depthFormat()); + opaqueDepthDescription.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + opaqueDepthDescription.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + opaqueDepthDescription.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + + auto accumDescription = defaultColorAttachment(ColorAccumImageType); + accumDescription.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + accumDescription.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + accumDescription.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + + auto peelColorDescription = defaultColorAttachment(ColorPeelImageType); + peelColorDescription.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + peelColorDescription.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + peelColorDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + + auto depthDescription = defaultDepthAttachment(DepthPeelImageType); + depthDescription.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + depthDescription.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + depthDescription.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + + // ======================================================================== + // Attachments + // ======================================================================== + + RenderPass::Attachments attachments{ + opaqueColorDescription, accumDescription, peelColorDescription, + opaqueDepthDescription, depthDescription, depthDescription }; + + // Attachment-References + + std::vector attachmentRefs{ + {ColorOpaque, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT}, + {ColorAccum, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT}, + {ColorPeel, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT}, + {DepthOpaque, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_ASPECT_DEPTH_BIT}, + {DepthPeel0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_DEPTH_BIT}, + {DepthPeel1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_DEPTH_BIT}}; + + RenderPass::Subpasses subpasses; + RenderPass::Dependencies dependencies; + + // ======================================================================== + // Subpasses + // ======================================================================== + + // Subpass 0 => Peels - 1 => Gather and compute transparencies in correct order + + for (auto pass = 0u; pass < createInfo.numPeelLayers; ++pass) + { + SubpassDescription renderSubpass{0, VK_PIPELINE_BIND_POINT_GRAPHICS}; + renderSubpass.colorAttachments.emplace_back(attachmentRefs.at(ColorPeel)); + renderSubpass.depthStencilAttachments.emplace_back( + attachmentRefs.at(DepthPeel0 + (pass % 2))); + + renderSubpass.inputAttachments.emplace_back(attachmentRefs.at(DepthOpaque)); + renderSubpass.inputAttachments.back().layout = + VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL; + renderSubpass.inputAttachments.emplace_back( + attachmentRefs.at(DepthPeel0 + ((pass + 1) % 2))); + renderSubpass.inputAttachments.back().layout = + VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL; + + renderSubpass.preserveAttachments.push_back(ColorOpaque); + renderSubpass.preserveAttachments.push_back(ColorAccum); + + subpasses.emplace_back(renderSubpass); + + SubpassDescription combineSubpass{0, VK_PIPELINE_BIND_POINT_GRAPHICS}; + combineSubpass.colorAttachments.emplace_back(attachmentRefs.at(ColorAccum)); + + combineSubpass.inputAttachments.emplace_back(attachmentRefs.at(ColorPeel)); + combineSubpass.inputAttachments.back().layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + + combineSubpass.preserveAttachments.push_back(ColorOpaque); + combineSubpass.preserveAttachments.push_back(DepthOpaque); + combineSubpass.preserveAttachments.push_back(DepthPeel0); + combineSubpass.preserveAttachments.push_back(DepthPeel1); + + subpasses.emplace_back(combineSubpass); + } + + // Combine Subpass => Combine opaque and transparent fragments + + SubpassDescription combineSubpass{0, VK_PIPELINE_BIND_POINT_GRAPHICS}; + combineSubpass.colorAttachments.emplace_back(attachmentRefs.at(ColorOpaque)); + + combineSubpass.inputAttachments.emplace_back(attachmentRefs.at(ColorAccum)); + combineSubpass.inputAttachments.back().layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + + subpasses.emplace_back(combineSubpass); + + // ======================================================================== + // Dependencies between subpasses + // ======================================================================== + + constexpr auto ColorDepthAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT + | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT + | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; + constexpr auto ColorAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT + | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; + + // EXTERNAL => First peeling subpass + + SubpassDependency dependency = {}; + dependency.srcSubpass = VK_SUBPASS_EXTERNAL; + dependency.dstSubpass = 0; + dependency.srcStageMask = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT; + dependency.dstStageMask = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT; + dependency.srcAccessMask = ColorDepthAccessMask; + dependency.dstAccessMask = ColorDepthAccessMask; + dependency.dependencyFlags = 0; + + // Subpass 0 => (Peels * 2) - 1 => Gather transparencies and combine 1 - Peels * 2 + + for (auto pass = 0u; pass < createInfo.numPeelLayers; ++pass) + { + dependency.srcAccessMask = ColorDepthAccessMask; + dependencies.emplace_back(dependency); + dependency.srcSubpass = dependency.dstSubpass++; + + dependency.srcAccessMask = ColorAccessMask; + dependencies.emplace_back(dependency); + dependency.srcSubpass = dependency.dstSubpass++; + } + + // Last gather transparencies subpass => Combine subpass + + dependency.srcAccessMask = ColorAccessMask; + dependencies.emplace_back(dependency); + + // Combine subpass => EXTERNAL + + dependency.srcSubpass = dependency.dstSubpass; + dependency.dstSubpass = VK_SUBPASS_EXTERNAL; + dependencies.emplace_back(dependency); + + // ======================================================================== + // Create renderpass + // ======================================================================== + + return RenderPass::create( + createInfo.window->getOrCreateDevice(), attachments, subpasses, dependencies); +} + +void Resources::ensureRenderPassUpToDate(const CreateRenderPassInfo& createInfo) +{ + if (_renderPass.valid() + && _state.renderPass.window == createInfo.window + && _state.renderPass.numPeelLayers == createInfo.numPeelLayers) + { + return; + } + + if (!createInfo.window.valid() || createInfo.numPeelLayers == 0) + { + _renderPass.reset(); + } + else + { + _renderPass = createTransparencyPass(createInfo); + } + + _state.renderPass = createInfo; +} + +ref_ptr Resources::getOrCreateRenderPass(const CreateRenderPassInfo& createInfo) +{ + ensureRenderPassUpToDate(createInfo); + return _renderPass; +} + +void Resources::ensureAttachmentsUpToDate(const CreateAttachmentInfo& createInfo) +{ + if (_attachments.valid() + && _state.attachment.window == createInfo.window + && _state.attachment.extent.width == createInfo.extent.width + && _state.attachment.extent.height == createInfo.extent.height) + { + return; + } + + createImages(createInfo); + + // update all registered descriptor set bindings as attachments have changed and + // they might be used as input attachments in the shader, so need to be re-bound + for (auto& dsb : _descriptorSetBindings) + { + dsb->dirty(); + } +} + +const Resources::Attachments& Resources::getOrCreateAttachments(const CreateAttachmentInfo& createInfo) +{ + ensureAttachmentsUpToDate(createInfo); + return _attachments; +} + +ref_ptr Resources::getOrCreateFramebuffer(const CreateFramebufferInfo& createInfo) +{ + auto valid = createInfo.window.valid() + && _state.framebuffer.window == createInfo.window + && _state.framebuffer.extent.width == createInfo.extent.width + && _state.framebuffer.extent.height == createInfo.extent.height; + if (valid) + { + for (auto& framebuffer : _framebuffers) + { + if (!framebuffer.valid() || framebuffer->extent2D() != createInfo.extent) + { + valid = false; + break; + } + } + } + + if (valid) + { + return framebuffer(); + } + + createFramebuffer(createInfo); + return framebuffer(); +} + +ref_ptr Resources::framebuffer() const +{ + const auto idx = _state.framebuffer.window.valid() ? _state.framebuffer.window->imageIndex() : 0; + if (!_state.framebuffer.window.valid() || idx >= _framebuffers.size()) + { + return {}; + } + + return _framebuffers.at(idx); +} + +const vsg::RenderGraph::ClearValues& Resources::clearValues() +{ + static const vsg::RenderGraph::ClearValues clearValues{ + { 0.0f, 0.0f, 0.0f, 0.0f }, // ColorOpaque + { 0.0f, 0.0f, 0.0f, 0.0f }, // ColorAccum + { 0.0f, 0.0f, 0.0f, 0.0f }, // ColorPeel + { 0.0f, 0 }, // DepthOpaque + { 0.0f, 0 }, // DepthPeel0 + { 0.0f, 0 } // DepthPeel1 + }; + + return clearValues; +} + +void Resources::registerDescriptorSetBinding(DescriptorSetBinding& dsb) +{ + _descriptorSetBindings.emplace_back(&dsb); +} + +void Resources::createImages(const CreateAttachmentInfo& createInfo) +{ + if (!createInfo.window.valid()) + { + _attachments = {}; + _state.attachment = createInfo; + + return; + } + + auto device = createInfo.window->getOrCreateDevice(); + + // determine depth attachment from opaque pass of window + _attachments.opaqueDepth = { + createInfo.window->getOrCreateDepthImage(), + createInfo.window->getOrCreateDepthImageView() + }; + + // create accum color image + _attachments.accum.image = Image::create(); + _attachments.accum.image->imageType = VK_IMAGE_TYPE_2D; + _attachments.accum.image->extent = {createInfo.extent.width, createInfo.extent.height, 1}; + _attachments.accum.image->mipLevels = 1; + _attachments.accum.image->arrayLayers = 1; + _attachments.accum.image->format = ColorAccumImageType; + _attachments.accum.image->tiling = VK_IMAGE_TILING_OPTIMAL; + _attachments.accum.image->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + _attachments.accum.image->samples = VK_SAMPLE_COUNT_1_BIT; + _attachments.accum.image->sharingMode = VK_SHARING_MODE_EXCLUSIVE; + _attachments.accum.image->usage = + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; + + _attachments.accum.image->compile(device); + _attachments.accum.image->allocateAndBindMemory(device); + _attachments.accum.view = ImageView::create(_attachments.accum.image, VK_IMAGE_ASPECT_COLOR_BIT); + _attachments.accum.view->compile(device); + // create peel target color image + _attachments.color.image = Image::create(); + _attachments.color.image->imageType = VK_IMAGE_TYPE_2D; + _attachments.color.image->extent = _attachments.accum.image->extent; + _attachments.color.image->mipLevels = 1; + _attachments.color.image->arrayLayers = 1; + _attachments.color.image->format = ColorPeelImageType; + _attachments.color.image->tiling = VK_IMAGE_TILING_OPTIMAL; + _attachments.color.image->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + _attachments.color.image->samples = VK_SAMPLE_COUNT_1_BIT; + _attachments.color.image->sharingMode = VK_SHARING_MODE_EXCLUSIVE; + _attachments.color.image->usage = + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; + + _attachments.color.image->compile(device); + _attachments.color.image->allocateAndBindMemory(device); + _attachments.color.view = ImageView::create(_attachments.color.image, VK_IMAGE_ASPECT_COLOR_BIT); + _attachments.color.view->compile(device); + // Gather passes images + for (auto& depth : _attachments.depth) + { + // create depth image + depth.image = Image::create(); + depth.image->imageType = VK_IMAGE_TYPE_2D; + depth.image->extent = _attachments.accum.image->extent; + depth.image->mipLevels = 1; + depth.image->arrayLayers = 1; + depth.image->format = DepthPeelImageType; + depth.image->tiling = VK_IMAGE_TILING_OPTIMAL; + depth.image->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + depth.image->samples = VK_SAMPLE_COUNT_1_BIT; + depth.image->sharingMode = VK_SHARING_MODE_EXCLUSIVE; + depth.image->usage = + VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; + + depth.image->compile(device); + depth.image->allocateAndBindMemory(device); + + depth.view = ImageView::create(depth.image, VK_IMAGE_ASPECT_DEPTH_BIT); + depth.view->compile(device); + } + + _state.attachment = createInfo; +} + +void Resources::createFramebuffer(const CreateFramebufferInfo& createInfo) +{ + if (!createInfo.window.valid()) + { + _framebuffers.clear(); + _state.framebuffer = createInfo; + + return; + } + + auto& attachments = getOrCreateAttachments({ createInfo.window, createInfo.extent }); + + _framebuffers.clear(); + for (auto index = 0u; index < createInfo.window->numFrames(); ++index) + { + auto colorImageView = createInfo.window->imageView(index); + + ImageViews imageViews{ + colorImageView, + attachments.accum.view, + attachments.color.view, + attachments.opaqueDepth.view, + attachments.depth[0].view, + attachments.depth[1].view }; + + _framebuffers.push_back(Framebuffer::create( + getOrCreateRenderPass(_state.renderPass), imageViews, + createInfo.extent.width, createInfo.extent.height, 1)); + } + + _state.framebuffer = createInfo; +} diff --git a/examples/oit/vsgdepthpeeling/depthpeeling/Resources.h b/examples/oit/vsgdepthpeeling/depthpeeling/Resources.h new file mode 100644 index 00000000..3c6a7ed3 --- /dev/null +++ b/examples/oit/vsgdepthpeeling/depthpeeling/Resources.h @@ -0,0 +1,111 @@ +#pragma once + +#include "ShaderSet.h" + +#include +#include + +#include +#include + +#include + +namespace vsg::oit::depthpeeling { + + class DescriptorSetBinding; + + class Resources final : public Inherit + { + public: + struct CreateRenderPassInfo + { + ref_ptr window; + uint32_t numPeelLayers = 8; + }; + + struct CreateAttachmentInfo + { + ref_ptr window; + VkExtent2D extent{ vsg::RenderGraph::invalid_dimension, vsg::RenderGraph::invalid_dimension }; + }; + using CreateFramebufferInfo = CreateAttachmentInfo; + + struct Attachments + { + struct Attachment + { + ref_ptr image; + ref_ptr view; + + bool valid() const { return image.valid() && view.valid(); } + }; + + // resolved opaque depth attachment from opaque pass + Attachment opaqueDepth; + + // accumulated transparency attachment over all peel layers + Attachment accum; + // current peel layer attachment + Attachment color; + // two depth attachments used in ping-pong fashion + std::array depth; + + bool valid() const + { + return opaqueDepth.valid() && accum.valid() + && color.valid() && depth[0].valid() && depth[1].valid(); + } + }; + + void ensureRenderPassUpToDate(const CreateRenderPassInfo& createInfo); + ref_ptr getOrCreateRenderPass(const CreateRenderPassInfo& createInfo); + ref_ptr renderPass() const { return _renderPass; } + + void ensureAttachmentsUpToDate(const CreateAttachmentInfo& createInfo); + const Attachments& getOrCreateAttachments(const CreateAttachmentInfo& createInfo); + const Attachments& attachments() const { return _attachments; } + + ref_ptr getOrCreateFramebuffer(const CreateFramebufferInfo& createInfo); + ref_ptr framebuffer() const; + + static const vsg::RenderGraph::ClearValues& clearValues(); + + void registerDescriptorSetBinding(DescriptorSetBinding& dsb); + + protected: + enum + { + ColorOpaque = 0, // resolved (!) color from opaque pass + ColorAccum = 1, + ColorPeel = 2, + DepthOpaque = 3, // resolved (!) depth from opaque pass + DepthPeel0 = 4, + DepthPeel1 = 5, + }; + + struct State + { + CreateRenderPassInfo renderPass; + CreateAttachmentInfo attachment; + CreateFramebufferInfo framebuffer; + }; + + constexpr static auto ColorAccumImageType = VK_FORMAT_R32G32B32A32_SFLOAT; + constexpr static auto ColorPeelImageType = ColorAccumImageType; + constexpr static auto DepthPeelImageType = VK_FORMAT_D32_SFLOAT; + + ref_ptr createTransparencyPass(const CreateRenderPassInfo& createInfo); + + void createImages(const CreateAttachmentInfo& createInfo); + void createFramebuffer(const CreateFramebufferInfo& createInfo); + + State _state; + + Attachments _attachments; + ref_ptr _renderPass; + std::vector> _framebuffers; + std::vector> _descriptorSetBindings; + }; + +} +EVSG_type_name(vsg::oit::depthpeeling::Resources) \ No newline at end of file diff --git a/examples/oit/vsgdepthpeeling/depthpeeling/ShaderSet.cpp b/examples/oit/vsgdepthpeeling/depthpeeling/ShaderSet.cpp new file mode 100644 index 00000000..cc904a84 --- /dev/null +++ b/examples/oit/vsgdepthpeeling/depthpeeling/ShaderSet.cpp @@ -0,0 +1,252 @@ +#include "ShaderSet.h" + +#include +#include + +using namespace vsg::oit::depthpeeling; +using namespace vsg; + +ref_ptr createShadingShaderSet(ShadingModel model, ref_ptr options) +{ + constexpr auto ViewDescriptorSet = 0; + constexpr auto MaterialDescriptorSet = 1; + constexpr auto PeelDescriptorSet = 2; + + auto vertexShader = read_cast("shaders/standard.vert", options); + auto fragmentShader = read_cast(model == ShadingModel::Phong + ? "shaders/dp_pass_phong.frag" + : "shaders/dp_pass_flat.frag", + options); + + auto shaderSet = ShaderSet::create(ShaderStages{ vertexShader, fragmentShader }); + + shaderSet->addAttributeBinding("vsg_Vertex", "", 0, VK_FORMAT_R32G32B32_SFLOAT, + vec3Array::create(1)); + shaderSet->addAttributeBinding("vsg_Normal", "", 1, VK_FORMAT_R32G32B32_SFLOAT, + vec3Array::create(1)); + shaderSet->addAttributeBinding("vsg_TexCoord0", "VSG_TEXTURECOORD_0", 2, + VK_FORMAT_R32G32_SFLOAT, vec2Array::create(1)); + shaderSet->addAttributeBinding("vsg_TexCoord1", "VSG_TEXTURECOORD_1", 3, + VK_FORMAT_R32G32_SFLOAT, vec2Array::create(1)); + shaderSet->addAttributeBinding("vsg_TexCoord2", "VSG_TEXTURECOORD_2", 4, + VK_FORMAT_R32G32_SFLOAT, vec2Array::create(1)); + shaderSet->addAttributeBinding("vsg_TexCoord3", "VSG_TEXTURECOORD_3", 5, + VK_FORMAT_R32G32_SFLOAT, vec2Array::create(1)); + shaderSet->addAttributeBinding("vsg_Color", "", 6, VK_FORMAT_R32G32B32A32_SFLOAT, + vec4Array::create(1), CoordinateSpace::LINEAR); + + shaderSet->addAttributeBinding("vsg_Translation_scaleDistance", "VSG_BILLBOARD", 7, + VK_FORMAT_R32G32B32A32_SFLOAT, vec4Array::create(1)); + + shaderSet->addAttributeBinding("vsg_Translation", "VSG_INSTANCE_TRANSLATION", 7, + VK_FORMAT_R32G32B32_SFLOAT, vec3Array::create(1)); + shaderSet->addAttributeBinding("vsg_Rotation", "VSG_INSTANCE_ROTATION", 8, + VK_FORMAT_R32G32B32A32_SFLOAT, quatArray::create(1)); + shaderSet->addAttributeBinding("vsg_Scale", "VSG_INSTANCE_SCALE", 9, + VK_FORMAT_R32G32B32_SFLOAT, vec3Array::create(1)); + + shaderSet->addAttributeBinding("vsg_JointIndices", "VSG_SKINNING", 10, + VK_FORMAT_R32G32B32A32_SINT, ivec4Array::create(1)); + shaderSet->addAttributeBinding("vsg_JointWeights", "VSG_SKINNING", 11, + VK_FORMAT_R32G32B32A32_SFLOAT, vec4Array::create(1)); + + shaderSet->addDescriptorBinding( + "diffuseMap", "VSG_DIFFUSE_MAP", MaterialDescriptorSet, 0, + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, + ubvec4Array2D::create(1, 1, Data::Properties{ VK_FORMAT_R8G8B8A8_UNORM })); + shaderSet->addDescriptorBinding( + "detailMap", "VSG_DETAIL_MAP", MaterialDescriptorSet, 1, + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, + ubvec4Array2D::create(1, 1, Data::Properties{ VK_FORMAT_R8G8B8A8_UNORM })); + + if (model == ShadingModel::Phong) + { + shaderSet->addDescriptorBinding( + "normalMap", "VSG_NORMAL_MAP", MaterialDescriptorSet, 2, + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, + vec3Array2D::create(1, 1, Data::Properties{ VK_FORMAT_R32G32B32_SFLOAT }), + CoordinateSpace::LINEAR); + shaderSet->addDescriptorBinding( + "aoMap", "VSG_LIGHTMAP_MAP", MaterialDescriptorSet, 3, + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, + vec4Array2D::create(1, 1, Data::Properties{ VK_FORMAT_R32_SFLOAT })); + shaderSet->addDescriptorBinding( + "emissiveMap", "VSG_EMISSIVE_MAP", MaterialDescriptorSet, 4, + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, + vec4Array2D::create(1, 1, Data::Properties{ VK_FORMAT_R8G8B8A8_UNORM })); + } + + shaderSet->addDescriptorBinding( + "displacementMap", "VSG_DISPLACEMENT_MAP", MaterialDescriptorSet, 7, + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_VERTEX_BIT, + floatArray2D::create(1, 1, Data::Properties{ VK_FORMAT_R32_SFLOAT }), + CoordinateSpace::LINEAR); + shaderSet->addDescriptorBinding("displacementMapScale", "VSG_DISPLACEMENT_MAP", + MaterialDescriptorSet, 8, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + 1, VK_SHADER_STAGE_VERTEX_BIT, + vec3Value::create(1.0f, 1.0f, 1.0f)); + + shaderSet->addDescriptorBinding( + "material", "", MaterialDescriptorSet, 10, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, + VK_SHADER_STAGE_FRAGMENT_BIT, PhongMaterialValue::create(), CoordinateSpace::LINEAR); + shaderSet->addDescriptorBinding( + "texCoordIndices", "", MaterialDescriptorSet, 11, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, + VK_SHADER_STAGE_FRAGMENT_BIT, TexCoordIndicesValue::create(), CoordinateSpace::LINEAR); + + shaderSet->addDescriptorBinding("jointMatrices", "VSG_SKINNING", MaterialDescriptorSet, 12, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, + VK_SHADER_STAGE_VERTEX_BIT, mat4Value::create()); + + shaderSet->addDescriptorBinding( + "lightData", "", ViewDescriptorSet, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, + VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, vec4Array::create(64)); + shaderSet->addDescriptorBinding("viewportData", "", ViewDescriptorSet, 1, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, + VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, + vec4Value::create(.0f, .0f, 1280.0f, 1024.0f)); + shaderSet->addDescriptorBinding( + "shadowMaps", "", ViewDescriptorSet, 2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, + VK_SHADER_STAGE_FRAGMENT_BIT, + floatArray3D::create(1, 1, 1, Data::Properties{ VK_FORMAT_R32_SFLOAT })); + + if (model == ShadingModel::Phong) + { + shaderSet->addDescriptorBinding("shadowMapDirectSampler", "VSG_SHADOWS_PCSS", + ViewDescriptorSet, 3, VK_DESCRIPTOR_TYPE_SAMPLER, 1, + VK_SHADER_STAGE_FRAGMENT_BIT, nullptr); + shaderSet->addDescriptorBinding("shadowMapShadowSampler", "", ViewDescriptorSet, 4, + VK_DESCRIPTOR_TYPE_SAMPLER, 1, + VK_SHADER_STAGE_FRAGMENT_BIT, nullptr); + } + + shaderSet->addDescriptorBinding("opaqueDepth", "DEPTHPEELING_PASS", PeelDescriptorSet, 0, + VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, + VK_SHADER_STAGE_FRAGMENT_BIT, {}); + shaderSet->addDescriptorBinding("prevPassDepth", "DEPTHPEELING_PASS", PeelDescriptorSet, 1, + VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, + VK_SHADER_STAGE_FRAGMENT_BIT, {}); + + shaderSet->addPushConstantRange("pc", "", VK_SHADER_STAGE_ALL, 0, 128); + + if (model == ShadingModel::Phong) + { + shaderSet->optionalDefines = { "VSG_GREYSCALE_DIFFUSE_MAP", + "VSG_TWO_SIDED_LIGHTING", + "VSG_POINT_SPRITE", + "VSG_SHADOWS_PCSS", + "VSG_SHADOWS_SOFT", + "VSG_SHADOWS_HARD", + "SHADOWMAP_DEBUG" }; + } + else + { + shaderSet->optionalDefines = { "VSG_POINT_SPRITE", "VSG_GREYSCALE_DIFFUSE_MAP" }; + } + shaderSet->optionalDefines.insert("DEPTHPEELING_PASS"); + shaderSet->optionalDefines.insert("DEPTHPEELING_FIRSTPASS"); + + shaderSet->definesArrayStates.push_back( + DefinesArrayState{ {"VSG_INSTANCE_TRANSLATION"}, TranslationArrayState::create() }); + shaderSet->definesArrayStates.push_back(DefinesArrayState{ + {"VSG_INSTANCE_TRANSLATION", "VSG_INSTANCE_ROTATION", "VSG_INSTANCE_SCALE"}, + TranslationRotationScaleArrayState::create() }); + shaderSet->definesArrayStates.push_back( + DefinesArrayState{ {"VSG_INSTANCE_TRANSLATION", "VSG_DISPLACEMENT_MAP"}, + TranslationAndDisplacementMapArrayState::create() }); + shaderSet->definesArrayStates.push_back( + DefinesArrayState{ {"VSG_DISPLACEMENT_MAP"}, DisplacementMapArrayState::create() }); + shaderSet->definesArrayStates.push_back( + DefinesArrayState{ {"VSG_BILLBOARD"}, BillboardArrayState::create() }); + + shaderSet->customDescriptorSetBindings.push_back( + ViewDependentStateBinding::create(ViewDescriptorSet)); + + shaderSet->defaultShaderHints = ShaderCompileSettings::create(); + if (model == ShadingModel::Phong) + { + shaderSet->defaultShaderHints->defines.insert("VSG_TWO_SIDED_LIGHTING"); + } + for (auto& stage : shaderSet->stages) + { + stage->module->hints = shaderSet->defaultShaderHints; + } + + return shaderSet; +} + +ref_ptr vsg::oit::depthpeeling::getOrCreateShadingShaderSet(ShadingModel model, ref_ptr options) +{ + std::string shaderSetName{ model == ShadingModel::Flat ? FlatShadingModelShaderSetName : PhongShadingModelShaderSetName }; + + // check if a ShaderSet has already been assigned to the options object, if so return it + if (options) + { + if (auto itr = options->shaderSets.find(shaderSetName); itr != options->shaderSets.end()) + { + return itr->second; + } + } + + // if not found then create a new ShaderSet, assign it to the options object and return it + auto shaderSet = createShadingShaderSet(model, options); + + if (options) + { + options->shaderSets[shaderSetName] = shaderSet; + } + + return shaderSet; +} + +ref_ptr createCombineShaderSet(ref_ptr options) +{ + constexpr auto PeelDescriptorSet = 2; + + auto vertexShader = read_cast("shaders/dp_fullscreen.vert", options); + auto fragmentShader = read_cast("shaders/dp_combine.frag", options); + + auto shaderSet = ShaderSet::create(ShaderStages{ vertexShader, fragmentShader }); + + shaderSet->addAttributeBinding("vsg_Vertex", "", 0, VK_FORMAT_R32G32B32_SFLOAT, + vec3Array::create(1)); + shaderSet->addAttributeBinding("vsg_Normal", "", 1, VK_FORMAT_R32G32B32_SFLOAT, + vec3Array::create(1)); + + shaderSet->addDescriptorBinding("peelOutput", "", PeelDescriptorSet, 2, + VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, + VK_SHADER_STAGE_FRAGMENT_BIT, {}); + + shaderSet->addPushConstantRange("pc", "", VK_SHADER_STAGE_ALL, 0, 128); + + shaderSet->optionalDefines = { "DEPTHPEELING_PASS" }; + + shaderSet->defaultShaderHints = ShaderCompileSettings::create(); + for (auto& stage : shaderSet->stages) + { + stage->module->hints = shaderSet->defaultShaderHints; + } + + return shaderSet; +} + +ref_ptr vsg::oit::depthpeeling::getOrCreateCombineShaderSet(ref_ptr options) +{ + // check if a ShaderSet has already been assigned to the options object, if so return it + if (options) + { + if (auto itr = options->shaderSets.find(CombineShaderSetName); itr != options->shaderSets.end()) + { + return itr->second; + } + } + + // if not found then create a new ShaderSet, assign it to the options object and return it + auto shaderSet = createCombineShaderSet(options); + + if (options) + { + options->shaderSets[CombineShaderSetName] = shaderSet; + } + + return shaderSet; +} diff --git a/examples/oit/vsgdepthpeeling/depthpeeling/ShaderSet.h b/examples/oit/vsgdepthpeeling/depthpeeling/ShaderSet.h new file mode 100644 index 00000000..b3a13487 --- /dev/null +++ b/examples/oit/vsgdepthpeeling/depthpeeling/ShaderSet.h @@ -0,0 +1,23 @@ +#pragma once + +#include "ShaderSet.h" + +#include +#include + +namespace vsg::oit::depthpeeling { + + enum class ShadingModel + { + Flat, + Phong + }; + + constexpr const char* FlatShadingModelShaderSetName = "depthPeeling_flat"; + constexpr const char* PhongShadingModelShaderSetName = "depthPeeling_phong"; + constexpr const char* CombineShaderSetName = "depthPeeling_combine"; + + extern ref_ptr getOrCreateShadingShaderSet(ShadingModel model, ref_ptr options = {}); + extern ref_ptr getOrCreateCombineShaderSet(ref_ptr options = {}); + +} diff --git a/examples/oit/vsgdepthpeeling/vsgdepthpeeling.cpp b/examples/oit/vsgdepthpeeling/vsgdepthpeeling.cpp new file mode 100644 index 00000000..2a31b4f9 --- /dev/null +++ b/examples/oit/vsgdepthpeeling/vsgdepthpeeling.cpp @@ -0,0 +1,446 @@ +#include "depthpeeling/Builder.h" + +#include + +#ifdef vsgXchange_FOUND +# include +#endif + +#include +#include +#include +#include + +vsg::ref_ptr createBox(vsg::oit::depthpeeling::Builder& builder, + vsg::ref_ptr texture, vsg::vec4 color, vsg::vec3 offset) +{ + using namespace vsg; + + vsg::ref_ptr positions; + + auto colors = vsg::vec4Array::create(1, color); + + const vsg::vec3 dx{1.0f, 0.0f, 0.0f}; + const vsg::vec3 dy{0.0f, 1.0f, 0.0f}; + const vsg::vec3 dz{0.0f, 0.0f, 1.0f}; + const auto origin = offset - dx * 0.5f - dy * 0.5f - dz * 0.5f; + + auto [t_origin, t_scale, t_top] = vsg::vec3{0.0f, 1.0f, 1.0f}.value; + + vsg::vec3 v000(origin); + vsg::vec3 v100(origin + dx); + vsg::vec3 v110(origin + dx + dy); + vsg::vec3 v010(origin + dy); + vsg::vec3 v001(origin + dz); + vsg::vec3 v101(origin + dx + dz); + vsg::vec3 v111(origin + dx + dy + dz); + vsg::vec3 v011(origin + dy + dz); + + vsg::vec2 t00(0.0f, t_top); + vsg::vec2 t01(0.0f, t_origin); + vsg::vec2 t10(1.0f, t_top); + vsg::vec2 t11(1.0f, t_origin); + + vsg::ref_ptr vertices; + vsg::ref_ptr normals; + vsg::ref_ptr texcoords; + vsg::ref_ptr indices; + + vsg::vec3 n0 = vsg::normalize(vsg::cross(dx, dz)); + vsg::vec3 n1 = vsg::normalize(vsg::cross(dy, dz)); + vsg::vec3 n2 = -n0; + vsg::vec3 n3 = -n1; + vsg::vec3 n4 = vsg::normalize(vsg::cross(dy, dx)); + vsg::vec3 n5 = -n4; + + // set up vertex and index arrays + vertices = vsg::vec3Array::create( + {v000, v100, v101, v001, // front + v100, v110, v111, v101, // right + v110, v010, v011, v111, // far + v010, v000, v001, v011, // left + v010, v110, v100, v000, // bottom + v001, v101, v111, v011}); // top + + normals = vsg::vec3Array::create( + {n0, n0, n0, n0, + n1, n1, n1, n1, + n2, n2, n2, n2, + n3, n3, n3, n3, + n4, n4, n4, n4, + n5, n5, n5, n5}); + + texcoords = vsg::vec2Array::create( + {t00, t10, t11, t01, + t00, t10, t11, t01, + t00, t10, t11, t01, + t00, t10, t11, t01, + t00, t10, t11, t01, + t00, t10, t11, t01}); + + indices = vsg::ushortArray::create( + {0, 1, 2, 0, 2, 3, + 4, 5, 6, 4, 6, 7, + 8, 9, 10, 8, 10, 11, + 12, 13, 14, 12, 14, 15, + 16, 17, 18, 16, 18, 19, + 20, 21, 22, 20, 22, 23}); + + auto vid = vsg::VertexIndexDraw::create(); + + vsg::DataList arrays; + arrays.push_back(vertices); + if (normals) arrays.push_back(normals); + if (texcoords) arrays.push_back(texcoords); + if (colors) arrays.push_back(colors); + if (positions) arrays.push_back(positions); + vid->assignArrays(arrays); + + vid->assignIndices(indices); + vid->indexCount = static_cast(indices->size()); + vid->instanceCount = 1; + + auto box = vsg::StateGroup::create(); + box->add(builder.getOrCreateMaterialBinding([&texture](auto& descriptorConfigurator, auto& options) { + auto material = vsg::PhongMaterialValue::create(); + material->value().alphaMaskCutoff = 0.95f; + + descriptorConfigurator.assignDescriptor("material", material); + descriptorConfigurator.assignDescriptor("texCoordIndices", vsg::TexCoordIndicesValue::create()); + + auto sampler = vsg::Sampler::create(); + sampler->addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT; + sampler->addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT; + if (options.valid() && options->sharedObjects.valid()) + { + options->sharedObjects->share(sampler); + } + + descriptorConfigurator.assignTexture("diffuseMap", texture, sampler); + })); + + box->addChild(vid); + return box; +} + +vsg::ref_ptr createScene(vsg::oit::depthpeeling::Builder& builder, vsg::ref_ptr texture, bool largeScene) +{ + auto scene = vsg::Group::create(); + + static const std::array colors = { + vsg::vec4(1.0, 1.0, 0.0, 1.0), + vsg::vec4(0.0, 1.0, 1.0, 1.0), + vsg::vec4(1.0, 0.0, 0.0, 0.5), + vsg::vec4(0.0, 1.0, 0.0, 0.5), + vsg::vec4(0.0, 0.0, 1.0, 0.5)}; + + if (largeScene) + { + auto object = 0u; + for (auto z = -3; z <= 3; ++z) + { + for (auto x = -3; x <= 3; ++x) + { + for (auto y = -3; y <= 3; ++y, ++object) + { + scene->addChild(createBox( + builder, texture, colors[object % colors.size()], vsg::vec3(x * 1.5, y * 1.5, z * 1.5))); + } + } + } + } + else + { + scene->addChild(createBox(builder, texture, colors[0], vsg::vec3(1.25, 0.0, 0.0))); + scene->addChild(createBox(builder, texture, colors[1], vsg::vec3(0.0, -1.25, 0.0))); + scene->addChild(createBox(builder, texture, colors[2], vsg::vec3(-1.25, 0.0, 0.0))); + scene->addChild(createBox(builder, texture, colors[3], vsg::vec3(0.0, 0.0, 0.0))); + scene->addChild(createBox(builder, texture, colors[4], vsg::vec3(0.0, 1.25, 0.0))); + } + + return scene; +} + +int main(int argc, char** argv) +{ + try + { + // set up defaults and read command line arguments to override them + vsg::CommandLine arguments(&argc, argv); + + // create windowTraits using the any command line arugments to configure settings + auto windowTraits = vsg::WindowTraits::create(arguments); + + // NOTE: + // depth peeling requires the use of input attachments to read back the depth and color information from previous peels, + // so we need to ensure that the swapchain image usage and depth image usage include VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT + // and we also need to ensure that the depth image usage includes VK_IMAGE_USAGE_TRANSFER_SRC_BIT so that we can use + // the depth image in transparency passes to reject fragments that are behind the nearest opaque fragments. + windowTraits->swapchainPreferences.imageUsage |= + (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT); + windowTraits->depthImageUsage |= + (VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT); + + // if we want to redirect std::cout and std::cerr to the vsg::Logger call vsg::Logger::redirect_stdout() + if (arguments.read({"--redirect-std", "-r"})) vsg::Logger::instance()->redirect_std(); + + // set up vsg::Options to pass in filepaths, ReaderWriters and other IO related options to use when reading and writing files. + auto options = vsg::Options::create(); + options->sharedObjects = vsg::SharedObjects::create(); + options->fileCache = vsg::getEnv("VSG_FILE_CACHE"); + options->paths = vsg::getEnvPaths("VSG_FILE_PATH"); + +#ifdef vsgXchange_all + // add vsgXchange's support for reading and writing 3rd party file formats + options->add(vsgXchange::all::create()); +#endif + + options->readOptions(arguments); + + if (uint32_t numOperationThreads = 0; arguments.read("--ot", numOperationThreads)) options->operationThreads = vsg::OperationThreads::create(numOperationThreads); + + if (arguments.read({ "-s", "--sampled" })) + { + windowTraits->samples = VK_SAMPLE_COUNT_8_BIT; + } + + bool reportAverageFrameRate = arguments.read("--fps"); + bool reportMemoryStats = arguments.read("--rms"); + if (arguments.read({"-t", "--test"})) + { + windowTraits->swapchainPreferences.presentMode = VK_PRESENT_MODE_IMMEDIATE_KHR; + windowTraits->fullscreen = true; + reportAverageFrameRate = true; + } + if (arguments.read({"--st", "--small-test"})) + { + windowTraits->swapchainPreferences.presentMode = VK_PRESENT_MODE_IMMEDIATE_KHR; + windowTraits->width = 192, windowTraits->height = 108; + windowTraits->decoration = false; + reportAverageFrameRate = true; + } + + auto largeScene = arguments.read({"--ls", "--large-scene"}); + + bool multiThreading = arguments.read("--mt"); + auto maxTime = arguments.value(std::numeric_limits::max(), "--max-time"); + + if (arguments.read("--ThreadLogger")) vsg::Logger::instance() = vsg::ThreadLogger::create(); + if (int log_level = 0; arguments.read("--log-level", log_level)) vsg::Logger::instance()->level = vsg::Logger::Level(log_level); + auto numFrames = arguments.value(-1, "-f"); + + if (int log_level = 0; arguments.read("--log-level", log_level)) vsg::Logger::instance()->level = vsg::Logger::Level(log_level); + auto logFilename = arguments.value("", "--log"); + + auto nearFarRatio = arguments.value(0.001, "--nfr"); + + vsg::ref_ptr instrumentation; + if (arguments.read({"--gpu-annotation", "--ga"}) && vsg::isExtensionSupported(VK_EXT_DEBUG_UTILS_EXTENSION_NAME)) + { + windowTraits->debugUtils = true; + + auto gpu_instrumentation = vsg::GpuAnnotation::create(); + if (arguments.read("--name")) + gpu_instrumentation->labelType = vsg::GpuAnnotation::SourceLocation_name; + else if (arguments.read("--className")) + gpu_instrumentation->labelType = vsg::GpuAnnotation::Object_className; + else if (arguments.read("--func")) + gpu_instrumentation->labelType = vsg::GpuAnnotation::SourceLocation_function; + + instrumentation = gpu_instrumentation; + } + else if (arguments.read({"--profiler", "--pr"})) + { + // set Profiler options + auto settings = vsg::Profiler::Settings::create(); + arguments.read("--cpu", settings->cpu_instrumentation_level); + arguments.read("--gpu", settings->gpu_instrumentation_level); + arguments.read("--log-size", settings->log_size); + + // create the profiler + instrumentation = vsg::Profiler::create(settings); + } + + vsg::Affinity affinity; + uint32_t cpu = 0; + while (arguments.read("-c", cpu)) + { + affinity.cpus.insert(cpu); + } + + if (arguments.errors()) return arguments.writeErrorMessages(std::cerr); + + // read first texture file specified on command line + vsg::ref_ptr texture; + for (int i = 1; i < argc; ++i) + { + auto object = vsg::read(arguments[i], options); + if (texture = object.cast(); texture && texture->available()) + { + break; + } + + texture.reset(); + } + + if (!texture) + { + texture = vsg::read("textures/wood.png", options).cast(); + } + + if (!texture || texture->empty()) + { + std::cout << "Please specify a texture file on the command line or ensure the default texture 'textures/wood.png' is available." << std::endl; + return 1; + } + + // create the viewer and assign window(s) to it + auto viewer = vsg::Viewer::create(); + auto window = vsg::Window::create(windowTraits); + if (!window) + { + std::cout << "Could not create window." << std::endl; + return 1; + } + + viewer->addWindow(window); + + // create depth peeling builder + auto builder = vsg::oit::depthpeeling::Builder::create( + vsg::oit::depthpeeling::Builder::Settings::create(window, options)); + + auto scene = createScene(*builder, texture, largeScene); + + vsg::ref_ptr lookAt; + vsg::ref_ptr perspective; + + { + // compute the bounds of the scene graph to help position camera + vsg::ComputeBounds computeBounds; + scene->accept(computeBounds); + + vsg::dvec3 centre = (computeBounds.bounds.min + computeBounds.bounds.max) * 0.5; + double radius = vsg::length(computeBounds.bounds.max - computeBounds.bounds.min) * 0.6; + + // set up the camera + lookAt = vsg::LookAt::create(centre + vsg::dvec3(0.0, -radius * 3.5, 0.0), centre, vsg::dvec3(0.0, 0.0, 1.0)); + perspective = vsg::Perspective::create(30.0, static_cast(window->extent2D().width) / static_cast(window->extent2D().height), nearFarRatio * radius, radius * 10.5); + } + + auto camera = vsg::Camera::create(perspective, lookAt, vsg::ViewportState::create(window->extent2D())); + + // assign the camera and scenes to the builder - NOTE: the same scene can be used for both the opaque and transparency + builder->setCamera(camera); + builder->setScene(vsg::oit::depthpeeling::Builder::Pass::Opaque, scene); + builder->setScene(vsg::oit::depthpeeling::Builder::Pass::Transparency, scene); + + // add close handler to respond to the close window button and pressing escape + viewer->addEventHandler(vsg::CloseHandler::create(viewer)); + // add trackball handler to respond to mouse events for interactive camera control + viewer->addEventHandler(vsg::Trackball::create(camera)); + + // create the needed render graphs used for depth peeling + auto renderGraphs = builder->createRenderGraphs(); + + // create command graph and assign the render graphs to it + auto commandGraph = vsg::CommandGraph::create(window); + commandGraph->addChild(renderGraphs.opaque); + commandGraph->addChild(renderGraphs.transparency); + + viewer->assignRecordAndSubmitTaskAndPresentation({commandGraph}); + + if (instrumentation) viewer->assignInstrumentation(instrumentation); + + if (multiThreading) + { + viewer->setupThreading(); + + if (affinity) + { + auto cpu_itr = affinity.cpus.begin(); + + // set affinity of main thread + if (cpu_itr != affinity.cpus.end()) + { + std::cout << "vsg::setAffinity() " << *cpu_itr << std::endl; + vsg::setAffinity(vsg::Affinity(*cpu_itr++)); + } + + for (auto& thread : viewer->threads) + { + if (thread.joinable() && cpu_itr != affinity.cpus.end()) + { + std::cout << "vsg::setAffinity(" << thread.get_id() << ") " << *cpu_itr << std::endl; + vsg::setAffinity(thread, vsg::Affinity(*cpu_itr++)); + } + } + } + } + else if (affinity) + { + std::cout << "vsg::setAffinity("; + for (auto cpu_num : affinity.cpus) + { + std::cout << " " << cpu_num; + } + std::cout << " )" << std::endl; + + vsg::setAffinity(affinity); + } + + viewer->compile(); + viewer->start_point() = vsg::clock::now(); + + // rendering main loop + while (viewer->advanceToNextFrame() && (numFrames < 0 || (numFrames--) > 0) && (viewer->getFrameStamp()->simulationTime < maxTime)) + { + // pass any events into EventHandlers assigned to the Viewer + viewer->handleEvents(); + + viewer->update(); + + viewer->recordAndSubmit(); + + viewer->present(); + } + + if (reportAverageFrameRate) + { + auto fs = viewer->getFrameStamp(); + double fps = static_cast(fs->frameCount) / std::chrono::duration(vsg::clock::now() - viewer->start_point()).count(); + std::cout << "Average frame rate = " << fps << " fps" << std::endl; + } + + if (reportMemoryStats) + { + if (options->sharedObjects) + { + vsg::LogOutput output; + options->sharedObjects->report(output); + } + } + + if (auto profiler = instrumentation.cast()) + { + instrumentation->finish(); + if (logFilename) + { + std::ofstream fout(logFilename); + profiler->log->report(fout); + } + else + { + profiler->log->report(std::cout); + } + } + } + catch (const vsg::Exception& ve) + { + for (int i = 0; i < argc; ++i) std::cerr << argv[i] << " "; + std::cerr << "\n[Exception] - " << ve.message << " result = " << ve.result << std::endl; + return 1; + } + + // clean up done automatically thanks to ref_ptr<> + return 0; +}