Skip to content

Order-independent Transparency Implementation in Unity with Per-Pixel Linked Lists

License

Apache-2.0, Unknown licenses found

Licenses found

Apache-2.0
LICENSE
Unknown
LICENSE.meta
Notifications You must be signed in to change notification settings

happy-turtle/oit-unity

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

94 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Order-independent Transparency in Unity

Comparison Animation2

Description

This is an implementation of order-independent transparency in Unity's render pipelines. Order-independent transparency allows blending transparent objects correctly according to their actual depth in the scene. This is a huge improvement compared to traditional blending of transparent objects in the realtime graphics pipeline. The implementation uses Per-Pixel Linked Lists, implemented with RWStructuredBuffers. These are features requiring Shader Model 5.0 with ComputeBuffers, see the Unity Manual for supported platforms. Further technical information and resources are listed in the references section.

Installation

You can easily install this package with the Unity Package Manager using the project's git url. You can look at Unity's guide for detailed instructions.

Usage

For every implementation, a sample scene is included and available for import with the Unity Package Manager. If in doubt, try to import the sample you want to use and start from there.

  1. Setup the rendering implementation for your chosen pipeline:

    • High-Definition Render Pipeline: Create a Custom Pass volume and add OitRenderPass to it.
    • Universal Render Pipeline: Add the renderer feature Order Independent Transparency Renderer to your Universal Renderer Asset.
    • Post-Processing Stack v2: Add the post-processing override Order Independent Transparency to a post-processing volume in your scene.
  2. Change the material of every object that shall be rendered with order-independent transparency. They have to be rendered with a shader writing to the buffer used by the order-independent transparency implementation. Sample shaders that you can use are included in this project: OrderIndependentTransparency/Unlit for all pipelines, OrderIndependentTransparency/Standard for the built-in pipeline, OrderIndependentTransparency/URP/Lit for the Universal Render Pipeline and OrderIndependentTransparency/HDRP/Lit for the High-Definition Render Pipeline.

  3. Run your scene.

Platforms tested (Unity 2022.3)

Platform Graphics Backend Render output
Windows DirectX 12
DirectX 11
Vulkan
OpenGLCore 🆗 (poor performance)
OpenGLES3 ❌ (editor crashes)
Linux Vulkan
OpenGLCore 🆗 (poor performance)
Mac Metal
OpenGLCore
iOS Metal
Android Vulkan
OpenGLES3 🆗 (render artifacts)
WebGPU - 🔮
WebGL -

Feedback and Contribution

  • This is an open project. If you are interested in this topic or want to improve something please discuss, contribute and feel at home! 🏠
  • Feel free to open a discussion or an issue if you have ideas and improvements in mind.
  • Pull requests are very welcome, see the issues section for open tasks that would improve this project.

References