Skip to content

Add depth peeling example for order-independent transparency (OIT)#386

Merged
robertosfield merged 1 commit into
vsg-dev:masterfrom
swp-ariaci:oit-depthpeeling
Apr 17, 2026
Merged

Add depth peeling example for order-independent transparency (OIT)#386
robertosfield merged 1 commit into
vsg-dev:masterfrom
swp-ariaci:oit-depthpeeling

Conversation

@swp-ariaci
Copy link
Copy Markdown
Contributor

This pull request adds a depth peeling example to VulkanSceneGraph, intended both as a demonstration and as a prototype for potential integration of order-independent transparency (OIT) techniques into VSG.

The example implements a multi-pass depth peeling approach to correctly render overlapping transparent geometry without requiring manual sorting. It is designed with clarity in mind and aims to explore how such a technique could fit into VSG’s rendering architecture.

image

This work is related to the ongoing discussion about transparency handling in VSG:
vsg-dev/VulkanSceneGraph#1290

The example can serve as:

  • A reference implementation of depth peeling in VSG
  • A starting point for further discussion and refinement towards a native solution
  • A basis for evaluating API design and integration strategies

Key aspects:

  • Multi-pass depth peeling pipeline
  • Use of VSG render graph, render passes, and framebuffers
  • Focus on correctness and integration feasibility rather than performance optimization

Usage:

The example can be built and run via the standard vsgExamples workflow.

Notes:

  • This is an experimental implementation and may evolve based on feedback and design discussions.
  • Feedback regarding integration into VSG core is highly appreciated.

@robertosfield robertosfield merged commit 4d3ef83 into vsg-dev:master Apr 17, 2026
@robertosfield
Copy link
Copy Markdown
Collaborator

Thanks for the example. I have now merged with vsgExamples master, turns out a bit premature as it broke the build on non Windows systems :-|

I have fixed the build error - was simply a capitalization issue with an include.

There are quite a few warnings that will need fixing too:

$ make
[ 25%] Building CXX object examples/oit/vsgdepthpeeling/CMakeFiles/vsgdepthpeeling.dir/depthpeeling/Bindings.cpp.o
[ 25%] Building CXX object examples/oit/vsgdepthpeeling/CMakeFiles/vsgdepthpeeling.dir/depthpeeling/Builder.cpp.o
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp: In member function ‘vsg::ref_ptr<vsg::ClearAttachments> vsg::oit::depthpeeling::Builder::createClearAttachments() const’:
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp:111:26: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
  111 |     attachments.push_back({ VK_IMAGE_ASPECT_COLOR_BIT, 0, {0.0f, 0.0f, 0.0f, 0.0f} });
      |     ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp:111:26: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp:111:26: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp:111:26: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp:111:26: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp:111:26: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp:112:26: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
  112 |     attachments.push_back({ VK_IMAGE_ASPECT_DEPTH_BIT, 0, {0.0f, 0} });
      |     ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp:112:26: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp:112:26: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp:112:26: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp:112:26: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Builder.cpp:112:26: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
[ 50%] Building CXX object examples/oit/vsgdepthpeeling/CMakeFiles/vsgdepthpeeling.dir/depthpeeling/PipelineConfigurator.cpp.o
[ 50%] Building CXX object examples/oit/vsgdepthpeeling/CMakeFiles/vsgdepthpeeling.dir/depthpeeling/RenderGraph.cpp.o
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.cpp: In constructor ‘vsg::oit::depthpeeling::RenderGraph::RenderGraph(vsg::ref_ptr<vsg::Window>, vsg::ref_ptr<vsg::View>)’:
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.cpp:39:42: warning: declaration of ‘window’ shadows a member of ‘vsg::oit::depthpeeling::RenderGraph’ [-Wshadow]
   39 | RenderGraph::RenderGraph(ref_ptr<Window> window, ref_ptr<View> view)
      |                          ~~~~~~~~~~~~~~~~^~~~~~
In file included from /home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.h:5,
                 from /home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.h:3,
                 from /home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.cpp:1:
/home/robert/install/include/vsg/app/RenderGraph.h:43:25: note: shadowed declaration is here
   43 |         ref_ptr<Window> window;
      |                         ^~~~~~
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.cpp: In constructor ‘vsg::oit::depthpeeling::RenderGraph::RenderGraph(vsg::ref_ptr<vsg::Window>, vsg::ref_ptr<vsg::View>)’:
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.cpp:39:42: warning: declaration of ‘window’ shadows a member of ‘vsg::oit::depthpeeling::RenderGraph’ [-Wshadow]
   39 | RenderGraph::RenderGraph(ref_ptr<Window> window, ref_ptr<View> view)
      |                          ~~~~~~~~~~~~~~~~^~~~~~
/home/robert/install/include/vsg/app/RenderGraph.h:43:25: note: shadowed declaration is here
   43 |         ref_ptr<Window> window;
      |                         ^~~~~~
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.cpp: In constructor ‘vsg::oit::depthpeeling::RenderGraph::RenderGraph(vsg::ref_ptr<vsg::Window>, vsg::ref_ptr<vsg::View>)’:
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/RenderGraph.cpp:39:42: warning: declaration of ‘window’ shadows a member of ‘vsg::oit::depthpeeling::RenderGraph’ [-Wshadow]
   39 | RenderGraph::RenderGraph(ref_ptr<Window> window, ref_ptr<View> view)
      |                          ~~~~~~~~~~~~~~~~^~~~~~
/home/robert/install/include/vsg/app/RenderGraph.h:43:25: note: shadowed declaration is here
   43 |         ref_ptr<Window> window;
      |                         ^~~~~~
[ 75%] Building CXX object examples/oit/vsgdepthpeeling/CMakeFiles/vsgdepthpeeling.dir/depthpeeling/Resources.cpp.o
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp: In member function ‘vsg::ref_ptr<vsg::RenderPass> vsg::oit::depthpeeling::Resources::createTransparencyPass(const CreateRenderPassInfo&)’:
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:72:76: warning: missing initializer for member ‘vsg::SubpassDescription::inputAttachments’ [-Wmissing-field-initializers]
   72 |         SubpassDescription renderSubpass{0, VK_PIPELINE_BIND_POINT_GRAPHICS};
      |                                                                            ^
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:72:76: warning: missing initializer for member ‘vsg::SubpassDescription::colorAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:72:76: warning: missing initializer for member ‘vsg::SubpassDescription::resolveAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:72:76: warning: missing initializer for member ‘vsg::SubpassDescription::depthStencilAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:72:76: warning: missing initializer for member ‘vsg::SubpassDescription::preserveAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:72:76: warning: missing initializer for member ‘vsg::SubpassDescription::depthStencilResolveAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:90:77: warning: missing initializer for member ‘vsg::SubpassDescription::inputAttachments’ [-Wmissing-field-initializers]
   90 |         SubpassDescription combineSubpass{0, VK_PIPELINE_BIND_POINT_GRAPHICS};
      |                                                                             ^
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:90:77: warning: missing initializer for member ‘vsg::SubpassDescription::colorAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:90:77: warning: missing initializer for member ‘vsg::SubpassDescription::resolveAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:90:77: warning: missing initializer for member ‘vsg::SubpassDescription::depthStencilAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:90:77: warning: missing initializer for member ‘vsg::SubpassDescription::preserveAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:90:77: warning: missing initializer for member ‘vsg::SubpassDescription::depthStencilResolveAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:106:73: warning: missing initializer for member ‘vsg::SubpassDescription::inputAttachments’ [-Wmissing-field-initializers]
  106 |     SubpassDescription combineSubpass{0, VK_PIPELINE_BIND_POINT_GRAPHICS};
      |                                                                         ^
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:106:73: warning: missing initializer for member ‘vsg::SubpassDescription::colorAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:106:73: warning: missing initializer for member ‘vsg::SubpassDescription::resolveAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:106:73: warning: missing initializer for member ‘vsg::SubpassDescription::depthStencilAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:106:73: warning: missing initializer for member ‘vsg::SubpassDescription::preserveAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:106:73: warning: missing initializer for member ‘vsg::SubpassDescription::depthStencilResolveAttachments’ [-Wmissing-field-initializers]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp: In static member function ‘static const vsg::RenderGraph::ClearValues& vsg::oit::depthpeeling::Resources::clearValues()’:
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
  267 |     };
      |     ^
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘VkClearColorValue’ [-Wmissing-braces]
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/depthpeeling/Resources.cpp:267:5: warning: missing braces around initializer for ‘float [4]’ [-Wmissing-braces]
[ 75%] Building CXX object examples/oit/vsgdepthpeeling/CMakeFiles/vsgdepthpeeling.dir/depthpeeling/ShaderSet.cpp.o
[100%] Building CXX object examples/oit/vsgdepthpeeling/CMakeFiles/vsgdepthpeeling.dir/vsgdepthpeeling.cpp.o
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/vsgdepthpeeling.cpp: In function ‘vsg::ref_ptr<vsg::Group> createScene(vsg::oit::depthpeeling::Builder&, vsg::ref_ptr<vsg::Data>, bool)’:
/home/robert/dev/vsgExamples/examples/oit/vsgdepthpeeling/vsgdepthpeeling.cpp:135:38: warning: missing braces around initializer for ‘std::__array_traits<vsg::t_vec4<float>, 5>::_Type’ {aka ‘vsg::t_vec4<float> [5]’} [-Wmissing-braces]
  135 |         vsg::vec4(0.0, 0.0, 1.0, 0.5)};
      |                                      ^
[100%] Linking CXX executable ../../../bin/vsgdepthpeeling
[100%] Built target vsgdepthpeeling

@robertosfield
Copy link
Copy Markdown
Collaborator

I have fixed the remaining warnings and have moved the example from examples/oit/vsgdepthpeeling into examples/app as a single example doesn't warrent it's own dedicated directory category.

@swp-ariaci swp-ariaci deleted the oit-depthpeeling branch April 17, 2026 13:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants