Skip to content

A High Performance Compute Shader Based Mesh Pathtracer in Unity3d without RT Cores

License

Notifications You must be signed in to change notification settings

Pjbomb2/TrueTrace-Unity-Pathtracer

Repository files navigation

TrueTrace: A High Performance Compute Shader based Unity Pathtracer

A passion projects that has been going on for a while with the goal of bringing at least interactive path-tracing to everyone in unity, regardless of their hardware

Features:

  • High Performance Compute Shader based path tracing without RT cores
  • Compressed Wide Bounding Volume Hierarchy for High Performance Software RT(no RT Cores)
  • No specific GPU vendor needed(this will run on integrated graphics if you so wish it, aka no RTX cores needed)
  • Hardware RT Support for modern cards
  • Full Disney BSDF for materials
  • Full support for complex emissive meshes
  • Runtime transform, add, and removal of objects
  • Runtime modifiable materials
  • ASVGF for realtime denoising
  • OIDN for offline denoising
  • PBR Texture Support
  • Next Event Estimation with Multiple Importance Sampling
  • Spherical Gaussian Light Tree or the Light BVH for Next Event Estimation
  • Support for all default unity lights(Using Next Event Estimation)
  • Bloom, Depth of Field, AutoExposure, TAA, Tonemapping
  • Precomputed Multiple Atmospheric Scattering for the sky
  • Object Instancing(Without RT Cores)
  • ReSTIR GI(cursed implementation)
  • Simple upscaling ability
  • Supports Built-in, HDRP, and URP
  • Full skinned mesh support
  • Supports deformable standard meshes
  • Supports unity heightmap terrain and heightmap trees
  • Enironment Map Importance Sampling
  • Radiance Cache
  • Material Preset System
  • Efficient Panorama Rendering
  • IES for spotlights
  • True Bindless texturing(Thanks to Meetem)
  • Convolution Bloom(Not mine)
  • Vulkan and Metal support(Your mileage may vary)
  • Mesh slicing using SDFs(Does not modify meshes, for rendering cuts only, like cross-sections)
  • EON and vMF diffuse models

MASSIVE thanks to Alex Bakanov(AKA Meetem) for bringing bindless textures to unity!
Ylitie et al
ebruneton
Convolutional Bloom
Spherical Gaussian Light Tree
Light BVH(PBRT 4)
vMF Diffuse Model
EON Diffuse Model
URP Compatability script inspiration

If you like what I do and want to support me or this project, Please consider becoming a Github Sponsor or a Patron at patreon.com/Pjbomb2! This allows me to keep this free for everyone!

You can contact me easiest through my discord server(above) or my twitter with bugs, ideas, or thoughts on the project!

Adding new objects

Automatic methods

  • First, add your gameobjects as a child of the "Scene" gameobject created by TrueTrace.
  • Global setup: Press "Auto Assign Scripts" in the TrueTrace settings menu.
  • Local setup: Go to "Hierarchy Options" in the TrueTrace settings menu.
  • Drag the root gameobject that you added to the "Selective Auto Assign Scripts" section.
  • Click "Selective Auto Assign".

Manual method

  • First, add your gameobjects as a child of the "Scene" gameobject created by TrueTrace.
  • Each gameobject that contains a mesh needs the script "RayTracingObject" added to it.
  • For non-skinned meshes:
    • Add the script "ParentObject" to either:
      • Each gameobject that has a "RayTracingObject" script
      • OR
      • The Direct Parent gameobject of gameobjects that have a "RayTracingObject" script(Groups their meshes together, increasing performance)
  • For Skinned Meshes:
    • Any parent gameobject of the RayTracingObjects(will group together all Skinned Children)
  • For default unity lights, you just add the "RayTracingLight" script to each one

General Use/Notes

  • DX12 is recommended, as it enables use of OIDN, Bindless texturing, RT Cores, and slightly higher performance
  • The camera you want to render from, you attach the RenderHandler script to(if you have a camera tagged MainCamera, this will be done automatically)
  • The green/red rectangle shows when the acceleration structure is done building, and thus ready to render, red means that its not done, and green means its done building, a ding will sound when it completes if it takes longer than 15 seconds(Turn on Truetrace Settings -> Functionality Settings
  • Objects can be added and removed at will simply by toggling the associated GameObject with a ParentObject script on/off in the hierarchy(clicking on parent objects with complex objects for children will lag), but they will take time to appear as the acceleration structure needs to be rebuilt for them
  • Emissive meshes need to be have a non-zero emissive value when they are built or rebuilt to work with NEE, but after that can have their emissiveness changed at will
  • To set up PBR with the DEFAULT material, all textures go into their proper names, but Roughness goes into the Occlusion texture(This can be changed in the MaterialPairing menu)
  • If you are using blendshapes to change geometry of a skinned mesh, you may need to go to the import settings of it(in the inspector), turn off Legacy Blendshape Normals, and make sure all normals are imported, not calculated, otherwise the normals for blendshapes might be wrong
  • If you use HDRIs, or CubeMaps for the skybox, you need to format as the texture to a Texture2D in the inspector of the image, unity will convert it automatically, then put it in the slot in "Scene Settings" in the TrueTrace settings menu

Creating Panoramas

  • Attatch the "PanoramaDoer" script to the "Scene" gameobject in the hierarchy
  • Set your settings in the PanoramaDoer
  • Enter Play Mode like normal and click the "Create Panorama" button in TrueTrace Settings
  • The rest is automatic, from rendering, to stitching and will automatically exit play mode when finished
  • The final Panorama will be put in Assets -> Screenshots, and the intermediate slices are in Assets -> TempPanorama

Using Instancing

  • For use with HWRT, you need unity 6000.0.31f1 or LATER, otherwise this ONLY works with SWRT
  • Firstly, all objects that will be the source of instanced objects will need to go under the InstancedStorage and can be arranged as single dynamic objects(ParentObject + RayTracingObject script both go on the same gameobject as the mesh)
  • Then, to instance the objects, you just need GameObjects with the InstanceObject script attatched to them under the Scene GameObject, and then drag the desired object instance from the hierarchy to the Instance Parent slot in the InstanceObject script

Linking Shader Textures to TrueTrace

  • In the PathTracingSettings, click the tab called "Material Pair Options"
  • Drag any material that has the shader you want to pair into the material slot that appears
  • From here, you will see 4 buttons, click those to add the input type and connect it to the output tab. Do this with the default material for an example
  • Once this is done, click "Apply Material Links" and rebuild the BVH in the "Main Options" tab to update the objects in the scene

Functionality Settings Contents

  • Enable RT Cores - (DX12 Only, REQUIRES UNITY 2023 OR HIGHER)Enables Hardware RT for cards that support it.
  • Disable Bindless Textures - DX12 Only, Disables bindless texturing, and uses the atlas fallback(Limits resolution).
  • Use Old Light BVH Instead of Gaussian Tree - Disables the Gaussian Tree for higher performance but worse light sampling on metallics.
  • Use DX11 - Disables DX12 only toggles, but allows truetrace to run in DX11.
  • Enable OIDN - (DX12 Only) Adds the OIDN denoiser to the Denoiser list in "Main Options"
  • FULLY Disable Radiance Cache - Will free the memory usually used by the Radiance Cache
  • Enable Emissive Texture Aware Light BVH - Allows for smarter/better sampling of emissive meshes by considering their emissive masks/textures; Can use lots of RAM.
  • Use Light BVH - Toggles the use of EITHER the Light BVH or Gaussian Tree on/off; uses the RIS count of NEE if off. Turn off for maximum speed.
  • Quick Radcache Toggle - Toggles the radcache on/off. Useful for comparing to ground truth pathtracing.

Editor Window Guide

TrueTrace Options Description -

  • Build Aggregated BVH(Recommended to do any time you change objects in edit mode)- Allows you to pre-build objects BVH's before running so you dont have to wait every time you go into play mode for it to build.
  • Clear Parent Data - Clears the data stored in parent GameObjects, allowing you to actually click them without lagging
  • Take Screenshot - Takes a screenshot to the path under "Functionality Settings" in the TrueTrace options
  • Auto Assign Scripts - Assigns all required scripts to all objects under the Scene GameObject, best way to add objects
  • Remaining Objects - Objects still being processed
  • Max Bounces - Sets the maximum number of bounces a ray can achieve
  • Internal Resolution Ratio - Render scale in comparison to gameview size, turn to below 1 while in edit mode to decrease rendered resolution(to then be upscaled)
  • Atlas Size - Maximum size of the texture atlas used(All textures are packed into atlas's so I can send them to the GPU)
  • Use Russian Roulette - Highly recommended to leave this on, kills rays that may not contribute much early, and thus greatly increases performance
  • Enable Object Moving - Allows objects to be moved during play, and allows for added objects to spawn in when they are done building
  • Allow Image Accumulation - Allows the image to accumulate while the camera is not moving
  • Use Next Event Estimation - Enables shadow rays/NEE for direct light sampling
    • RIS Count - Number of RIS passes done for unity and mesh lights(for mesh lights, it only works if LBVH is off in "GlobalDefines.cginc")
  • Allow Mesh Skinning - Turns on the ability for skinned meshes to be animated or deformed with respect to their armeture
  • Denoiser - Allows you to switch between different denoisers
  • Allow Bloom - Turns on or off Bloom
  • Sharpness Filter - Contrast Adaptive Sharpening
  • Enable DoF - Turns on or off Depth of Field, and its associated settings
    • CTRL + Middle Mouse - Autofocuses to whatever object your mouse is hovering over in the game view
    • CTRL + Middle Mouse Scroll - Adjusts the Aperature Size
  • Enable Auto/Manual Exposure - Turns on or off Exposure adjustment
  • Use ReSTIR GI - Enables ReSTIR GI which is usually much higher quality(Works with Recur and SVGF denoisers)
    • Do Sample Connection Validation - Confirms that two samples are mutually visable and throws it away if they are not
    • Update Rate - How many pixels per frame get re-traced to ensure they are still valid paths(7 or 33 is a good number to aim for here at 1080p)
    • ]
    • Enable Temporal - Enables the Temporal pass of ReSTIR GI(allows samples to travel across time
    • Temporal M Cap - How long a sample may live for, lower means lighting updates faster(until 0 which is the opposite) but more noise(recommended either 0 or around 12, but can be played with)
    • Enable Spatial - Enables the Spatial pass of ReSTIR GI(Allows pixels to choose to use the neighboring pixels sample instead)
  • Enable TAA - Enables Temporal Antialiasing
  • Enable FXAA - Enables FXAA
  • Enable Tonemapping - Turns on tonemapping, and allows you to select a specific tonemapper
  • Upscaler(ONLY when "Interal Resolution Ratio" is NOT 1) - Allows selection from one of a few upscaling methods
  • Use Partial Rendering - Traces only 1 out of (X*X) rays, improving performance
  • Enable AntiFirefly - Enables RCRS filter for getting rid of those single bright pixels
    • Frames Before Anti-Firefly - Frames accumulated before triggering Anti-Firefly
    • Anti-Firefly Frame Interval - Anti-Firefly will run once every X frames, this is X
  • RR Ignores Primary Hit - Allows for an extra bounce basically, makes it so that dark objects arent noisier, but at the cost of performance
  • Atmospheric Scatter Samples - Lower this to 1 if you keep crashing on entering play mode(controls how many atmospheric samples are precomputed)
  • Current Samples - Shows how many samples have currently been accumulated

URP Setup

  • In the Universal Renderer Asset being used, change the Rendering Path to Deferred, and turn on "Native RenderPass"
  • If using Unity 6000 or above, you need to go to Project Settings -> Graphics -> (at the bottom)Turn on Compatability Mode
  • In the camera, turn on PostProcessing, and turn the Anti-Aliasing to TAA(This is the only way I have found to reliably force motion vector generation in URP for some reason...)
  • Finally, add the "URPTTInjectPass" script to an empty gameobject

IES System

  • Add the texture highlighted in the image below to the "IES Profile" slot in the raytracinglights component thats added to standard unity lights(directional, point, spot, etc. type lights)

Known Bugs:


  • Please report any you find to the discord or to me directly.

Huge thanks to these people for sponsoring me:

  • Thanks to:
    • Patreon:
      • Niko: $500
      • Duong: $5
      • MakIt3D: $5
      • Yanus: $5
      • Hanmen: $5
      • Andrew: $3
    • Github Sponsors:
      • Jhin: $5
      • Kevin: $5
      • Omid: $2
    • Kofi:
      • JiRo: $20

Sample Images(Taken from various stages of development)

Credits(will continue to expand when I have time)

Biggest thanks to Zuen(R.I.P. You will be missed) who helped me a huge amount with the new BVH and traversal, thanks to them I got to where I am now, and I am very thankful to them for their help and patience
https://github.com/jan-van-bergen

Scenes From:


Disney BSDF from: https://schuttejoe.github.io/post/disneybsdf/ Rectangle packer for faster atlas creation from here: https://github.com/ThomasMiz/RectpackSharp/tree/main/RectpackSharp GPU Texture Compression: https://github.com/aras-p/UnityGPUTexCompression OIDN Wrapper: https://github.com/guoxx/UnityDenoiserPlugin

This project uses: Crytek Sponza CC BY 3.0 © 2010 Frank Meinl, Crytek