Copy disabled (too large)
Download .txt
Showing preview only (10,471K chars total). Download the full file to get everything.
Repository: frostbone25/Unity-Baked-Volumetrics
Branch: main
Commit: dc0baa70e807
Files: 252
Total size: 106.9 MB
Directory structure:
gitextract_z7rokmvj/
├── .gitignore
├── BakedVolumetrics/
│ ├── .vsconfig
│ ├── Assets/
│ │ ├── BakedVolumetrics/
│ │ │ ├── Data.meta
│ │ │ ├── OfflineGeneration/
│ │ │ │ ├── Scripts/
│ │ │ │ │ ├── Editor/
│ │ │ │ │ │ ├── BakedVolumetricsTool.cs
│ │ │ │ │ │ └── BakedVolumetricsTool.cs.meta
│ │ │ │ │ ├── Editor.meta
│ │ │ │ │ ├── Enums/
│ │ │ │ │ │ ├── DensityType.cs
│ │ │ │ │ │ ├── DensityType.cs.meta
│ │ │ │ │ │ ├── EnvironmentMapResolution.cs
│ │ │ │ │ │ ├── EnvironmentMapResolution.cs.meta
│ │ │ │ │ │ ├── HDREncoding.cs
│ │ │ │ │ │ ├── HDREncoding.cs.meta
│ │ │ │ │ │ ├── LightAttenuationType.cs
│ │ │ │ │ │ ├── LightAttenuationType.cs.meta
│ │ │ │ │ │ ├── LightingSource.cs
│ │ │ │ │ │ ├── LightingSource.cs.meta
│ │ │ │ │ │ ├── RaymarchSamples.cs
│ │ │ │ │ │ ├── RaymarchSamples.cs.meta
│ │ │ │ │ │ ├── SceneVoxelizerType.cs
│ │ │ │ │ │ ├── SceneVoxelizerType.cs.meta
│ │ │ │ │ │ ├── VolumeBitDepth.cs
│ │ │ │ │ │ ├── VolumeBitDepth.cs.meta
│ │ │ │ │ │ ├── VoxelCalculation.cs
│ │ │ │ │ │ ├── VoxelCalculation.cs.meta
│ │ │ │ │ │ ├── VoxelPreviewAxis.cs
│ │ │ │ │ │ └── VoxelPreviewAxis.cs.meta
│ │ │ │ │ ├── Enums.meta
│ │ │ │ │ ├── MetaPassRenderingV1.cs
│ │ │ │ │ ├── MetaPassRenderingV1.cs.meta
│ │ │ │ │ ├── MetaPassRenderingV2.cs
│ │ │ │ │ ├── MetaPassRenderingV2.cs.meta
│ │ │ │ │ ├── NoiseLibrary.cs
│ │ │ │ │ ├── NoiseLibrary.cs.meta
│ │ │ │ │ ├── RenderTextureConverter.cs
│ │ │ │ │ ├── RenderTextureConverter.cs.meta
│ │ │ │ │ ├── RenderTextureSize.cs
│ │ │ │ │ ├── RenderTextureSize.cs.meta
│ │ │ │ │ ├── SampleLightprobe.cs
│ │ │ │ │ ├── SampleLightprobe.cs.meta
│ │ │ │ │ ├── SampleVoxelTracer.cs
│ │ │ │ │ ├── SampleVoxelTracer.cs.meta
│ │ │ │ │ ├── ShaderIDs.cs
│ │ │ │ │ ├── ShaderIDs.cs.meta
│ │ │ │ │ ├── Structs/
│ │ │ │ │ │ ├── MaterialMetaDataV1.cs
│ │ │ │ │ │ ├── MaterialMetaDataV1.cs.meta
│ │ │ │ │ │ ├── MaterialMetaDataV2.cs
│ │ │ │ │ │ ├── MaterialMetaDataV2.cs.meta
│ │ │ │ │ │ ├── ObjectMetaDataV1.cs
│ │ │ │ │ │ ├── ObjectMetaDataV1.cs.meta
│ │ │ │ │ │ ├── ObjectMetaDataV2.cs
│ │ │ │ │ │ ├── ObjectMetaDataV2.cs.meta
│ │ │ │ │ │ ├── VoxelLightArea.cs
│ │ │ │ │ │ ├── VoxelLightArea.cs.meta
│ │ │ │ │ │ ├── VoxelLightDirectional.cs
│ │ │ │ │ │ ├── VoxelLightDirectional.cs.meta
│ │ │ │ │ │ ├── VoxelLightPoint.cs
│ │ │ │ │ │ ├── VoxelLightPoint.cs.meta
│ │ │ │ │ │ ├── VoxelLightSpot.cs
│ │ │ │ │ │ └── VoxelLightSpot.cs.meta
│ │ │ │ │ ├── Structs.meta
│ │ │ │ │ ├── VolumeGenerator.cs
│ │ │ │ │ ├── VolumeGenerator.cs.meta
│ │ │ │ │ ├── VolumeGeneratorAssets.cs
│ │ │ │ │ ├── VolumeGeneratorAssets.cs.meta
│ │ │ │ │ ├── VolumeGeneratorEditor.cs
│ │ │ │ │ ├── VolumeGeneratorEditor.cs.meta
│ │ │ │ │ ├── VolumeGeneratorUtility.cs
│ │ │ │ │ └── VolumeGeneratorUtility.cs.meta
│ │ │ │ ├── Scripts.meta
│ │ │ │ ├── Shaders/
│ │ │ │ │ ├── Adjustments.compute
│ │ │ │ │ ├── Adjustments.compute.meta
│ │ │ │ │ ├── BitPackingHelper.cginc
│ │ │ │ │ ├── BitPackingHelper.cginc.meta
│ │ │ │ │ ├── CombineBuffers.compute
│ │ │ │ │ ├── CombineBuffers.compute.meta
│ │ │ │ │ ├── ComputeTextureSampling.cginc
│ │ │ │ │ ├── ComputeTextureSampling.cginc.meta
│ │ │ │ │ ├── DataPacking.compute
│ │ │ │ │ ├── DataPacking.compute.meta
│ │ │ │ │ ├── Density.compute
│ │ │ │ │ ├── Density.compute.meta
│ │ │ │ │ ├── Dilation.compute
│ │ │ │ │ ├── Dilation.compute.meta
│ │ │ │ │ ├── EncodingDecodingHDR.cginc
│ │ │ │ │ ├── EncodingDecodingHDR.cginc.meta
│ │ │ │ │ ├── EncodingDecodingNormal.cginc
│ │ │ │ │ ├── EncodingDecodingNormal.cginc.meta
│ │ │ │ │ ├── GaussianBlur3D.compute
│ │ │ │ │ ├── GaussianBlur3D.compute.meta
│ │ │ │ │ ├── HDRPacking.compute
│ │ │ │ │ ├── HDRPacking.compute.meta
│ │ │ │ │ ├── MetaPassPacking.cginc
│ │ │ │ │ ├── MetaPassPacking.cginc.meta
│ │ │ │ │ ├── Random.cginc
│ │ │ │ │ ├── Random.cginc.meta
│ │ │ │ │ ├── Sampling.cginc
│ │ │ │ │ ├── Sampling.cginc.meta
│ │ │ │ │ ├── SceneObjectShaderV1.shader
│ │ │ │ │ ├── SceneObjectShaderV1.shader.meta
│ │ │ │ │ ├── SceneObjectShaderV2.shader
│ │ │ │ │ ├── SceneObjectShaderV2.shader.meta
│ │ │ │ │ ├── UnityLights.cginc
│ │ │ │ │ ├── UnityLights.cginc.meta
│ │ │ │ │ ├── VoxelBounceSurfaceLight.compute
│ │ │ │ │ ├── VoxelBounceSurfaceLight.compute.meta
│ │ │ │ │ ├── VoxelBounceVolumetricLight.compute
│ │ │ │ │ ├── VoxelBounceVolumetricLight.compute.meta
│ │ │ │ │ ├── VoxelDirectSurfaceLight.compute
│ │ │ │ │ ├── VoxelDirectSurfaceLight.compute.meta
│ │ │ │ │ ├── VoxelDirectVolumetricLight.compute
│ │ │ │ │ ├── VoxelDirectVolumetricLight.compute.meta
│ │ │ │ │ ├── VoxelEnvironmentSurfaceLight.compute
│ │ │ │ │ ├── VoxelEnvironmentSurfaceLight.compute.meta
│ │ │ │ │ ├── VoxelEnvironmentVolumetricLight.compute
│ │ │ │ │ ├── VoxelEnvironmentVolumetricLight.compute.meta
│ │ │ │ │ ├── VoxelTracerUtilities.cginc
│ │ │ │ │ ├── VoxelTracerUtilities.cginc.meta
│ │ │ │ │ ├── VoxelizeScene.compute
│ │ │ │ │ └── VoxelizeScene.compute.meta
│ │ │ │ └── Shaders.meta
│ │ │ ├── OfflineGeneration.meta
│ │ │ ├── Runtime/
│ │ │ │ ├── Scripts/
│ │ │ │ │ ├── CameraDepth.cs
│ │ │ │ │ ├── CameraDepth.cs.meta
│ │ │ │ │ ├── PostProcessing/
│ │ │ │ │ │ ├── ComputeShaderParameter.cs
│ │ │ │ │ │ ├── ComputeShaderParameter.cs.meta
│ │ │ │ │ │ ├── ShaderIDs.cs
│ │ │ │ │ │ ├── ShaderIDs.cs.meta
│ │ │ │ │ │ ├── V1/
│ │ │ │ │ │ │ ├── BakedVolumetricsV1.cs
│ │ │ │ │ │ │ ├── BakedVolumetricsV1.cs.meta
│ │ │ │ │ │ │ ├── BakedVolumetricsV1Renderer.cs
│ │ │ │ │ │ │ └── BakedVolumetricsV1Renderer.cs.meta
│ │ │ │ │ │ ├── V1.meta
│ │ │ │ │ │ ├── V2/
│ │ │ │ │ │ │ ├── BakedVolumetricsV2.cs
│ │ │ │ │ │ │ ├── BakedVolumetricsV2.cs.meta
│ │ │ │ │ │ │ ├── BakedVolumetricsV2Renderer.cs
│ │ │ │ │ │ │ └── BakedVolumetricsV2Renderer.cs.meta
│ │ │ │ │ │ ├── V2.meta
│ │ │ │ │ │ ├── V3/
│ │ │ │ │ │ │ ├── BakedVolumetricsV3.cs
│ │ │ │ │ │ │ ├── BakedVolumetricsV3.cs.meta
│ │ │ │ │ │ │ ├── BakedVolumetricsV3Renderer.cs
│ │ │ │ │ │ │ ├── BakedVolumetricsV3Renderer.cs.meta
│ │ │ │ │ │ │ ├── BakedVolumetricsV3SingleVolume.cs
│ │ │ │ │ │ │ ├── BakedVolumetricsV3SingleVolume.cs.meta
│ │ │ │ │ │ │ ├── BakedVolumetricsV3VolumeArrayParameter.cs
│ │ │ │ │ │ │ └── BakedVolumetricsV3VolumeArrayParameter.cs.meta
│ │ │ │ │ │ ├── V3.meta
│ │ │ │ │ │ ├── V4/
│ │ │ │ │ │ │ ├── BakedVolumetricsV4.cs
│ │ │ │ │ │ │ ├── BakedVolumetricsV4.cs.meta
│ │ │ │ │ │ │ ├── BakedVolumetricsV4Renderer.cs
│ │ │ │ │ │ │ └── BakedVolumetricsV4Renderer.cs.meta
│ │ │ │ │ │ └── V4.meta
│ │ │ │ │ └── PostProcessing.meta
│ │ │ │ ├── Scripts.meta
│ │ │ │ ├── Shaders/
│ │ │ │ │ ├── PostV1/
│ │ │ │ │ │ ├── BakedVolumetricsV1.shader
│ │ │ │ │ │ └── BakedVolumetricsV1.shader.meta
│ │ │ │ │ ├── PostV1.meta
│ │ │ │ │ ├── PostV2/
│ │ │ │ │ │ ├── BakedVolumetricsV2.shader
│ │ │ │ │ │ └── BakedVolumetricsV2.shader.meta
│ │ │ │ │ ├── PostV2.meta
│ │ │ │ │ ├── PostV3/
│ │ │ │ │ │ ├── BakedVolumetricsV3.shader
│ │ │ │ │ │ └── BakedVolumetricsV3.shader.meta
│ │ │ │ │ ├── PostV3.meta
│ │ │ │ │ ├── PostV4.meta
│ │ │ │ │ ├── PostV5.meta
│ │ │ │ │ ├── Scene/
│ │ │ │ │ │ ├── FogRealtimeExperiment.shader
│ │ │ │ │ │ ├── FogRealtimeExperiment.shader.meta
│ │ │ │ │ │ ├── QuadIntrinsics.cginc
│ │ │ │ │ │ ├── QuadIntrinsics.cginc.meta
│ │ │ │ │ │ ├── SceneVolumetricFog.shader
│ │ │ │ │ │ ├── SceneVolumetricFog.shader.meta
│ │ │ │ │ │ ├── SceneVolumetricFog_LPPV.shader
│ │ │ │ │ │ ├── SceneVolumetricFog_LPPV.shader.meta
│ │ │ │ │ │ ├── ShaderNotes.txt
│ │ │ │ │ │ └── ShaderNotes.txt.meta
│ │ │ │ │ └── Scene.meta
│ │ │ │ └── Shaders.meta
│ │ │ └── Runtime.meta
│ │ ├── BakedVolumetrics.meta
│ │ ├── CubemapFog.meta
│ │ ├── CustomBloom.meta
│ │ ├── Editor.meta
│ │ ├── ProductionSky.meta
│ │ ├── RPG_FPS_game_assets_industrial.meta
│ │ ├── Scenes/
│ │ │ ├── VolumetricsScene/
│ │ │ │ ├── LightingData.asset
│ │ │ │ ├── LightingData.asset.meta
│ │ │ │ ├── Lightmap-0_comp_light.exr
│ │ │ │ ├── Lightmap-0_comp_light.exr.meta
│ │ │ │ ├── Lightmap-1_comp_light.exr
│ │ │ │ ├── Lightmap-1_comp_light.exr.meta
│ │ │ │ ├── Lightmap-2_comp_light.exr
│ │ │ │ ├── Lightmap-2_comp_light.exr.meta
│ │ │ │ ├── Lightmap-3_comp_light.exr
│ │ │ │ ├── Lightmap-3_comp_light.exr.meta
│ │ │ │ ├── Lightmap-4_comp_light.exr
│ │ │ │ ├── Lightmap-4_comp_light.exr.meta
│ │ │ │ ├── Lightmap-5_comp_light.exr
│ │ │ │ ├── Lightmap-5_comp_light.exr.meta
│ │ │ │ ├── ReflectionProbe-0.exr
│ │ │ │ ├── ReflectionProbe-0.exr.meta
│ │ │ │ ├── VolumetricsScene_LightProbePlacement.asset
│ │ │ │ └── VolumetricsScene_LightProbePlacement.asset.meta
│ │ │ ├── VolumetricsScene.giparams
│ │ │ ├── VolumetricsScene.giparams.meta
│ │ │ ├── VolumetricsScene.lighting
│ │ │ ├── VolumetricsScene.lighting.meta
│ │ │ ├── VolumetricsScene.meta
│ │ │ ├── VolumetricsScene.unity
│ │ │ ├── VolumetricsScene.unity.meta
│ │ │ ├── VolumetricsScene_Profiles/
│ │ │ │ ├── Post-process Volume Profile.asset
│ │ │ │ └── Post-process Volume Profile.asset.meta
│ │ │ └── VolumetricsScene_Profiles.meta
│ │ ├── Scenes.meta
│ │ ├── Shaders/
│ │ │ ├── ProBuilderDiffuse.mat
│ │ │ ├── ProBuilderDiffuse.mat.meta
│ │ │ ├── ProBuilderStandard.mat
│ │ │ ├── ProBuilderStandard.mat.meta
│ │ │ ├── SimpleLightmapDiffuse.shader
│ │ │ └── SimpleLightmapDiffuse.shader.meta
│ │ ├── Shaders.meta
│ │ ├── XR.meta
│ │ └── XRI.meta
│ ├── Packages/
│ │ ├── manifest.json
│ │ └── packages-lock.json
│ ├── ProjectSettings/
│ │ ├── AudioManager.asset
│ │ ├── BurstAotSettings_Android.json
│ │ ├── ClusterInputManager.asset
│ │ ├── CommonBurstAotSettings.json
│ │ ├── DynamicsManager.asset
│ │ ├── EditorBuildSettings.asset
│ │ ├── EditorSettings.asset
│ │ ├── GraphicsSettings.asset
│ │ ├── InputManager.asset
│ │ ├── NavMeshAreas.asset
│ │ ├── PackageManagerSettings.asset
│ │ ├── Packages/
│ │ │ └── com.unity.probuilder/
│ │ │ └── Settings.json
│ │ ├── Physics2DSettings.asset
│ │ ├── PresetManager.asset
│ │ ├── ProjectSettings.asset
│ │ ├── ProjectVersion.txt
│ │ ├── QualitySettings.asset
│ │ ├── SceneTemplateSettings.json
│ │ ├── TagManager.asset
│ │ ├── TimeManager.asset
│ │ ├── TimelineSettings.asset
│ │ ├── UnityConnectSettings.asset
│ │ ├── VFXManager.asset
│ │ ├── VersionControlSettings.asset
│ │ ├── XRPackageSettings.asset
│ │ └── XRSettings.asset
│ └── UserSettings/
│ └── EditorUserSettings.asset
├── LICENSE
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# This .gitignore file should be placed at the root of your Unity project directory
#
# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore
#
BakedVolumetrics/[Ll]ibrary/
BakedVolumetrics/[Tt]emp/
BakedVolumetrics/[Oo]bj/
BakedVolumetrics/[Bb]uild/
BakedVolumetrics/[Bb]uilds/
BakedVolumetrics/BuildTest/
BakedVolumetrics/Exported/
BakedVolumetrics/[Ll]ogs/
BakedVolumetrics/[Mm]emoryCaptures/
BakedVolumetrics/Assets/CubemapFog.meta
BakedVolumetrics/Assets/CubemapFog/
BakedVolumetrics/Assets/CustomBloom/
BakedVolumetrics/Assets/CustomBloom.meta
BakedVolumetrics/Assets/Editor/
BakedVolumetrics/Assets/ProductionSky/
BakedVolumetrics/Assets/ProductionSky.meta
BakedVolumetrics/Assets/RPG_FPS_game_assets_industrial/
BakedVolumetrics/Assets/RPG_FPS_game_assets_industrial.meta
BakedVolumetrics/Assets/SkyPrecomputed/
BakedVolumetrics/Assets/SkyPrecomputed.meta
BakedVolumetrics/Assets/XR/
BakedVolumetrics/Assets/XR.meta
BakedVolumetrics/Assets/XRI/
BakedVolumetrics/Assets/XRI.meta
BakedVolumetrics/Assets/BakedVolumetrics/Data/Map_v1/
BakedVolumetrics/Assets/BakedVolumetrics/Data/Map_v1.meta
BakedVolumetrics/Assets/BakedVolumetrics/Data
BakedVolumetrics/Assets/BakedVolumetrics/Data/
BakedVolumetrics/AndroidBuilds
AndroidBuilds
# Asset meta data should only be ignored when the corresponding asset is also ignored
!BakedVolumetrics/[Aa]ssets/**/*.meta
# Uncomment this line if you wish to ignore the asset store tools plugin
# /[Aa]ssets/AssetStoreTools*
# Autogenerated Jetbrains Rider plugin
BakedVolumetrics/[Aa]ssets/Plugins/Editor/JetBrains*
# Visual Studio cache directory
.vs/
# Gradle cache directory
.gradle/
# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
*.mdb
*.opendb
*.VC.db
# Unity3D generated meta files
*.pidb.meta
*.pdb.meta
*.mdb.meta
# Unity3D generated file on crash reports
sysinfo.txt
# Builds
*.apk
*.unitypackage
# Crashlytics generated file
crashlytics-build.properties
================================================
FILE: BakedVolumetrics/.vsconfig
================================================
{
"version": "1.0",
"components": [
"Microsoft.VisualStudio.Workload.ManagedGame"
]
}
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Data.meta
================================================
fileFormatVersion: 2
guid: 2493f939ee61ce942a7836eeea8a000a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Editor/BakedVolumetricsTool.cs
================================================
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
namespace BakedVolumetrics
{
public class BakedVolumetricsTool : EditorWindow
{
private static string sceneCollidersParentName = "TEMP_SceneStaticColliders";
private GameObject sceneCollidersParent;
//GUI related
private static int guiSectionSpacePixels = 10;
private Vector2Int windowSize = new Vector2Int(500, 500);
//add a menu item at the top of the unity editor toolbar
[MenuItem("Baked Volumetrics/Setup")]
public static void ShowWindow()
{
//get the window and open it
GetWindow(typeof(BakedVolumetricsTool));
}
/// <summary>
/// GUI display function for the window
/// </summary>
void OnGUI()
{
maxSize = windowSize;
minSize = windowSize;
//window title
GUILayout.Label("Baked Volumetrics", EditorStyles.whiteLargeLabel);
GUILayout.Space(guiSectionSpacePixels);
GUILayout.Label("Main", EditorStyles.label);
if (GUILayout.Button("Create Volume"))
CreateVolume();
GUILayout.Space(guiSectionSpacePixels);
}
public void CreateVolume()
{
GameObject newVolumeGameObject = new GameObject("NewBakedVolume");
//VolumeGenerator newVolumeScript = newVolumeGameObject.AddComponent<VolumeGenerator>();
//newVolumeScript.Setup();
//newVolumeScript.SetupSceneObjectVolume();
}
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Editor/BakedVolumetricsTool.cs.meta
================================================
fileFormatVersion: 2
guid: 3baed212f309edc449d41a77e3f203a2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Editor.meta
================================================
fileFormatVersion: 2
guid: 652cacc7ea4499748bc9b87c5f693928
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/DensityType.cs
================================================
#if UNITY_EDITOR
namespace BakedVolumetricsOffline
{
public enum DensityType
{
Constant,
Luminance,
HeightBased,
HeightBasedLuminance
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/DensityType.cs.meta
================================================
fileFormatVersion: 2
guid: e4d479c8ee192d44b80e56962677f8fc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/EnvironmentMapResolution.cs
================================================
#if UNITY_EDITOR
namespace BakedVolumetrics
{
public enum EnvironmentMapResolution
{
_32 = 32,
_64 = 64,
_128 = 128,
_256 = 256,
_512 = 512,
_1024 = 1024,
_2048 = 2048,
_4096 = 4096,
_8192 = 8192,
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/EnvironmentMapResolution.cs.meta
================================================
fileFormatVersion: 2
guid: d86d25fdd5383f44294af89bc9ff927c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/HDREncoding.cs
================================================
#if UNITY_EDITOR
namespace BakedVolumetricsOffline
{
public enum HDREncoding
{
RGBM,
RGBD,
RGBE,
LOG_LUV_32
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/HDREncoding.cs.meta
================================================
fileFormatVersion: 2
guid: 88f58f012cdc552458b80c1b26d61fa2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/LightAttenuationType.cs
================================================
#if UNITY_EDITOR
namespace BakedVolumetricsOffline
{
public enum LightAttenuationType
{
UnityFalloff,
InverseSquareFalloff,
LinearFalloff
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/LightAttenuationType.cs.meta
================================================
fileFormatVersion: 2
guid: c98a680c57a1ca949afd0e186c48b3f1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/LightingSource.cs
================================================
#if UNITY_EDITOR
namespace BakedVolumetricsOffline
{
public enum LightingSource
{
LightProbes,
LightProbeProxyVolume,
VoxelTracer,
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/LightingSource.cs.meta
================================================
fileFormatVersion: 2
guid: 0eb8ff02c96ecbc43820aa7802066a2c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/RaymarchSamples.cs
================================================
#if UNITY_EDITOR
namespace BakedVolumetricsOffline
{
public enum RaymarchSamples
{
_8,
_16,
_24,
_32,
_48,
_64,
_128
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/RaymarchSamples.cs.meta
================================================
fileFormatVersion: 2
guid: 6b2fec1a70de2b341be2b6e5f2a117eb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/SceneVoxelizerType.cs
================================================
#if UNITY_EDITOR
namespace BakedVolumetricsOffline
{
public enum SceneVoxelizerType
{
MetaExtraction3Pass, //Meta Pass Renderer V1
MetaExtraction1Pass, //Meta Pass Renderer V1
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/SceneVoxelizerType.cs.meta
================================================
fileFormatVersion: 2
guid: 294a1a616c5b47142abad2dd622cd902
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VolumeBitDepth.cs
================================================
#if UNITY_EDITOR
namespace BakedVolumetricsOffline
{
public enum VolumeBitDepth
{
RGB8,
RGBA8,
RGBA16,
RGBA32
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VolumeBitDepth.cs.meta
================================================
fileFormatVersion: 2
guid: 496c832b60017054b82b981d8aa7b43f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VoxelCalculation.cs
================================================
#if UNITY_EDITOR
namespace BakedVolumetricsOffline
{
public enum VoxelCalculation
{
Custom,
Automatic
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VoxelCalculation.cs.meta
================================================
fileFormatVersion: 2
guid: 84f1a27c6f1798748a92f5d8046e0637
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VoxelPreviewAxis.cs
================================================
#if UNITY_EDITOR
namespace BakedVolumetricsOffline
{
public enum VoxelPreviewAxis
{
X,
Y,
Z
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VoxelPreviewAxis.cs.meta
================================================
fileFormatVersion: 2
guid: bed3395e3eb23cd4d95f79536c82faad
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums.meta
================================================
fileFormatVersion: 2
guid: 226031ea146f3fa4589331a567affa0f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/MetaPassRenderingV1.cs
================================================
#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
namespace BakedVolumetricsOffline
{
public class MetaPassRenderingV1
{
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - META PASS PROPERTIES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - META PASS PROPERTIES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - META PASS PROPERTIES ||||||||||||||||||||||||||||||||||||||||||
//this controls how many "pixels" per unit an object will have.
//this is for "meta" textures representing the different buffers of an object (albedo, normal, emissive)
//LARGER VALUES: more pixels allocated | better quality/accuracy | more memory usage (bigger meta textures for objects)
//SMALLER VALUES: less pixels allocated | worse quality/accuracy | less memory usage (smaller meta textures for objects)
public float texelDensityPerUnit = 1;
//minimum resolution for meta textures captured from objects in the scene (so objects too small will be capped to this value resolution wise)
//LARGER VALUES: more pixels allocated at minimum for object meta textures | better quality/accuracy | more memory usage (bigger meta textures for objects)
//SMALLER VALUES: less pixels allocated at minimum for object meta textures | worse quality/accuracy | less memory usage (smaller meta textures for objects)
public int minimumBufferResolution = 16;
//this controls whether or not pixel dilation will be performed for each meta texture buffer.
//this is done for "meta" tetures representing diferent buffers of an object (albedo, normal, emissive)
//this is highly recomended because meta textures will be low resolution inherently, and without it the textures won't fit perfectly into the UV space due to pixlation.
//as a result you will get black outlines on the borders of the UV atlases which will pollute the results of each buffer
//ENABLED: this will perform dilation on meta textures | slightly slower voxelization
//DISABLED: this will NOT do dilation on meta textures | slightly faster voxelization
public bool performDilation = true;
//max dilation size for the dilation radius, the higher it is the broader the dilation filter will cover.
//LARGER VALUES: larger dilation radius | better dilation quality/accuracy
//SMALLER VALUES: smaller dilation radius | worse dilation quality/accuracy
public int dilationPixelSize = 128;
//this controls whether bilinear filtering is used for the final generated meta textures.
//this can soften details/sharpness for textures but this could also potentially help with artifacting.
//ENABLED: This will enable bilinear filtering on meta textures
//DISABLED: This will enable bilinear filtering on meta textures
public bool useBilinearFiltering = false;
//this determines whether or not geometry in the scene can be seen from both sides.
//this is on by default because its good at thickening geometry in the scene and reducing holes/cracks.
//ENABLED: scene is voxelized with geometry visible on all sides with no culling.
//DISABLED: scene is voxelized with geometry visible only on the front face, back faces are culled and invisible.
public bool doubleSidedGeometry = true;
public bool emissionHalfPrecision = true;
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - OPTIMIZATIONS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - OPTIMIZATIONS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - OPTIMIZATIONS ||||||||||||||||||||||||||||||||||||||||||
//this will only use mesh renderers that are marked "Contribute Global Illumination".
//ENABLED: this will only use meshes in the scene marked for GI | faster voxelization | less memory usage (less objects needing meta textures)
//DISABLED: every mesh renderer in the scene will be used | slower voxelization | more memory usage (more objects needing meta textures)
public bool onlyUseGIContributors = true;
//this will only use mesh renderers that have shadow casting enabled.
//ENABLED: this will only use meshes in the scene marked for GI | faster voxelization | less memory usage (less objects needing meta textures)
//DISABLED: every mesh renderer in the scene will be used | slower voxelization | more memory usage (more objects needing meta textures)
public bool onlyUseShadowCasters = true;
//only use meshes that are within voxelization bounds
//ENABLED: only objects within voxelization bounds will be used | faster voxelization | less memory usage (less objects needing meta textures)
//DISABLED: all objects in the scene will be used for voxelization | slower voxelization | more memory usage (more objects needing meta textures)
public bool onlyUseMeshesWithinBounds = true;
//use the bounding boxes on meshes during "voxelization" to render only what is visible
//ENABLED: renders objects only visible in each voxel slice | much faster voxelization
//DISABLED: renders all objects | much slower voxelization |
public bool useBoundingBoxCullingForRendering = true;
//only use objects that match the layer mask requirements
public LayerMask objectLayerMask = 1;
//(IF onlyUseMeshesWithinBounds IS ENABLED) this defines the bounds that scene objects have to be to extract meta info.
public Bounds sceneObjectsBounds;
//|||||||||||||||||||||||||||||||||||||||||| PRIVATE VARIABLES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PRIVATE VARIABLES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PRIVATE VARIABLES ||||||||||||||||||||||||||||||||||||||||||
//Size of the thread groups for compute shaders.
//These values should match the #define ones in the compute shaders.
private static int THREAD_GROUP_SIZE_X = 8;
private static int THREAD_GROUP_SIZE_Y = 8;
private static RenderTextureFormat metaAlbedoFormat = RenderTextureFormat.ARGB32;
private RenderTextureFormat metaEmissiveFormat => emissionHalfPrecision ? RenderTextureFormat.ARGBHalf : RenderTextureFormat.ARGBFloat;
private static RenderTextureFormat metaNormalFormat = RenderTextureFormat.ARGB32;
private FilterMode metaTextureFilterMode => useBilinearFiltering ? FilterMode.Bilinear : FilterMode.Point;
private Material sceneObjectMaterial;
private MaterialPropertyBlock sceneObjectMaterialPropertyBlock;
private RenderTextureConverter renderTextureConverter;
private VolumeGeneratorAssets volumeGeneratorAssets;
//|||||||||||||||||||||||||||||||||||||| SETUP ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| SETUP ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| SETUP ||||||||||||||||||||||||||||||||||||||
public MetaPassRenderingV1(VolumeGeneratorAssets volumeGeneratorAssets)
{
this.volumeGeneratorAssets = volumeGeneratorAssets;
sceneObjectMaterial = new Material(volumeGeneratorAssets.metaPassObjectShaderV1);
sceneObjectMaterialPropertyBlock = new MaterialPropertyBlock();
renderTextureConverter = new RenderTextureConverter();
}
//|||||||||||||||||||||||||||||||||||||| META PASS BUILDING ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| META PASS BUILDING ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| META PASS BUILDING ||||||||||||||||||||||||||||||||||||||
public List<ObjectMetaDataV1> ExtractSceneObjectMetaBuffers()
{
//|||||||||||||||||||||||||||||||||||||| GATHER RENDERER HASH CODES TO EXCLUDE ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| GATHER RENDERER HASH CODES TO EXCLUDE ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| GATHER RENDERER HASH CODES TO EXCLUDE ||||||||||||||||||||||||||||||||||||||
//If LODS exist in the scene, we will first gather them up so we can create a list of renderers to exclude later.
//We do this so that way later we only render the first LOD0 meshes.
//If we don't then we end up rendering all of the meshes that are apart of an LOD group, and that will not only slow things down, but skew results.
//So we want to keep things clean and only render the first LOD level.
//Fetch all LOD groups in the scene
LODGroup[] lodGroups = MonoBehaviour.FindObjectsOfType<LODGroup>();
//Intalize a dynamic int array that will contain a list of hash codes for renderers that are used after LOD0
List<int> renderersAfterLOD0_HashCodes = new List<int>();
//iterate through each LOD group in the scene
for (int i = 0; i < lodGroups.Length; i++)
{
//compile a list of hash codes for renderers that we find after LOD0
int[] hashCodes = GetRendererHashCodesAfterLOD0(lodGroups[i]);
//if the current LOD group has no levels past LOD0 then we are done here.
if (hashCodes == null)
continue; //skip to the next iteration in the loop
//accumulate hash codes into our dynamic list.
for (int j = 0; j < hashCodes.Length; j++)
renderersAfterLOD0_HashCodes.Add(hashCodes[j]);
}
//|||||||||||||||||||||||||||||||||||||| CREATE ALBEDO/EMISSION BUFFERS FOR EACH MESH ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| CREATE ALBEDO/EMISSION BUFFERS FOR EACH MESH ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| CREATE ALBEDO/EMISSION BUFFERS FOR EACH MESH ||||||||||||||||||||||||||||||||||||||
//fetch all mesh renderers in the scene.
MeshRenderer[] meshRenderers = MonoBehaviour.FindObjectsOfType<MeshRenderer>();
//initalize a dynamic array of object meta data that will be filled up.
List<ObjectMetaDataV1> objectsMetaData = new List<ObjectMetaDataV1>();
//Property values used in the "META" pass in unity shaders.
//The "META" pass is used during lightmapping to extract albedo/emission colors from materials in a scene.
//Which is exactly what we need!
MaterialPropertyBlock materialPropertyBlockMeta = new MaterialPropertyBlock();
materialPropertyBlockMeta.SetVector(ShaderIDs.unity_MetaVertexControl, new Vector4(1, 0, 0, 0)); //Only Lightmap UVs
materialPropertyBlockMeta.SetFloat(ShaderIDs.unity_OneOverOutputBoost, 1.0f);
materialPropertyBlockMeta.SetFloat(ShaderIDs.unity_MaxOutputValue, 0.97f);
materialPropertyBlockMeta.SetInt(ShaderIDs.unity_UseLinearSpace, QualitySettings.activeColorSpace == ColorSpace.Linear ? 1 : 0);
materialPropertyBlockMeta.SetVector(ShaderIDs.unity_LightmapST, new Vector4(1, 1, 0, 0)); //Cancel out lightmapping scale/offset values if its already lightmapped.
//Create a projection matrix, mapped to UV space [0,1]
Matrix4x4 uvProjection = GL.GetGPUProjectionMatrix(Matrix4x4.Ortho(0, 1, 1, 0, -50, 50), true);
//fetch our dilation function kernel in the compute shader
int ComputeShader_Dilation = volumeGeneratorAssets.dilate.FindKernel("ComputeShader_Dilation");
//set the amount of dilation steps it will take
volumeGeneratorAssets.dilate.SetInt(ShaderIDs.KernelSize, dilationPixelSize);
//iterate through each mesh renderer in the scene
for (int i = 0; i < meshRenderers.Length; i++)
{
//current mesh renderer element
MeshRenderer meshRenderer = meshRenderers[i];
//get the hash code
int meshRendererHashCode = meshRenderer.GetHashCode();
//Compare the hash code of the current mesh renderer we have against the compiled list of hash codes we made earlier.
//So if the current mesh renderer we have is actually apart of an LOD group, AND is not apart of an LOD0 level then skip it.
//We only want to use renderers apart of the LOD0 level.
if (renderersAfterLOD0_HashCodes.Contains(meshRendererHashCode))
continue; //skip to the next iteration in the loop.
//get the mesh filter component so we can grab the actual mesh for drawing later.
MeshFilter meshFilter = meshRenderer.GetComponent<MeshFilter>();
//conditional boolean that will determine if we use the mesh or not.
bool includeMesh = true;
//(IF ENABLED) If we only want to include meshes that contribute to GI, saving us some additional computation
if (onlyUseGIContributors)
includeMesh = includeMesh && GameObjectUtility.GetStaticEditorFlags(meshRenderer.gameObject).HasFlag(StaticEditorFlags.ContributeGI);
//(IF ENABLED) If we only want to include meshes that do shadowcasting, saving us from more computation
if (onlyUseShadowCasters)
includeMesh = includeMesh && (meshRenderer.shadowCastingMode == ShadowCastingMode.On || meshRenderer.shadowCastingMode == ShadowCastingMode.TwoSided);
//(IF ENABLED) Only include meshes within voxelization bounds, saving us hopefully from additional computation
if (onlyUseMeshesWithinBounds)
includeMesh = includeMesh && VolumeGeneratorUtility.ContainBounds(sceneObjectsBounds, meshRenderer.bounds);
bool isMeshLayerValid = objectLayerMask == (objectLayerMask | (1 << meshFilter.gameObject.layer));
//compute texel density for each mesh renderer
int objectTextureResolutionSquare = (int)(meshRenderer.bounds.size.magnitude * texelDensityPerUnit);
//if it ends up being too low resolution just use the minimum resolution.
objectTextureResolutionSquare = Math.Max(minimumBufferResolution, objectTextureResolutionSquare);
//If there is a mesh filter, and we can include the mesh then lets get started!
if (meshFilter != null && includeMesh && isMeshLayerValid)
{
//get the mesh and it's materials
Mesh mesh = meshFilter.sharedMesh;
Material[] materials = meshRenderer.sharedMaterials;
//lets create our object meta data now so we can store some of this data later.
ObjectMetaDataV1 objectMetaData = new ObjectMetaDataV1()
{
mesh = mesh,
bounds = meshRenderer.bounds,
transformMatrix = meshRenderer.transform.localToWorldMatrix,
materials = new MaterialMetaDataV1[materials.Length]
};
//Create a command buffer so we can render the albedo/emissive buffers of each object.
using (CommandBuffer metaDataCommandBuffer = new CommandBuffer())
{
//setup projection
metaDataCommandBuffer.SetViewProjectionMatrices(Matrix4x4.identity, uvProjection);
metaDataCommandBuffer.SetViewport(new Rect(0, 0, objectTextureResolutionSquare, objectTextureResolutionSquare));
metaDataCommandBuffer.ClearRenderTarget(true, true, Color.clear); //IMPORTANT: clear contents before we render a new frame
//iterate through each material the mesh renderer has
for (int j = 0; j < materials.Length; j++)
{
//create a custom material meta data, this will eventually store the object albedo/emissive buffers... if it can get them
MaterialMetaDataV1 materialMetaData = new MaterialMetaDataV1();
//get the current material
Material material = materials[j];
//find the pass index on the material so we can render it.
//if it doesn't exist it will return -1 which means the material doesn't have one... and we will just have to leave materialMetaData empty.
int metaPassIndex = material.FindPass("Meta");
int submeshIndex = j; //In unity, submeshes are linked to materials. If a mesh has 2 materials, then there are 2 submeshes. So the submesh index should match the material index.
//The meta pass is used in the "Validate Albedo" scene draw mode... which we don't want so make sure its disabled.
material.DisableKeyword("EDITOR_VISUALIZATION");
//if the pass exists...
if (metaPassIndex != -1)
{
//|||||||||||||||||||||||||||||||||||||| ALBEDO BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| ALBEDO BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| ALBEDO BUFFER ||||||||||||||||||||||||||||||||||||||
//here we will render the albedo buffer of the object.
//the unity meta pass basically unwraps the UV1 (Lightmap UVs) to the screen.
//create our albedo render texture buffer
materialMetaData.albedoBuffer = new RenderTexture(objectTextureResolutionSquare, objectTextureResolutionSquare, 32, metaAlbedoFormat);
materialMetaData.albedoBuffer.filterMode = metaTextureFilterMode;
materialMetaData.albedoBuffer.wrapMode = TextureWrapMode.Clamp;
materialMetaData.albedoBuffer.enableRandomWrite = true; //important
materialMetaData.albedoBuffer.Create();
//put our render texture to use.
metaDataCommandBuffer.SetRenderTarget(materialMetaData.albedoBuffer);
//show only the albedo colors in the meta pass.
materialPropertyBlockMeta.SetVector(ShaderIDs.unity_MetaFragmentControl, new Vector4(1, 0, 0, 0)); //Show Albedo
//queue a draw mesh command, only rendering the meta pass on our material.
metaDataCommandBuffer.DrawMesh(mesh, Matrix4x4.identity, material, submeshIndex, metaPassIndex, materialPropertyBlockMeta);
//actually renders our albedo buffer to the render target.
Graphics.ExecuteCommandBuffer(metaDataCommandBuffer);
//|||||||||||||||||||||||||||||||||||||| DILATE ALBEDO BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| DILATE ALBEDO BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| DILATE ALBEDO BUFFER ||||||||||||||||||||||||||||||||||||||
//Now before we use the albedo buffer... we have to do additional processing on it before its even usable.
//Even if the resolution was crazy high we would get black outlines on the edges of the lightmap UVs which can mess up our albedo results later.
//So we will run a dilation filter, which will basically copy pixels around to mitigate those black outlines.
if(performDilation)
{
//reuse the same buffer, the compute shader will modify the values of this render target.
volumeGeneratorAssets.dilate.SetTexture(ComputeShader_Dilation, ShaderIDs.Write, materialMetaData.albedoBuffer);
//let the GPU perform dilation
volumeGeneratorAssets.dilate.Dispatch(ComputeShader_Dilation, Mathf.CeilToInt(objectTextureResolutionSquare / THREAD_GROUP_SIZE_X), Mathf.CeilToInt(objectTextureResolutionSquare / THREAD_GROUP_SIZE_Y), 1);
}
//|||||||||||||||||||||||||||||||||||||| EMISSIVE BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| EMISSIVE BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| EMISSIVE BUFFER ||||||||||||||||||||||||||||||||||||||
//here we will render the emissive buffer of the object.
//the unity meta pass basically unwraps the UV1 (Lightmap UVs) to the screen.
//create our emissive render texture buffer
materialMetaData.emissiveBuffer = new RenderTexture(objectTextureResolutionSquare, objectTextureResolutionSquare, 32, metaEmissiveFormat);
materialMetaData.emissiveBuffer.filterMode = metaTextureFilterMode;
materialMetaData.emissiveBuffer.wrapMode = TextureWrapMode.Clamp;
materialMetaData.emissiveBuffer.enableRandomWrite = true;
materialMetaData.emissiveBuffer.Create();
//put our render texture to use.
metaDataCommandBuffer.SetRenderTarget(materialMetaData.emissiveBuffer);
//show only the emissive colors in the meta pass.
materialPropertyBlockMeta.SetVector(ShaderIDs.unity_MetaFragmentControl, new Vector4(0, 1, 0, 0)); //Show Emission
//queue a draw mesh command, only rendering the meta pass on our material.
metaDataCommandBuffer.DrawMesh(mesh, Matrix4x4.identity, material, submeshIndex, metaPassIndex, materialPropertyBlockMeta);
//actually renders our emissive buffer to the render target.
Graphics.ExecuteCommandBuffer(metaDataCommandBuffer);
//|||||||||||||||||||||||||||||||||||||| DILATE EMISSIVE BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| DILATE EMISSIVE BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| DILATE EMISSIVE BUFFER ||||||||||||||||||||||||||||||||||||||
//Now before we use the emissive buffer... we have to do additional processing on it before its even usable.
//Even if the resolution was crazy high we would get black outlines on the edges of the lightmap UVs which can mess up our emissive results later.
//So we will run a dilation filter, which will basically copy pixels around to mitigate those black outlines.
if (performDilation)
{
//reuse the same buffer, the compute shader will modify the values of this render target.
volumeGeneratorAssets.dilate.SetTexture(ComputeShader_Dilation, ShaderIDs.Write, materialMetaData.emissiveBuffer);
//let the GPU perform dilation
volumeGeneratorAssets.dilate.Dispatch(ComputeShader_Dilation, Mathf.CeilToInt(objectTextureResolutionSquare / THREAD_GROUP_SIZE_X), Mathf.CeilToInt(objectTextureResolutionSquare / THREAD_GROUP_SIZE_Y), 1);
}
}
//after rendering both the albedo/emissive lets store the results into our object meta data for the current material that we rendered.
//NOTE: its also possible here that there wasn't a meta pass so that means 'materialMetaData' is empty.
objectMetaData.materials[j] = materialMetaData;
}
}
//collect the extracted meta data from the current mesh so we can render it later.
objectsMetaData.Add(objectMetaData);
}
}
//|||||||||||||||||||||||||||||||||||||| (DEBUG) LOG META DATA MEMORY USAGE ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| (DEBUG) LOG META DATA MEMORY USAGE ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| (DEBUG) LOG META DATA MEMORY USAGE ||||||||||||||||||||||||||||||||||||||
long memorySize = 0;
uint textures = 0;
for (int i = 0; i < objectsMetaData.Count; i++)
{
memorySize += objectsMetaData[i].GetDebugMemorySize();
textures += (uint)(objectsMetaData[i].materials.Length * 2);
}
Debug.Log(string.Format("Meta Textures {0} | Total Runtime Memory: {1} MB [{2} B]", textures, Mathf.RoundToInt(memorySize / (1024.0f * 1024.0f)), memorySize));
return objectsMetaData;
}
public void CleanUpSceneObjectMetaBuffers(List<ObjectMetaDataV1> objectsMetaData)
{
for (int i = 0; i < objectsMetaData.Count; i++)
objectsMetaData[i].CleanUp();
}
//|||||||||||||||||||||||||||||||||||||| SCENE RENDERING ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| SCENE RENDERING ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| SCENE RENDERING ||||||||||||||||||||||||||||||||||||||
public void RenderScene(List<ObjectMetaDataV1> sceneObjectMetaData, Camera camera, RenderTexture renderTexture, int renderPassIndex)
{
double timeBeforeFunction = Time.realtimeSinceStartupAsDouble;
//|||||||||||||||||||||||||||||||||||||| RENDER SCENE BUFFERS ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| RENDER SCENE BUFFERS ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| RENDER SCENE BUFFERS ||||||||||||||||||||||||||||||||||||||
//get camera frustum planes
Plane[] cameraFrustumPlanes = GeometryUtility.CalculateFrustumPlanes(camera);
using (CommandBuffer sceneCommandBuffer = new CommandBuffer())
{
//calculate the view matrix of the camera that we are using to render the scene with.
Matrix4x4 lookMatrix = Matrix4x4.LookAt(camera.transform.position, camera.transform.position + camera.transform.forward, camera.transform.up);
Matrix4x4 scaleMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(1, 1, -1));
Matrix4x4 viewMatrix = scaleMatrix * lookMatrix.inverse;
//make the render target active, and setup projection
sceneCommandBuffer.SetRenderTarget(renderTexture);
sceneCommandBuffer.SetViewProjectionMatrices(viewMatrix, camera.projectionMatrix);
sceneCommandBuffer.SetViewport(new Rect(0, 0, renderTexture.width, renderTexture.height));
sceneCommandBuffer.ClearRenderTarget(true, true, Color.clear); //IMPORTANT: clear contents before we render a new frame
//iterate through each object we collected
for (int i = 0; i < sceneObjectMetaData.Count; i++)
{
ObjectMetaDataV1 objectMetaData = sceneObjectMetaData[i];
//(IF ENABLED) calculate camera frustum culling during this instance of rendering
if (useBoundingBoxCullingForRendering)
{
//test the extracted object bounds against the planes, if the object is NOT within the camera frustum planes...
if (!GeometryUtility.TestPlanesAABB(cameraFrustumPlanes, objectMetaData.bounds))
continue; //then continue to the next object to render, no reason to keep fucking around with it because we won't see it
}
//if our object has materials
if (objectMetaData.materials != null)
{
//iterate through each material on the object
for (int j = 0; j < objectMetaData.materials.Length; j++)
{
//get the meta data we collected earlier of the material
MaterialMetaDataV1 materialMetaData = objectMetaData.materials[j];
//make sure it isn't empty
if (materialMetaData.isEmpty() == false)
{
int submeshIndex = j; //In unity, submeshes are linked to materials. If a mesh has 2 materials, then there are 2 submeshes. So the submesh index should match the material index.
//feed it our albedo buffer
switch (renderPassIndex)
{
case 0:
sceneObjectMaterialPropertyBlock.SetTexture(ShaderIDs._MainTex, materialMetaData.albedoBuffer);
sceneObjectMaterialPropertyBlock.SetInt("_ShowNormalsOnly", 0);
break;
case 1:
sceneObjectMaterialPropertyBlock.SetTexture(ShaderIDs._MainTex, materialMetaData.emissiveBuffer);
sceneObjectMaterialPropertyBlock.SetInt("_ShowNormalsOnly", 0);
break;
case 2:
sceneObjectMaterialPropertyBlock.SetTexture(ShaderIDs._MainTex, materialMetaData.albedoBuffer);
sceneObjectMaterialPropertyBlock.SetInt("_ShowNormalsOnly", 1);
break;
}
//configure face culling
sceneObjectMaterial.SetInt("_CullMode", doubleSidedGeometry ? (int)CullMode.Off : (int)CullMode.Back);
//draw the mesh in the scene, rendering only its raw albedo colors.
sceneCommandBuffer.DrawMesh(objectMetaData.mesh, objectMetaData.transformMatrix, sceneObjectMaterial, submeshIndex, 0, sceneObjectMaterialPropertyBlock);
}
}
}
}
//actually renders the scene.
Graphics.ExecuteCommandBuffer(sceneCommandBuffer);
}
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||| LOD FUNCTIONS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||| LOD FUNCTIONS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||| LOD FUNCTIONS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/// <summary>
/// Gets an array of renderer objects after LOD0 on an LODGroup.
/// </summary>
/// <param name="lodGroup"></param>
/// <returns></returns>
public static Renderer[] GetRenderersAfterLOD0(LODGroup lodGroup)
{
//get LODGroup lods
LOD[] lods = lodGroup.GetLODs();
//If there are no LODs...
//Or there is only one LOD level...
//Ignore this LODGroup and return nothing (we only want the renderers that are used for the other LOD groups)
if (lods.Length < 2)
return null;
//Initalize a dynamic array list of renderers that will be filled
List<Renderer> renderers = new List<Renderer>();
//Skip the first LOD level...
//And iterate through the rest of the LOD groups to get it's renderers
for (int i = 1; i < lods.Length; i++)
{
for (int j = 0; j < lods[i].renderers.Length; j++)
{
Renderer lodRenderer = lods[i].renderers[j];
if (lodRenderer != null)
renderers.Add(lodRenderer);
}
}
//If no renderers were found, then return nothing.
if (renderers.Count <= 0)
return null;
return renderers.ToArray();
}
/// <summary>
/// Returns a list of hashes for the given renderer array.
/// </summary>
/// <param name="renderers"></param>
/// <returns></returns>
public static int[] GetRendererHashCodes(Renderer[] renderers)
{
int[] hashCodeArray = new int[renderers.Length];
for (int i = 0; i < hashCodeArray.Length; i++)
hashCodeArray[i] = renderers[i].GetHashCode();
return hashCodeArray;
}
/// <summary>
/// Returns a hash code array of renderers found after LOD0 in a given LOD group.
/// </summary>
/// <param name="lodGroup"></param>
/// <returns></returns>
public static int[] GetRendererHashCodesAfterLOD0(LODGroup lodGroup)
{
Renderer[] renderers = GetRenderersAfterLOD0(lodGroup);
if (renderers == null || renderers.Length <= 1)
return null;
else
return GetRendererHashCodes(renderers);
}
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/MetaPassRenderingV1.cs.meta
================================================
fileFormatVersion: 2
guid: e61e4bdc66f5967479499e3df5024d3b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/MetaPassRenderingV2.cs
================================================
#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
namespace BakedVolumetricsOffline
{
public class MetaPassRenderingV2
{
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - META PASS PROPERTIES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - META PASS PROPERTIES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - META PASS PROPERTIES ||||||||||||||||||||||||||||||||||||||||||
//this controls how many "pixels" per unit an object will have.
//this is for "meta" textures representing the different buffers of an object (albedo, normal, emissive)
//LARGER VALUES: more pixels allocated | better quality/accuracy | more memory usage (bigger meta textures for objects)
//SMALLER VALUES: less pixels allocated | worse quality/accuracy | less memory usage (smaller meta textures for objects)
public float texelDensityPerUnit = 1;
//minimum resolution for meta textures captured from objects in the scene (so objects too small will be capped to this value resolution wise)
//LARGER VALUES: more pixels allocated at minimum for object meta textures | better quality/accuracy | more memory usage (bigger meta textures for objects)
//SMALLER VALUES: less pixels allocated at minimum for object meta textures | worse quality/accuracy | less memory usage (smaller meta textures for objects)
public int minimumBufferResolution = 16;
//this controls whether or not pixel dilation will be performed for each meta texture buffer.
//this is done for "meta" tetures representing diferent buffers of an object (albedo, normal, emissive)
//this is highly recomended because meta textures will be low resolution inherently, and without it the textures won't fit perfectly into the UV space due to pixlation.
//as a result you will get black outlines on the borders of the UV atlases which will pollute the results of each buffer
//ENABLED: this will perform dilation on meta textures | slightly slower voxelization
//DISABLED: this will NOT do dilation on meta textures | slightly faster voxelization
public bool performDilation = true;
//max dilation size for the dilation radius, the higher it is the broader the dilation filter will cover.
//LARGER VALUES: larger dilation radius | better dilation quality/accuracy
//SMALLER VALUES: smaller dilation radius | worse dilation quality/accuracy
public int dilationPixelSize = 128;
//this determines whether or not geometry in the scene can be seen from both sides.
//this is on by default because its good at thickening geometry in the scene and reducing holes/cracks.
//ENABLED: scene is voxelized with geometry visible on all sides with no culling.
//DISABLED: scene is voxelized with geometry visible only on the front face, back faces are culled and invisible.
public bool doubleSidedGeometry = true;
public HDREncoding emissionHDREncoding = HDREncoding.RGBM;
public float emissionHDREncodingRange = 6.0f;
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - OPTIMIZATIONS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - OPTIMIZATIONS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - OPTIMIZATIONS ||||||||||||||||||||||||||||||||||||||||||
//this will only use mesh renderers that are marked "Contribute Global Illumination".
//ENABLED: this will only use meshes in the scene marked for GI | faster voxelization | less memory usage (less objects needing meta textures)
//DISABLED: every mesh renderer in the scene will be used | slower voxelization | more memory usage (more objects needing meta textures)
public bool onlyUseGIContributors = true;
//this will only use mesh renderers that have shadow casting enabled.
//ENABLED: this will only use meshes in the scene marked for GI | faster voxelization | less memory usage (less objects needing meta textures)
//DISABLED: every mesh renderer in the scene will be used | slower voxelization | more memory usage (more objects needing meta textures)
public bool onlyUseShadowCasters = true;
//only use meshes that are within voxelization bounds
//ENABLED: only objects within voxelization bounds will be used | faster voxelization | less memory usage (less objects needing meta textures)
//DISABLED: all objects in the scene will be used for voxelization | slower voxelization | more memory usage (more objects needing meta textures)
public bool onlyUseMeshesWithinBounds = true;
//use the bounding boxes on meshes during "voxelization" to render only what is visible
//ENABLED: renders objects only visible in each voxel slice | much faster voxelization
//DISABLED: renders all objects | much slower voxelization |
public bool useBoundingBoxCullingForRendering = true;
//only use objects that match the layer mask requirements
public LayerMask objectLayerMask = 1;
//(IF onlyUseMeshesWithinBounds IS ENABLED) this defines the bounds that scene objects have to be to extract meta info.
public Bounds sceneObjectsBounds;
//|||||||||||||||||||||||||||||||||||||||||| PRIVATE VARIABLES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PRIVATE VARIABLES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PRIVATE VARIABLES ||||||||||||||||||||||||||||||||||||||||||
//Size of the thread groups for compute shaders.
//These values should match the #define ones in the compute shaders.
private static int THREAD_GROUP_SIZE_X = 8;
private static int THREAD_GROUP_SIZE_Y = 8;
private Material sceneObjectMaterial;
private MaterialPropertyBlock sceneObjectMaterialPropertyBlock;
private RenderTextureConverter renderTextureConverter;
private VolumeGeneratorAssets volumeGeneratorAssets;
//|||||||||||||||||||||||||||||||||||||| SETUP ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| SETUP ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| SETUP ||||||||||||||||||||||||||||||||||||||
public MetaPassRenderingV2(VolumeGeneratorAssets volumeGeneratorAssets)
{
this.volumeGeneratorAssets = volumeGeneratorAssets;
sceneObjectMaterial = new Material(volumeGeneratorAssets.metaPassObjectShaderV2);
sceneObjectMaterialPropertyBlock = new MaterialPropertyBlock();
renderTextureConverter = new RenderTextureConverter();
}
//|||||||||||||||||||||||||||||||||||||| META PASS BUILDING ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| META PASS BUILDING ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| META PASS BUILDING ||||||||||||||||||||||||||||||||||||||
public List<ObjectMetaDataV2> ExtractSceneObjectMetaBuffers()
{
//|||||||||||||||||||||||||||||||||||||| GATHER RENDERER HASH CODES TO EXCLUDE ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| GATHER RENDERER HASH CODES TO EXCLUDE ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| GATHER RENDERER HASH CODES TO EXCLUDE ||||||||||||||||||||||||||||||||||||||
//If LODS exist in the scene, we will first gather them up so we can create a list of renderers to exclude later.
//We do this so that way later we only render the first LOD0 meshes.
//If we don't then we end up rendering all of the meshes that are apart of an LOD group, and that will not only slow things down, but skew results.
//So we want to keep things clean and only render the first LOD level.
//Fetch all LOD groups in the scene
LODGroup[] lodGroups = MonoBehaviour.FindObjectsOfType<LODGroup>();
//Intalize a dynamic int array that will contain a list of hash codes for renderers that are used after LOD0
List<int> renderersAfterLOD0_HashCodes = new List<int>();
//iterate through each LOD group in the scene
for (int i = 0; i < lodGroups.Length; i++)
{
//compile a list of hash codes for renderers that we find after LOD0
int[] hashCodes = GetRendererHashCodesAfterLOD0(lodGroups[i]);
//if the current LOD group has no levels past LOD0 then we are done here.
if (hashCodes == null)
continue; //skip to the next iteration in the loop
//accumulate hash codes into our dynamic list.
for (int j = 0; j < hashCodes.Length; j++)
renderersAfterLOD0_HashCodes.Add(hashCodes[j]);
}
//|||||||||||||||||||||||||||||||||||||| CREATE ALBEDO/EMISSION BUFFERS FOR EACH MESH ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| CREATE ALBEDO/EMISSION BUFFERS FOR EACH MESH ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| CREATE ALBEDO/EMISSION BUFFERS FOR EACH MESH ||||||||||||||||||||||||||||||||||||||
//fetch all mesh renderers in the scene.
MeshRenderer[] meshRenderers = MonoBehaviour.FindObjectsOfType<MeshRenderer>();
//initalize a dynamic array of object meta data that will be filled up.
List<ObjectMetaDataV2> objectsMetaData = new List<ObjectMetaDataV2>();
//Property values used in the "META" pass in unity shaders.
//The "META" pass is used during lightmapping to extract albedo/emission colors from materials in a scene.
//Which is exactly what we need!
MaterialPropertyBlock materialPropertyBlockMeta = new MaterialPropertyBlock();
materialPropertyBlockMeta.SetVector(ShaderIDs.unity_MetaVertexControl, new Vector4(1, 0, 0, 0)); //Only Lightmap UVs
materialPropertyBlockMeta.SetFloat(ShaderIDs.unity_OneOverOutputBoost, 1.0f);
materialPropertyBlockMeta.SetFloat(ShaderIDs.unity_MaxOutputValue, 0.97f);
materialPropertyBlockMeta.SetInt(ShaderIDs.unity_UseLinearSpace, QualitySettings.activeColorSpace == ColorSpace.Linear ? 1 : 0);
materialPropertyBlockMeta.SetVector(ShaderIDs.unity_LightmapST, new Vector4(1, 1, 0, 0)); //Cancel out lightmapping scale/offset values if its already lightmapped.
//Create a projection matrix, mapped to UV space [0,1]
Matrix4x4 uvProjection = GL.GetGPUProjectionMatrix(Matrix4x4.Ortho(0, 1, 1, 0, -50, 50), true);
//fetch our dilation function kernel in the compute shader
int ComputeShader_Dilation = volumeGeneratorAssets.dilate.FindKernel("ComputeShader_Dilation");
int ComputeShader_DataPacking64 = volumeGeneratorAssets.dataPacking.FindKernel("ComputeShader_DataPacking64");
//set the amount of dilation steps it will take
volumeGeneratorAssets.dilate.SetInt(ShaderIDs.KernelSize, dilationPixelSize);
//set encoding type for emission
SetHDREncodingKeywords(volumeGeneratorAssets.dataPacking, emissionHDREncoding);
SetHDREncodingKeywords(sceneObjectMaterial, emissionHDREncoding);
volumeGeneratorAssets.dataPacking.SetFloat("_RGBMRange", emissionHDREncodingRange);
volumeGeneratorAssets.dataPacking.SetFloat("_RGBDRange", emissionHDREncodingRange);
sceneObjectMaterial.SetFloat("_RGBMRange", emissionHDREncodingRange);
sceneObjectMaterial.SetFloat("_RGBDRange", emissionHDREncodingRange);
//iterate through each mesh renderer in the scene
for (int i = 0; i < meshRenderers.Length; i++)
{
//current mesh renderer element
MeshRenderer meshRenderer = meshRenderers[i];
//get the hash code
int meshRendererHashCode = meshRenderer.GetHashCode();
//Compare the hash code of the current mesh renderer we have against the compiled list of hash codes we made earlier.
//So if the current mesh renderer we have is actually apart of an LOD group, AND is not apart of an LOD0 level then skip it.
//We only want to use renderers apart of the LOD0 level.
if (renderersAfterLOD0_HashCodes.Contains(meshRendererHashCode))
continue; //skip to the next iteration in the loop.
//get the mesh filter component so we can grab the actual mesh for drawing later.
MeshFilter meshFilter = meshRenderer.GetComponent<MeshFilter>();
//conditional boolean that will determine if we use the mesh or not.
bool includeMesh = true;
//(IF ENABLED) If we only want to include meshes that contribute to GI, saving us some additional computation
if (onlyUseGIContributors)
includeMesh = includeMesh && GameObjectUtility.GetStaticEditorFlags(meshRenderer.gameObject).HasFlag(StaticEditorFlags.ContributeGI);
//(IF ENABLED) If we only want to include meshes that do shadowcasting, saving us from more computation
if (onlyUseShadowCasters)
includeMesh = includeMesh && (meshRenderer.shadowCastingMode == ShadowCastingMode.On || meshRenderer.shadowCastingMode == ShadowCastingMode.TwoSided);
//(IF ENABLED) Only include meshes within voxelization bounds, saving us hopefully from additional computation
if (onlyUseMeshesWithinBounds)
includeMesh = includeMesh && VolumeGeneratorUtility.ContainBounds(sceneObjectsBounds, meshRenderer.bounds);
bool isMeshLayerValid = objectLayerMask == (objectLayerMask | (1 << meshFilter.gameObject.layer));
//compute texel density for each mesh renderer
int objectTextureResolutionSquare = (int)(meshRenderer.bounds.size.magnitude * texelDensityPerUnit);
//if it ends up being too low resolution just use the minimum resolution.
objectTextureResolutionSquare = Math.Max(minimumBufferResolution, objectTextureResolutionSquare);
//If there is a mesh filter, and we can include the mesh then lets get started!
if (meshFilter != null && includeMesh && isMeshLayerValid)
{
//get the mesh and it's materials
Mesh mesh = meshFilter.sharedMesh;
Material[] materials = meshRenderer.sharedMaterials;
//lets create our object meta data now so we can store some of this data later.
ObjectMetaDataV2 objectMetaData = new ObjectMetaDataV2()
{
mesh = mesh,
bounds = meshRenderer.bounds,
transformMatrix = meshRenderer.transform.localToWorldMatrix,
materials = new MaterialMetaDataV2[materials.Length]
};
//Create a command buffer so we can render the albedo/emissive buffers of each object.
using (CommandBuffer metaDataCommandBuffer = new CommandBuffer())
{
//setup projection
metaDataCommandBuffer.SetViewProjectionMatrices(Matrix4x4.identity, uvProjection);
metaDataCommandBuffer.SetViewport(new Rect(0, 0, objectTextureResolutionSquare, objectTextureResolutionSquare));
metaDataCommandBuffer.ClearRenderTarget(true, true, Color.clear); //IMPORTANT: clear contents before we render a new frame
//iterate through each material the mesh renderer has
for (int j = 0; j < materials.Length; j++)
{
//create a custom material meta data, this will eventually store the object albedo/emissive buffers... if it can get them
MaterialMetaDataV2 materialMetaData = new MaterialMetaDataV2();
//get the current material
Material material = materials[j];
//find the pass index on the material so we can render it.
//if it doesn't exist it will return -1 which means the material doesn't have one... and we will just have to leave materialMetaData empty.
int metaPassIndex = material.FindPass("Meta");
int submeshIndex = j; //In unity, submeshes are linked to materials. If a mesh has 2 materials, then there are 2 submeshes. So the submesh index should match the material index.
//The meta pass is used in the "Validate Albedo" scene draw mode... which we don't want so make sure its disabled.
material.DisableKeyword("EDITOR_VISUALIZATION");
//if the pass exists...
if (metaPassIndex != -1)
{
//|||||||||||||||||||||||||||||||||||||| ALBEDO BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| ALBEDO BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| ALBEDO BUFFER ||||||||||||||||||||||||||||||||||||||
//here we will render the albedo buffer of the object.
//the unity meta pass basically unwraps the UV1 (Lightmap UVs) to the screen.
//create our albedo render texture buffer
RenderTexture albedoBuffer = new RenderTexture(objectTextureResolutionSquare, objectTextureResolutionSquare, 32, RenderTextureFormat.ARGB32);
albedoBuffer.filterMode = FilterMode.Point;
albedoBuffer.wrapMode = TextureWrapMode.Clamp;
albedoBuffer.enableRandomWrite = true; //important
albedoBuffer.Create();
//put our render texture to use.
metaDataCommandBuffer.SetRenderTarget(albedoBuffer);
//show only the albedo colors in the meta pass.
materialPropertyBlockMeta.SetVector(ShaderIDs.unity_MetaFragmentControl, new Vector4(1, 0, 0, 0)); //Show Albedo
//queue a draw mesh command, only rendering the meta pass on our material.
metaDataCommandBuffer.DrawMesh(mesh, Matrix4x4.identity, material, submeshIndex, metaPassIndex, materialPropertyBlockMeta);
//actually renders our albedo buffer to the render target.
Graphics.ExecuteCommandBuffer(metaDataCommandBuffer);
//|||||||||||||||||||||||||||||||||||||| DILATE ALBEDO BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| DILATE ALBEDO BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| DILATE ALBEDO BUFFER ||||||||||||||||||||||||||||||||||||||
//Now before we use the albedo buffer... we have to do additional processing on it before its even usable.
//Even if the resolution was crazy high we would get black outlines on the edges of the lightmap UVs which can mess up our albedo results later.
//So we will run a dilation filter, which will basically copy pixels around to mitigate those black outlines.
if (performDilation)
{
//reuse the same buffer, the compute shader will modify the values of this render target.
volumeGeneratorAssets.dilate.SetTexture(ComputeShader_Dilation, ShaderIDs.Write, albedoBuffer);
//let the GPU perform dilation
volumeGeneratorAssets.dilate.Dispatch(ComputeShader_Dilation, Mathf.CeilToInt(objectTextureResolutionSquare / THREAD_GROUP_SIZE_X), Mathf.CeilToInt(objectTextureResolutionSquare / THREAD_GROUP_SIZE_Y), 1);
}
//|||||||||||||||||||||||||||||||||||||| EMISSIVE BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| EMISSIVE BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| EMISSIVE BUFFER ||||||||||||||||||||||||||||||||||||||
//here we will render the emissive buffer of the object.
//the unity meta pass basically unwraps the UV1 (Lightmap UVs) to the screen.
//create our emissive render texture buffer
RenderTexture emissiveBuffer = new RenderTexture(objectTextureResolutionSquare, objectTextureResolutionSquare, 32, RenderTextureFormat.ARGBHalf);
emissiveBuffer.filterMode = FilterMode.Point;
emissiveBuffer.wrapMode = TextureWrapMode.Clamp;
emissiveBuffer.enableRandomWrite = true;
emissiveBuffer.Create();
//put our render texture to use.
metaDataCommandBuffer.SetRenderTarget(emissiveBuffer);
//show only the emissive colors in the meta pass.
materialPropertyBlockMeta.SetVector(ShaderIDs.unity_MetaFragmentControl, new Vector4(0, 1, 0, 0)); //Show Emission
//queue a draw mesh command, only rendering the meta pass on our material.
metaDataCommandBuffer.DrawMesh(mesh, Matrix4x4.identity, material, submeshIndex, metaPassIndex, materialPropertyBlockMeta);
//actually renders our emissive buffer to the render target.
Graphics.ExecuteCommandBuffer(metaDataCommandBuffer);
//|||||||||||||||||||||||||||||||||||||| DILATE EMISSIVE BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| DILATE EMISSIVE BUFFER ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| DILATE EMISSIVE BUFFER ||||||||||||||||||||||||||||||||||||||
//Now before we use the emissive buffer... we have to do additional processing on it before its even usable.
//Even if the resolution was crazy high we would get black outlines on the edges of the lightmap UVs which can mess up our emissive results later.
//So we will run a dilation filter, which will basically copy pixels around to mitigate those black outlines.
if (performDilation)
{
//reuse the same buffer, the compute shader will modify the values of this render target.
volumeGeneratorAssets.dilate.SetTexture(ComputeShader_Dilation, ShaderIDs.Write, emissiveBuffer);
//let the GPU perform dilation
volumeGeneratorAssets.dilate.Dispatch(ComputeShader_Dilation, Mathf.CeilToInt(objectTextureResolutionSquare / THREAD_GROUP_SIZE_X), Mathf.CeilToInt(objectTextureResolutionSquare / THREAD_GROUP_SIZE_Y), 1);
}
//|||||||||||||||||||||||||||||||||||||| PACK BUFFERS ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| PACK BUFFERS ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| PACK BUFFERS ||||||||||||||||||||||||||||||||||||||
materialMetaData.packedMetaBuffer = new RenderTexture(objectTextureResolutionSquare, objectTextureResolutionSquare, 32, RenderTextureFormat.ARGB64);
materialMetaData.packedMetaBuffer.wrapMode = TextureWrapMode.Clamp;
materialMetaData.packedMetaBuffer.filterMode = FilterMode.Point;
materialMetaData.packedMetaBuffer.enableRandomWrite = true;
materialMetaData.packedMetaBuffer.Create();
volumeGeneratorAssets.dataPacking.SetTexture(ComputeShader_DataPacking64, ShaderIDs.AlbedoBuffer, albedoBuffer);
volumeGeneratorAssets.dataPacking.SetTexture(ComputeShader_DataPacking64, ShaderIDs.EmissiveBuffer, emissiveBuffer);
volumeGeneratorAssets.dataPacking.SetTexture(ComputeShader_DataPacking64, ShaderIDs.Write, materialMetaData.packedMetaBuffer);
volumeGeneratorAssets.dataPacking.Dispatch(ComputeShader_DataPacking64, Mathf.CeilToInt(objectTextureResolutionSquare / THREAD_GROUP_SIZE_X), Mathf.CeilToInt(objectTextureResolutionSquare / THREAD_GROUP_SIZE_Y), 1);
albedoBuffer.Release();
emissiveBuffer.Release();
}
//after rendering both the albedo/emissive lets store the results into our object meta data for the current material that we rendered.
//NOTE: its also possible here that there wasn't a meta pass so that means 'materialMetaData' is empty.
objectMetaData.materials[j] = materialMetaData;
}
}
//collect the extracted meta data from the current mesh so we can render it later.
objectsMetaData.Add(objectMetaData);
}
}
//|||||||||||||||||||||||||||||||||||||| (DEBUG) LOG META DATA MEMORY USAGE ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| (DEBUG) LOG META DATA MEMORY USAGE ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| (DEBUG) LOG META DATA MEMORY USAGE ||||||||||||||||||||||||||||||||||||||
long memorySize = 0;
uint textures = 0;
for (int i = 0; i < objectsMetaData.Count; i++)
{
memorySize += objectsMetaData[i].GetDebugMemorySize();
textures += (uint)objectsMetaData[i].materials.Length;
}
Debug.Log(string.Format("Meta Textures {0} | Total Runtime Memory: {1} MB [{2} B]", textures, Mathf.RoundToInt(memorySize / (1024.0f * 1024.0f)), memorySize));
return objectsMetaData;
}
public void CleanUpSceneObjectMetaBuffers(List<ObjectMetaDataV2> objectsMetaData)
{
for (int i = 0; i < objectsMetaData.Count; i++)
objectsMetaData[i].CleanUp();
}
//|||||||||||||||||||||||||||||||||||||| SCENE RENDERING ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| SCENE RENDERING ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| SCENE RENDERING ||||||||||||||||||||||||||||||||||||||
public void RenderScene(List<ObjectMetaDataV2> sceneObjectMetaData, Camera camera, RenderTexture renderTexture)
{
double timeBeforeFunction = Time.realtimeSinceStartupAsDouble;
//|||||||||||||||||||||||||||||||||||||| RENDER SCENE BUFFERS ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| RENDER SCENE BUFFERS ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| RENDER SCENE BUFFERS ||||||||||||||||||||||||||||||||||||||
//get camera frustum planes
Plane[] cameraFrustumPlanes = GeometryUtility.CalculateFrustumPlanes(camera);
using (CommandBuffer sceneCommandBuffer = new CommandBuffer())
{
//calculate the view matrix of the camera that we are using to render the scene with.
Matrix4x4 lookMatrix = Matrix4x4.LookAt(camera.transform.position, camera.transform.position + camera.transform.forward, camera.transform.up);
Matrix4x4 scaleMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(1, 1, -1));
Matrix4x4 viewMatrix = scaleMatrix * lookMatrix.inverse;
//make the render target active, and setup projection
sceneCommandBuffer.SetRenderTarget(renderTexture);
sceneCommandBuffer.SetViewProjectionMatrices(viewMatrix, camera.projectionMatrix);
sceneCommandBuffer.SetViewport(new Rect(0, 0, renderTexture.width, renderTexture.height));
sceneCommandBuffer.ClearRenderTarget(true, true, Color.clear); //IMPORTANT: clear contents before we render a new frame
//iterate through each object we collected
for (int i = 0; i < sceneObjectMetaData.Count; i++)
{
ObjectMetaDataV2 objectMetaData = sceneObjectMetaData[i];
//(IF ENABLED) calculate camera frustum culling during this instance of rendering
if (useBoundingBoxCullingForRendering)
{
//test the extracted object bounds against the planes, if the object is NOT within the camera frustum planes...
if (!GeometryUtility.TestPlanesAABB(cameraFrustumPlanes, objectMetaData.bounds))
continue; //then continue to the next object to render, no reason to keep fucking around with it because we won't see it
}
//if our object has materials
if (objectMetaData.materials != null)
{
//iterate through each material on the object
for (int j = 0; j < objectMetaData.materials.Length; j++)
{
//get the meta data we collected earlier of the material
MaterialMetaDataV2 materialMetaData = objectMetaData.materials[j];
//make sure it isn't empty
if (materialMetaData.isEmpty() == false)
{
int submeshIndex = j; //In unity, submeshes are linked to materials. If a mesh has 2 materials, then there are 2 submeshes. So the submesh index should match the material index.
//feed it our albedo buffer
sceneObjectMaterialPropertyBlock.SetTexture(ShaderIDs._MainTex, materialMetaData.packedMetaBuffer);
//configure face culling
sceneObjectMaterial.SetInt("_CullMode", doubleSidedGeometry ? (int)CullMode.Off : (int)CullMode.Back);
//draw the mesh in the scene, rendering only its raw albedo colors.
sceneCommandBuffer.DrawMesh(objectMetaData.mesh, objectMetaData.transformMatrix, sceneObjectMaterial, submeshIndex, 0, sceneObjectMaterialPropertyBlock);
}
}
}
}
//actually renders the scene.
Graphics.ExecuteCommandBuffer(sceneCommandBuffer);
}
}
public void UnpackSceneRender(RenderTexture packedRenderTexture, RenderTexture albedoRenderTexture, RenderTexture emissiveRenderTexture, RenderTexture normalRenderTexture)
{
int ComputeShader_DataUnpacking64 = volumeGeneratorAssets.dataPacking.FindKernel("ComputeShader_DataUnpacking64");
volumeGeneratorAssets.dataPacking.SetTexture(ComputeShader_DataUnpacking64, ShaderIDs.PackedBuffer, packedRenderTexture);
volumeGeneratorAssets.dataPacking.SetTexture(ComputeShader_DataUnpacking64, ShaderIDs.AlbedoBuffer, albedoRenderTexture);
volumeGeneratorAssets.dataPacking.SetTexture(ComputeShader_DataUnpacking64, ShaderIDs.EmissiveBuffer, emissiveRenderTexture);
volumeGeneratorAssets.dataPacking.SetTexture(ComputeShader_DataUnpacking64, ShaderIDs.NormalBuffer, normalRenderTexture);
volumeGeneratorAssets.dataPacking.Dispatch(ComputeShader_DataUnpacking64, Mathf.CeilToInt(packedRenderTexture.width / THREAD_GROUP_SIZE_X), Mathf.CeilToInt(packedRenderTexture.height / THREAD_GROUP_SIZE_Y), 1);
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||| LOD FUNCTIONS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||| LOD FUNCTIONS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||| LOD FUNCTIONS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/// <summary>
/// Gets an array of renderer objects after LOD0 on an LODGroup.
/// </summary>
/// <param name="lodGroup"></param>
/// <returns></returns>
public static Renderer[] GetRenderersAfterLOD0(LODGroup lodGroup)
{
//get LODGroup lods
LOD[] lods = lodGroup.GetLODs();
//If there are no LODs...
//Or there is only one LOD level...
//Ignore this LODGroup and return nothing (we only want the renderers that are used for the other LOD groups)
if (lods.Length < 2)
return null;
//Initalize a dynamic array list of renderers that will be filled
List<Renderer> renderers = new List<Renderer>();
//Skip the first LOD level...
//And iterate through the rest of the LOD groups to get it's renderers
for (int i = 1; i < lods.Length; i++)
{
for (int j = 0; j < lods[i].renderers.Length; j++)
{
Renderer lodRenderer = lods[i].renderers[j];
if (lodRenderer != null)
renderers.Add(lodRenderer);
}
}
//If no renderers were found, then return nothing.
if (renderers.Count <= 0)
return null;
return renderers.ToArray();
}
/// <summary>
/// Returns a list of hashes for the given renderer array.
/// </summary>
/// <param name="renderers"></param>
/// <returns></returns>
public static int[] GetRendererHashCodes(Renderer[] renderers)
{
int[] hashCodeArray = new int[renderers.Length];
for (int i = 0; i < hashCodeArray.Length; i++)
hashCodeArray[i] = renderers[i].GetHashCode();
return hashCodeArray;
}
/// <summary>
/// Returns a hash code array of renderers found after LOD0 in a given LOD group.
/// </summary>
/// <param name="lodGroup"></param>
/// <returns></returns>
public static int[] GetRendererHashCodesAfterLOD0(LODGroup lodGroup)
{
Renderer[] renderers = GetRenderersAfterLOD0(lodGroup);
if (renderers == null || renderers.Length <= 1)
return null;
else
return GetRendererHashCodes(renderers);
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||| UTILITIES ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||| UTILITIES ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||| UTILITIES ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public static void SetHDREncodingKeywords(ComputeShader computeShader, HDREncoding encoding)
{
VolumeGeneratorUtility.SetComputeKeyword(computeShader, "EMISSION_HDR_RGBM", encoding == HDREncoding.RGBM);
VolumeGeneratorUtility.SetComputeKeyword(computeShader, "EMISSION_HDR_RGBD", encoding == HDREncoding.RGBD);
VolumeGeneratorUtility.SetComputeKeyword(computeShader, "EMISSION_HDR_RGBE", encoding == HDREncoding.RGBE);
VolumeGeneratorUtility.SetComputeKeyword(computeShader, "EMISSION_HDR_LOG_LUV_32", encoding == HDREncoding.LOG_LUV_32);
}
public static void SetHDREncodingKeywords(Material material, HDREncoding encoding)
{
VolumeGeneratorUtility.SetMaterialKeyword(material, "EMISSION_HDR_RGBM", encoding == HDREncoding.RGBM);
VolumeGeneratorUtility.SetMaterialKeyword(material, "EMISSION_HDR_RGBD", encoding == HDREncoding.RGBD);
VolumeGeneratorUtility.SetMaterialKeyword(material, "EMISSION_HDR_RGBE", encoding == HDREncoding.RGBE);
VolumeGeneratorUtility.SetMaterialKeyword(material, "EMISSION_HDR_LOG_LUV_32", encoding == HDREncoding.LOG_LUV_32);
}
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/MetaPassRenderingV2.cs.meta
================================================
fileFormatVersion: 2
guid: 2381c032992e5cd4ebf5f9cb6b40e29e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/NoiseLibrary.cs
================================================
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace BakedVolumetricsOffline
{
public static class NoiseLibrary
{
private static int jitterResolution = 64;
public static Texture2D GetRandomNoise()
{
if (AssetDatabase.IsValidFolder("Assets/BakedVolumetrics/Data") == false)
AssetDatabase.CreateFolder("Assets/BakedVolumetrics", "Data");
string sharedVolumetricsFolder = "Assets/BakedVolumetrics/Data/Shared";
if (AssetDatabase.IsValidFolder(sharedVolumetricsFolder) == false)
AssetDatabase.CreateFolder("Assets/BakedVolumetrics/Data", "Shared");
string jitterAssetName = "WhiteNoiseJitter.asset";
string jitterAssetPath = sharedVolumetricsFolder + "/" + jitterAssetName;
Texture2D jitter = AssetDatabase.LoadAssetAtPath<Texture2D>(jitterAssetPath);
if (jitter == null)
{
jitter = new Texture2D(jitterResolution, jitterResolution, TextureFormat.RGBA4444, false);
jitter.filterMode = FilterMode.Bilinear;
jitter.anisoLevel = 0;
for (int x = 0; x < jitterResolution; x++)
{
for (int y = 0; y < jitterResolution; y++)
{
Color randomColor = new Color(UnityEngine.Random.Range(0.0f, 1.0f), 0.0f, 0.0f, 1.0f);
jitter.SetPixel(x, y, randomColor);
}
}
AssetDatabase.CreateAsset(jitter, jitterAssetPath);
}
return jitter;
}
public static Texture2D GetBlueNoise()
{
if (AssetDatabase.IsValidFolder("Assets/BakedVolumetrics/Data/Shared/BlueNoise") == false)
{
Debug.LogWarning("Baked Volumetrics Error! Original folder structure has been changed and cant find blue noise textures, resorting to generating random noise.");
return GetRandomNoise();
}
return AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/BakedVolumetrics/Data/Shared/BlueNoise/128_128/HDR_L_0.png");
}
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/NoiseLibrary.cs.meta
================================================
fileFormatVersion: 2
guid: 789a4571d277d034cb5dfff9406d399a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/RenderTextureConverter.cs
================================================
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Rendering;
using UnityEngine;
using UnityEditor;
using System.IO;
using System;
using UnityEngine.Experimental.Rendering;
using Unity.Collections;
namespace BakedVolumetricsOffline
{
public class RenderTextureConverter
{
private Texture2D convertedTexture2D;
private Texture3D convertedTexture3D;
public Texture2D ConvertRenderTexture2DToTexture2D(RenderTexture renderTexture2D, bool generateMips = false, bool readable = false, bool releaseRenderTexture = false)
{
int width = renderTexture2D.width;
int height = renderTexture2D.height;
//int renderTextureMemorySize = (int)Profiler.GetRuntimeMemorySizeLong(renderTexture2D);
int renderTextureMemorySize = (int)RenderTextureSize.GetRenderTextureMemorySize(renderTexture2D);
NativeArray<byte> nativeArray = new NativeArray<byte>(renderTextureMemorySize, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
AsyncGPUReadbackRequest request = AsyncGPUReadback.RequestIntoNativeArray(ref nativeArray, renderTexture2D, 0, (request) =>
{
convertedTexture2D = new Texture2D(width, height, renderTexture2D.graphicsFormat, generateMips ? TextureCreationFlags.MipChain : TextureCreationFlags.None);
convertedTexture2D.filterMode = convertedTexture2D.filterMode;
convertedTexture2D.SetPixelData(nativeArray, 0);
convertedTexture2D.Apply(generateMips, !readable);
nativeArray.Dispose();
if(releaseRenderTexture)
renderTexture2D.Release();
});
request.WaitForCompletion();
return convertedTexture2D;
}
public void SaveRenderTexture2DAsTexture2D(RenderTexture renderTexture2D, string assetRealtivePath, bool generateMips = false, bool readable = false, bool releaseRenderTexture = false)
{
Texture2D converted = ConvertRenderTexture2DToTexture2D(renderTexture2D, generateMips, readable, releaseRenderTexture);
AssetDatabase.CreateAsset(converted, assetRealtivePath);
AssetDatabase.SaveAssetIfDirty(converted);
}
public void SaveAsyncRenderTexture2DAsTexture2D(RenderTexture renderTexture2D, string assetRealtivePath, bool generateMips = false, bool readable = false)
{
int width = renderTexture2D.width;
int height = renderTexture2D.height;
//int renderTextureMemorySize = (int)Profiler.GetRuntimeMemorySizeLong(renderTexture2D);
int renderTextureMemorySize = (int)RenderTextureSize.GetRenderTextureMemorySize(renderTexture2D);
NativeArray<byte> nativeArray = new NativeArray<byte>(renderTextureMemorySize, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
AsyncGPUReadbackRequest request = AsyncGPUReadback.RequestIntoNativeArray(ref nativeArray, renderTexture2D, 0, (request) =>
{
convertedTexture2D = new Texture2D(width, height, renderTexture2D.graphicsFormat, generateMips ? TextureCreationFlags.MipChain : TextureCreationFlags.None);
convertedTexture2D.filterMode = convertedTexture2D.filterMode;
convertedTexture2D.SetPixelData(nativeArray, 0);
convertedTexture2D.Apply(generateMips, !readable);
nativeArray.Dispose();
renderTexture2D.Release();
AssetDatabase.CreateAsset(convertedTexture2D, assetRealtivePath);
AssetDatabase.SaveAssetIfDirty(convertedTexture2D);
});
}
public Texture3D ConvertRenderTexture3DToTexture3D(RenderTexture renderTexture3D, bool generateMips = false, bool readable = false, bool releaseRenderTexture = false)
{
int width = renderTexture3D.width;
int height = renderTexture3D.height;
int depth = renderTexture3D.volumeDepth;
//int renderTextureMemorySize = (int)Profiler.GetRuntimeMemorySizeLong(renderTexture3D);
int renderTextureMemorySize = (int)RenderTextureSize.GetRenderTextureMemorySize(renderTexture3D);
NativeArray<byte> nativeArray = new NativeArray<byte>(renderTextureMemorySize, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
AsyncGPUReadbackRequest request = AsyncGPUReadback.RequestIntoNativeArray(ref nativeArray, renderTexture3D, 0, (request) =>
{
convertedTexture3D = new Texture3D(width, height, depth, renderTexture3D.graphicsFormat, generateMips ? TextureCreationFlags.MipChain : TextureCreationFlags.None);
convertedTexture3D.filterMode = renderTexture3D.filterMode;
convertedTexture3D.SetPixelData(nativeArray, 0);
convertedTexture3D.Apply(generateMips, !readable);
nativeArray.Dispose();
if(releaseRenderTexture)
renderTexture3D.Release();
});
request.WaitForCompletion();
return convertedTexture3D;
}
public void SaveRenderTexture3DAsTexture3D(RenderTexture renderTexture3D, string assetRealtivePath, bool generateMips = false, bool readable = false)
{
Texture3D converted = ConvertRenderTexture3DToTexture3D(renderTexture3D, generateMips, readable);
AssetDatabase.CreateAsset(converted, assetRealtivePath);
AssetDatabase.SaveAssetIfDirty(converted);
}
public void SaveRenderTexture3DAsTexture3D(RenderTexture renderTexture3D, string assetRealtivePath, TextureFormat newTextureFormat, bool generateMips = false, bool readable = false)
{
Texture3D converted = ConvertRenderTexture3DToTexture3D(renderTexture3D, generateMips, readable);
Texture3D convertedNewFormat = new Texture3D(converted.width, converted.height, converted.depth, newTextureFormat, false);
convertedNewFormat.filterMode = converted.filterMode;
convertedNewFormat.wrapMode = converted.wrapMode;
Graphics.ConvertTexture(converted, convertedNewFormat);
AssetDatabase.CreateAsset(convertedNewFormat, assetRealtivePath);
AssetDatabase.SaveAssetIfDirty(convertedNewFormat);
}
public void SaveRenderTexture3DAsTexture3D(RenderTexture renderTexture3D, string assetRealtivePath, GraphicsFormat newTextureFormat, bool generateMips = false, bool readable = false)
{
Texture3D converted = ConvertRenderTexture3DToTexture3D(renderTexture3D, generateMips, readable);
Texture3D convertedNewFormat = new Texture3D(converted.width, converted.height, converted.depth, newTextureFormat, generateMips ? TextureCreationFlags.MipChain : TextureCreationFlags.None);
convertedNewFormat.filterMode = converted.filterMode;
convertedNewFormat.wrapMode = converted.wrapMode;
Graphics.ConvertTexture(converted, convertedNewFormat);
AssetDatabase.CreateAsset(convertedNewFormat, assetRealtivePath);
AssetDatabase.SaveAssetIfDirty(convertedNewFormat);
}
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/RenderTextureConverter.cs.meta
================================================
fileFormatVersion: 2
guid: aa5818da501db1d45848d25f24cfde5c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/RenderTextureSize.cs
================================================
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
namespace BakedVolumetricsOffline
{
public static class RenderTextureSize
{
public static int GetRenderTextureFormatChannelCount(RenderTextureFormat renderTextureFormat)
{
switch (renderTextureFormat)
{
case RenderTextureFormat.ARGB1555:
return 4;
case RenderTextureFormat.ARGB2101010:
return 4;
case RenderTextureFormat.ARGB32:
return 4;
case RenderTextureFormat.ARGB4444:
return 4;
case RenderTextureFormat.ARGB64:
return 4;
case RenderTextureFormat.ARGBFloat:
return 4;
case RenderTextureFormat.ARGBHalf:
return 4;
case RenderTextureFormat.ARGBInt:
return 4;
case RenderTextureFormat.BGR101010_XR:
return 3;
case RenderTextureFormat.BGRA10101010_XR:
return 4;
case RenderTextureFormat.BGRA32:
return 4;
case RenderTextureFormat.R16:
return 1;
case RenderTextureFormat.R8:
return 1;
case RenderTextureFormat.RFloat:
return 1;
case RenderTextureFormat.RG16:
return 2;
case RenderTextureFormat.RG32:
return 2;
case RenderTextureFormat.RGB111110Float:
return 3;
case RenderTextureFormat.RGB565:
return 3;
case RenderTextureFormat.RGBAUShort:
return 4;
case RenderTextureFormat.RGFloat:
return 2;
case RenderTextureFormat.RGHalf:
return 2;
case RenderTextureFormat.RGInt:
return 2;
case RenderTextureFormat.RHalf:
return 1;
case RenderTextureFormat.RInt:
return 1;
case RenderTextureFormat.Depth:
return 1;
case RenderTextureFormat.Shadowmap:
return 1;
case RenderTextureFormat.Default:
return 4;
case RenderTextureFormat.DefaultHDR:
return 4;
default:
return 1;
}
}
/// <summary>
/// Get the byte size of a render texture.
/// <para>This is done with manual calculations.</para>
/// <para>NOTE 1: THIS DOES NOT FACTOR IN MIP MAPS</para>
/// <para>NOTE 2: Default/DefaultHDR are potentially wrong because... who knows what it could be?</para>
/// <para>NOTE 3: TextureDimension.Tex3D and TextureDimension.Tex2D are correct, however anything else could be wrong?</para>
/// </summary>
/// <param name="renderTexture"></param>
/// <returns></returns>
public static ulong GetRenderTextureMemorySize(RenderTexture renderTexture)
{
ulong renderTextureChannelCount = (ulong)GetRenderTextureFormatChannelCount(renderTexture.format);
//this is equivalent to 1 byte (8 bits) of pixel data for 1 channel
ulong renderTextureDataSize = 0;
switch(renderTexture.dimension)
{
case UnityEngine.Rendering.TextureDimension.Tex3D:
renderTextureDataSize = (ulong)(renderTexture.width * renderTexture.height * renderTexture.volumeDepth);
break;
default:
renderTextureDataSize = (ulong)(renderTexture.width * renderTexture.height);
break;
}
switch (renderTexture.format)
{
//Color render texture format, 1 bit for Alpha channel, 5 bits for Red, Green and Blue channels.
//[TOTAL BYTES PER PIXEL]: 16 bits (2 bytes)
case RenderTextureFormat.ARGB1555:
return renderTextureDataSize * 2;
//Color render texture format. 10 bits for colors, 2 bits for alpha.
//[TOTAL BYTES PER PIXEL]: 32 bits (4 bytes)
case RenderTextureFormat.ARGB2101010:
return renderTextureDataSize * 4;
//Color render texture format, 8 bits per channel.
//[TOTAL BYTES PER PIXEL]: 32 bits (4 bytes)
case RenderTextureFormat.ARGB32:
return renderTextureDataSize * 4;
//Color render texture format, 4 bit per channel.
//[TOTAL BYTES PER PIXEL]: 16 bits (2 bytes)
case RenderTextureFormat.ARGB4444:
return renderTextureDataSize * 2;
//Four color render texture format, 16 bits per channel, fixed point, unsigned normalized.
//[TOTAL BYTES PER PIXEL]: 64 bits (8 bytes)
case RenderTextureFormat.ARGB64:
return renderTextureDataSize * 8;
//Color render texture format, 32 bit floating point per channel.
//[TOTAL BYTES PER PIXEL]: 128 bits (16 bytes)
case RenderTextureFormat.ARGBFloat:
return renderTextureDataSize * 16;
//Color render texture format, 16 bit floating point per channel.
//[TOTAL BYTES PER PIXEL]: 64 bits (8 bytes)
case RenderTextureFormat.ARGBHalf:
return renderTextureDataSize * 8;
//Four channel (ARGB) render texture format, 32 bit signed integer per channel.
//[TOTAL BYTES PER PIXEL]: 128 bits (16 bytes)
case RenderTextureFormat.ARGBInt:
return renderTextureDataSize * 16;
//Color render texture format, 8 bits per channel.
//[TOTAL BYTES PER PIXEL]: 32 bits (4 bytes)
case RenderTextureFormat.BGRA32:
return renderTextureDataSize * 4;
//Single channel (R) render texture format, 16 bit integer.
//[TOTAL BYTES PER PIXEL]: 16 bits (2 bytes)
case RenderTextureFormat.R16:
return renderTextureDataSize * 2;
//Single channel (R) render texture format, 8 bit integer.
//[TOTAL BYTES PER PIXEL]: 8 bits (1 byte)
case RenderTextureFormat.R8:
return renderTextureDataSize;
//Scalar (R) render texture format, 32 bit floating point.
//[TOTAL BYTES PER PIXEL]: 32 bits (4 bytes)
case RenderTextureFormat.RFloat:
return renderTextureDataSize * 4;
//Two channel (RG) render texture format, 8 bits per channel.
//[TOTAL BYTES PER PIXEL]: 16 bits (2 bytes)
case RenderTextureFormat.RG16:
return renderTextureDataSize * 2;
//Two color (RG) render texture format, 16 bits per channel, fixed point, unsigned normalized.
//[TOTAL BYTES PER PIXEL]: 32 bits (4 bytes)
case RenderTextureFormat.RG32:
return renderTextureDataSize * 4;
//Color render texture format. R and G channels are 11 bit floating point, B channel is 10 bit floating point.
//[TOTAL BYTES PER PIXEL]: 32 bits (4 bytes)
case RenderTextureFormat.RGB111110Float:
return renderTextureDataSize * 4;
//Color render texture format.
//[TOTAL BYTES PER PIXEL]: 16 bits (2 bytes)
case RenderTextureFormat.RGB565:
return renderTextureDataSize * 2;
//Four channel (RGBA) render texture format, 16 bit unsigned integer per channel.
//[TOTAL BYTES PER PIXEL]: 64 bits (8 bytes)
case RenderTextureFormat.RGBAUShort:
return renderTextureDataSize * 8;
//Two color (RG) render texture format, 32 bit floating point per channel.
//[TOTAL BYTES PER PIXEL]: 64 bits (8 bytes)
case RenderTextureFormat.RGFloat:
return renderTextureDataSize * 8;
//Two color (RG) render texture format, 16 bit floating point per channel.
//[TOTAL BYTES PER PIXEL]: 32 bits (4 bytes)
case RenderTextureFormat.RGHalf:
return renderTextureDataSize * 4;
//Two channel (RG) render texture format, 32 bit signed integer per channel.
//[TOTAL BYTES PER PIXEL]: 64 bits (8 bytes)
case RenderTextureFormat.RGInt:
return renderTextureDataSize * 8;
//Scalar (R) render texture format, 16 bit floating point.
//[TOTAL BYTES PER PIXEL]: 16 bits (2 bytes)
case RenderTextureFormat.RHalf:
return renderTextureDataSize * 2;
//Scalar (R) render texture format, 32 bit signed integer.
//[TOTAL BYTES PER PIXEL]: 32 bits (4 bytes)
case RenderTextureFormat.RInt:
return renderTextureDataSize * 4;
//|||||||||||||||||||||||| UNSURE ABOUT THESE BELOW ||||||||||||||||||||||||
//|||||||||||||||||||||||| UNSURE ABOUT THESE BELOW ||||||||||||||||||||||||
//|||||||||||||||||||||||| UNSURE ABOUT THESE BELOW ||||||||||||||||||||||||
//Color render texture format, 10 bit per channel, extended range.
//[TOTAL BYTES PER PIXEL]: 30 bits
case RenderTextureFormat.BGR101010_XR:
return (ulong)((renderTextureDataSize * 4.0f) * (30.0f / 32.0f));
//Color render texture format, 10 bit per channel, extended range.
//[TOTAL BYTES PER PIXEL]: 40 bits
case RenderTextureFormat.BGRA10101010_XR:
return (ulong)((renderTextureDataSize * 4.0f) * (40.0f / 32.0f));
//[TOTAL BYTES PER PIXEL]: 32 bits? (4 bytes?) honestly unknown because default is dependent on the frame buffer and platform
case RenderTextureFormat.Default:
return renderTextureDataSize * 4;
//[TOTAL BYTES PER PIXEL]: 32 bits? (4 bytes?) honestly unknown because default is dependent on the frame buffer and platform
case RenderTextureFormat.DefaultHDR:
return renderTextureDataSize * 4;
//[TOTAL BYTES PER PIXEL]: 32 bits? (4 bytes?) not to sure on this one
case RenderTextureFormat.Depth:
return renderTextureDataSize * 4;
//[TOTAL BYTES PER PIXEL]: 32 bits? (4 bytes?) not to sure on this one
case RenderTextureFormat.Shadowmap:
return renderTextureDataSize * 4;
default:
return renderTextureDataSize;
}
}
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/RenderTextureSize.cs.meta
================================================
fileFormatVersion: 2
guid: fa186bf571a241f43a97230884bb28b9
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/SampleLightprobe.cs
================================================
#if UNITY_EDITOR
using System.Collections.Generic;
using UnityEditor.SceneManagement;
using UnityEditor;
using UnityEngine;
using UnityEngine.Profiling;
using UnityEngine.Rendering;
using BakedVolumetrics;
using System.Diagnostics.Contracts;
using System;
namespace BakedVolumetricsOffline
{
public class SampleLightprobe
{
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES ||||||||||||||||||||||||||||||||||||||||||
public float occlusionLeakFactor = 1.0f;
public bool occlusionPreventLeaks = false;
public bool indoorOnlySamples = false;
[Range(0, 64)] public int gaussianBlurSamples = 4;
//|||||||||||||||||||||||||||||||||||||||||| PRIVATE VARIABLES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PRIVATE VARIABLES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PRIVATE VARIABLES ||||||||||||||||||||||||||||||||||||||||||
private RenderTextureConverter renderTextureConverter;
private VolumeGenerator volumeGenerator;
private VolumeGeneratorAssets volumeGeneratorAssets;
private string volumeName => volumeGenerator.volumeName;
private Vector3 volumePosition => volumeGenerator.transform.position;
private Vector3Int volumeResolution => volumeGenerator.GetVoxelResolution();
private Vector3 volumeSize => volumeGenerator.volumeSize;
private string lightprobeVolumeAssetPath => string.Format("{0}/{1}_LightProbe.asset", volumeGeneratorAssets.localAssetSceneDataFolder, volumeName);
//Size of the thread groups for compute shaders.
//These values should match the #define ones in the compute shaders.
private static uint THREAD_GROUP_SIZE_X = 4;
private static uint THREAD_GROUP_SIZE_Y = 4;
private static uint THREAD_GROUP_SIZE_Z = 4;
private ComputeShader adjustments => volumeGeneratorAssets.adjustments;
private ComputeShader gaussianBlur => volumeGeneratorAssets.gaussianBlur;
private ComputeShader density => volumeGeneratorAssets.density;
private static string sceneStaticCollidersName = "TEMP_SceneStaticColliders";
private GameObject sceneStaticColliders;
//|||||||||||||||||||||||||||||||||||||||||| CONSTRUCTOR ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| CONSTRUCTOR ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| CONSTRUCTOR ||||||||||||||||||||||||||||||||||||||||||
public SampleLightprobe(VolumeGenerator volumeGenerator, VolumeGeneratorAssets volumeGeneratorAssets)
{
this.volumeGenerator = volumeGenerator;
this.volumeGeneratorAssets = volumeGeneratorAssets;
renderTextureConverter = new RenderTextureConverter();
}
//|||||||||||||||||||||||||||||||||||||||||| GETTERS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| GETTERS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| GETTERS ||||||||||||||||||||||||||||||||||||||||||
public Texture3D GetFinalGeneratedVolume() => AssetDatabase.LoadAssetAtPath<Texture3D>(lightprobeVolumeAssetPath);
//|||||||||||||||||||||||||||||||||||||||||| GENERATE LIGHTPROBE VOLUME ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| GENERATE LIGHTPROBE VOLUME ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| GENERATE LIGHTPROBE VOLUME ||||||||||||||||||||||||||||||||||||||||||
public void GenerateVolume()
{
volumeGeneratorAssets.GetResources();
//double timeBeforeBake = Time.realtimeSinceStartupAsDouble;
double timeBeforeBake = Time.realtimeSinceStartup;
VolumeGeneratorUtility.UpdateProgressBar("Preparing to generate Light Probe volume...", 0.5f);
//|||||||||||||||||||||||||||||||||||||||||| SETUP ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| SETUP ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| SETUP ||||||||||||||||||||||||||||||||||||||||||
SetupSceneColliders();
Texture3D newVolume = new Texture3D(volumeResolution.x, volumeResolution.y, volumeResolution.z, volumeGenerator.GetTextureFormat(), false);
newVolume.wrapMode = TextureWrapMode.Clamp;
newVolume.filterMode = FilterMode.Bilinear;
//|||||||||||||||||||||||||||||||||||||||||| SAMPLING LIGHTPROBES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| SAMPLING LIGHTPROBES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| SAMPLING LIGHTPROBES ||||||||||||||||||||||||||||||||||||||||||
VolumeGeneratorUtility.UpdateProgressBar("Sampling Light Probes...", 0.5f);
for (int x = -volumeResolution.x / 2; x <= volumeResolution.x / 2; x++)
{
float x_offset = volumeSize.x / volumeResolution.x;
for (int y = -volumeResolution.y / 2; y <= volumeResolution.y / 2; y++)
{
float y_offset = volumeSize.y / volumeResolution.y;
for (int z = -volumeResolution.z / 2; z <= volumeResolution.z / 2; z++)
{
float z_offset = volumeSize.z / volumeResolution.z;
Vector3 probePosition = new Vector3(volumePosition.x + (x * x_offset), volumePosition.y + (y * y_offset), volumePosition.z + (z * z_offset));
Vector3 voxelWorldSize = new Vector3(x_offset, y_offset, z_offset);
//|||||||||||||||||||| COLOR (RGB) ||||||||||||||||||||||||
//|||||||||||||||||||| COLOR (RGB) ||||||||||||||||||||||||
//|||||||||||||||||||| COLOR (RGB) ||||||||||||||||||||||||
Color colorResult = Color.black;
bool test_leak = occlusionPreventLeaks ? (Physics.CheckBox(probePosition, voxelWorldSize * occlusionLeakFactor) == false) : true;
bool test_indoor = true;
if (indoorOnlySamples)
{
bool hit_up = Physics.Raycast(probePosition, Vector3.up, float.MaxValue);
bool hit_down = Physics.Raycast(probePosition, Vector3.down, float.MaxValue);
bool hit_left = Physics.Raycast(probePosition, Vector3.left, float.MaxValue);
bool hit_right = Physics.Raycast(probePosition, Vector3.right, float.MaxValue);
bool hit_forward = Physics.Raycast(probePosition, Vector3.forward, float.MaxValue);
bool hit_back = Physics.Raycast(probePosition, Vector3.back, float.MaxValue);
test_indoor = hit_up && hit_down && hit_left && hit_right && hit_forward && hit_back;
}
if (!test_indoor || !test_leak)
{
colorResult = Color.black;
}
else
{
SphericalHarmonicsL2 sphericalHarmonicsL2 = new SphericalHarmonicsL2();
Renderer renderer = new Renderer();
LightProbes.GetInterpolatedProbe(probePosition, renderer, out sphericalHarmonicsL2);
Vector3[] sampledDirections = new Vector3[1]
{
Vector3.zero
};
Color[] resultingColors = new Color[1];
sphericalHarmonicsL2.Evaluate(sampledDirections, resultingColors);
colorResult = resultingColors[0];
}
colorResult = new Color(colorResult.r, colorResult.g, colorResult.b, 1.0f);
//|||||||||||||||||||| FINAL ||||||||||||||||||||||||
//|||||||||||||||||||| FINAL ||||||||||||||||||||||||
//|||||||||||||||||||| FINAL ||||||||||||||||||||||||
Vector3Int volumeTexturePosition = new Vector3Int(x + (volumeResolution.x / 2), y + (volumeResolution.y / 2), z + (volumeResolution.z / 2));
newVolume.SetPixel(volumeTexturePosition.x, volumeTexturePosition.y, volumeTexturePosition.z, colorResult);
}
}
}
newVolume.Apply();
RemoveSceneColliders();
//|||||||||||||||||||||||||||||||||||||||||| COMPUTE SHADER SETUP ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| COMPUTE SHADER SETUP ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| COMPUTE SHADER SETUP ||||||||||||||||||||||||||||||||||||||||||
//consruct our render texture that we will write into
RenderTexture volumeWrite = new RenderTexture(volumeResolution.x, volumeResolution.y, 0, volumeGenerator.GetRenderTextureFormat());
volumeWrite.dimension = TextureDimension.Tex3D;
volumeWrite.volumeDepth = volumeResolution.z;
volumeWrite.enableRandomWrite = true;
volumeWrite.Create();
//|||||||||||||||||||||||||||||||||||||||||| APPLYING POST GAUSSIAN BLUR ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| APPLYING POST GAUSSIAN BLUR ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| APPLYING POST GAUSSIAN BLUR ||||||||||||||||||||||||||||||||||||||||||
VolumeGeneratorUtility.UpdateProgressBar("Applying Gaussian Blur...", 0.5f);
if (gaussianBlurSamples > 0)
{
//fetch our main gaussian blur function kernel in the compute shader
int ComputeShader_GaussianBlur = gaussianBlur.FindKernel("ComputeShader_GaussianBlur");
//make sure the compute shader knows the following parameters.
gaussianBlur.SetVector("VolumeResolution", new Vector4(volumeResolution.x, volumeResolution.y, volumeResolution.z, 0));
gaussianBlur.SetInt("BlurSamples", gaussianBlurSamples);
//|||||||||||||||||||||||||||||||||||||||||| BLUR X PASS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| BLUR X PASS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| BLUR X PASS ||||||||||||||||||||||||||||||||||||||||||
//set the gaussian blur direction for this pass.
gaussianBlur.SetVector("BlurDirection", new Vector4(1, 0, 0, 0));
//feed our compute shader the appropriate textures.
gaussianBlur.SetTexture(ComputeShader_GaussianBlur, "Read", newVolume);
gaussianBlur.SetTexture(ComputeShader_GaussianBlur, "Write", volumeWrite);
//let the GPU perform a gaussian blur along the given axis.
gaussianBlur.GetKernelThreadGroupSizes(ComputeShader_GaussianBlur, out THREAD_GROUP_SIZE_X, out THREAD_GROUP_SIZE_Y, out THREAD_GROUP_SIZE_Z);
gaussianBlur.Dispatch(ComputeShader_GaussianBlur, Mathf.CeilToInt(volumeResolution.x / THREAD_GROUP_SIZE_X), Mathf.CeilToInt(volumeResolution.y / THREAD_GROUP_SIZE_Y), Mathf.CeilToInt(volumeResolution.z / THREAD_GROUP_SIZE_Z));
//|||||||||||||||||||||||||||||||||||||||||| BLUR Y PASS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| BLUR Y PASS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| BLUR Y PASS ||||||||||||||||||||||||||||||||||||||||||
//get the result from the x pass and convert it into a texture3D so that it can be read again.
Texture3D tempBlurX = renderTextureConverter.ConvertRenderTexture3DToTexture3D(volumeWrite);
//set the gaussian blur direction for this pass.
gaussianBlur.SetVector("BlurDirection", new Vector4(0, 1, 0, 0));
//feed our compute shader the appropriate textures.
gaussianBlur.SetTexture(ComputeShader_GaussianBlur, "Read", tempBlurX);
gaussianBlur.SetTexture(ComputeShader_GaussianBlur, "Write", volumeWrite);
//let the GPU perform a gaussian blur along the given axis.
gaussianBlur.Dispatch(ComputeShader_GaussianBlur, Mathf.CeilToInt(volumeResolution.x / THREAD_GROUP_SIZE_X), Mathf.CeilToInt(volumeResolution.y / THREAD_GROUP_SIZE_Y), Mathf.CeilToInt(volumeResolution.z / THREAD_GROUP_SIZE_Z));
//|||||||||||||||||||||||||||||||||||||||||| BLUR Z PASS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| BLUR Z PASS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| BLUR Z PASS ||||||||||||||||||||||||||||||||||||||||||
//get the result from the y pass and convert it into a texture3D so that it can be read one more time.
Texture3D tempBlurY = renderTextureConverter.ConvertRenderTexture3DToTexture3D(volumeWrite);
//set the gaussian blur direction for this pass.
gaussianBlur.SetVector("BlurDirection", new Vector4(0, 0, 1, 0));
//feed our compute shader the appropriate textures.
gaussianBlur.SetTexture(ComputeShader_GaussianBlur, "Read", tempBlurY);
gaussianBlur.SetTexture(ComputeShader_GaussianBlur, "Write", volumeWrite);
//let the GPU perform a gaussian blur along the given axis.
gaussianBlur.Dispatch(ComputeShader_GaussianBlur, Mathf.CeilToInt(volumeResolution.x / THREAD_GROUP_SIZE_X), Mathf.CeilToInt(volumeResolution.y / THREAD_GROUP_SIZE_Y), Mathf.CeilToInt(volumeResolution.z / THREAD_GROUP_SIZE_Z));
}
//|||||||||||||||||||||||||||||||||||||||||| SAVING RESULTS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| SAVING RESULTS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| SAVING RESULTS ||||||||||||||||||||||||||||||||||||||||||
VolumeGeneratorUtility.UpdateProgressBar("Saving to disk...", 0.5f);
//save it!
renderTextureConverter.SaveRenderTexture3DAsTexture3D(volumeWrite, lightprobeVolumeAssetPath);
//we are done with this, so clean up.
volumeWrite.Release();
//double timeAfterBake = Time.realtimeSinceStartupAsDouble - timeBeforeBake;
double timeAfterBake = Time.realtimeSinceStartup - timeBeforeBake;
Debug.Log(string.Format("'{0}' took {1} seconds to bake.", volumeName, timeAfterBake));
VolumeGeneratorUtility.CloseProgressBar();
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||| SCENE COLLIDERS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||| SCENE COLLIDERS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||| SCENE COLLIDERS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/// <summary>
/// Spawns mesh colliders for all objects in the scene marked with the 'ContributeGI' static flag.
/// <para>This is used in general for features (if they are enabled) like preventing light leaks, doing occlusion, or getting indoor only samples.</para>
/// </summary>
public void SetupSceneColliders()
{
sceneStaticColliders = new GameObject(sceneStaticCollidersName);
MeshFilter[] meshes = MonoBehaviour.FindObjectsOfType<MeshFilter>();
for (int i = 0; i < meshes.Length; i++)
{
GameObject meshGameObject = meshes[i].gameObject;
MeshRenderer meshRenderer = meshGameObject.GetComponent<MeshRenderer>();
StaticEditorFlags staticEditorFlags = GameObjectUtility.GetStaticEditorFlags(meshGameObject);
if (meshRenderer != null && staticEditorFlags.HasFlag(StaticEditorFlags.ContributeGI))
{
GameObject sceneColliderChild = new GameObject("collider");
sceneColliderChild.transform.SetParent(sceneStaticColliders.transform);
sceneColliderChild.transform.position = meshGameObject.transform.position;
sceneColliderChild.transform.rotation = meshGameObject.transform.rotation;
sceneColliderChild.transform.localScale = meshGameObject.transform.localScale;
MeshCollider meshCollider = sceneColliderChild.AddComponent<MeshCollider>();
meshCollider.sharedMesh = meshes[i].sharedMesh;
}
}
}
public void RemoveSceneColliders()
{
if (sceneStaticColliders != null)
MonoBehaviour.DestroyImmediate(sceneStaticColliders);
else
{
sceneStaticColliders = GameObject.Find(sceneStaticCollidersName);
if (sceneStaticColliders != null)
MonoBehaviour.DestroyImmediate(sceneStaticColliders);
}
}
}
}
#endif
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/SampleLightprobe.cs.meta
================================================
fileFormatVersion: 2
guid: 27f8e1eb4cc4b524d9713690abcd9f12
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
================================================
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/SampleVoxelTracer.cs
================================================
#if UNITY_EDITOR
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Threading;
using Unity.Collections;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering;
/*
* NOTE: Might be worth investing time into writing a voxel normal estimator, and a dynamically changing sample type... I'll explain
*
* While generating a voxel buffer of scene normals do work, and is rather trivial there are issues with it.
* When they are used to orient hemispheres for importance sampling, if a voxel normal is facing the wrong direction, the hemisphere will be oriented incorrectly.
* As a result sometimes objects will appear to be just purely black or incorrect.
* So in that case it might be better just to estimate them with the surface albedo to help alleviate this and better align hemispheres with voxels.
*
* In addition to that, sometimes geometry can be only one voxel thin.
* In that case hemisphere sampling doesn't work, and we should be switching to full sphere sampling so we can get everything around correctly.
*/
namespace BakedVolumetricsOffline
{
public class SampleVoxelTracer
{
private VolumeGenerator volumeGenerator;
private VolumeGeneratorAssets volumeGeneratorAssets;
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - SCENE VOXELIZATION ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - SCENE VOXELIZATION ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - SCENE VOXELIZATION ||||||||||||||||||||||||||||||||||||||||||
//this is the name of the volume used by the voxel tracer.
//textures saved to the data folder will be prefixed with this name.
public string voxelName => volumeGenerator.volumeName;
//this defines the size of the volume for the voxel tracer in the scene.
//the bigger the volume, the more data required for storage/memory, and more computation time needed for generating textures.
public Vector3 voxelSize => volumeGenerator.volumeSize;
//this controls the resolution of the voxels used in the voxel tracer. Default value is 1.
//LARGER VALUES: lower voxel resolution/accuracy | faster baking times | less storage/memory required.
//SMALLER VALUES: better voxel resolution/accuracy | longer baking times | more storage/memory required.
public float voxelDensitySize => volumeGenerator.voxelDensitySize;
//this determines whether during rendering we do one pass or multiple passes.
//META EXTRACTION 1 PASS: worse buffer color accuracy | faster baking times | less memory used during voxelization
//META EXTRACTION 3 PASS: better buffer color accuracy | slower baking times | more memory used during voxelization
public SceneVoxelizerType sceneVoxelizerType = SceneVoxelizerType.MetaExtraction1Pass;
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - META PASS PROPERTIES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - META PASS PROPERTIES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - META PASS PROPERTIES ||||||||||||||||||||||||||||||||||||||||||
//this controls how many "pixels" per unit an object will have.
//this is for "meta" textures representing the different buffers of an object (albedo, normal, emissive)
//LARGER VALUES: more pixels allocated | better quality/accuracy | more memory usage (bigger meta textures for objects)
//SMALLER VALUES: less pixels allocated | worse quality/accuracy | less memory usage (smaller meta textures for objects)
public float texelDensityPerUnit = 4;
//minimum resolution for meta textures captured from objects in the scene (so objects too small will be capped to this value resolution wise)
//LARGER VALUES: more pixels allocated at minimum for object meta textures | better quality/accuracy | more memory usage (bigger meta textures for objects)
//SMALLER VALUES: less pixels allocated at minimum for object meta textures | worse quality/accuracy | less memory usage (smaller meta textures for objects)
public int minimumBufferResolution = 16;
//this controls whether or not pixel dilation will be performed for each meta texture buffer.
//this is done for "meta" tetures representing diferent buffers of an object (albedo, normal, emissive)
//this is highly recomended because meta textures will be low resolution inherently, and without it the textures won't fit perfectly into the UV space due to pixlation.
//as a result you will get black outlines on the borders of the UV atlases which will pollute the results of each buffer
//ENABLED: this will perform dilation on meta textures | slightly slower voxelization
//DISABLED: this will NOT do dilation on meta textures | slightly faster voxelization
public bool performDilation = true;
//max dilation size for the dilation radius, the higher it is the broader the dilation filter will cover.
//LARGER VALUES: larger dilation radius | better dilation quality/accuracy
//SMALLER VALUES: smaller dilation radius | worse dilation quality/accuracy
public int dilationPixelSize = 128;
//[NOTE]: (META EXTRACTION 3 PASS ONLY) Use bilinear filtering when rendering meta textures.
//This can smooth out meta textures and improve quality, as well as reduce black outlines.
//ENABLED: Bilinear filtering used on meta textures during rendering
//DISABLED: Point filtering used on meta textures during rendering
public bool useBilinearFiltering = true;
//[NOTE]: (META EXTRACTION 3 PASS ONLY) Use half precison for emission format.
//Saves additional memory/storage space at the cost of precison.
//ENABLED: Emisison Precision drops to 16 bit | less accuracy | less memory/storage
//DISABLED: Emisison Precision at 32 bit | more accuracy | more memory/storage
public bool emissionHalfPrecision = true;
//[NOTE]: (META EXTRACTION 1 PASS ONLY) Encoding Type used to compress emission HDR colors.
//Emission HDR is packed into 8 bit per channel to save on rendering passes, at the cost of accuracy.
public HDREncoding emissionHDREncoding = HDREncoding.RGBM;
//[NOTE]: (META EXTRACTION 1 PASS ONLY) Value range for RGBM/RGBD to compress emission HDR colors.
//LARGER VALUES: larger brightness range | less accuracy/quality
//SMALLER VALUES: smaller brightness range | more accuracy/quality
public float emissionHDREncodingRange = 6.0f;
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - VOXEL RENDERING ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - VOXEL RENDERING ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - VOXEL RENDERING ||||||||||||||||||||||||||||||||||||||||||
//this will perform blending with multiple captured voxel slices of the scene albedo buffer
//the scene is captured in multiple slices in 6 different axis's, "overdraw" happens for alot of pixels.
//so during voxelization if a pixel already has data written, we write again but blend with the original result, in theory this should lead to better accuracy of the buffer because each slice depending on the axis is not the exact same every time.
//ENABLED: averages multiple slices if there is overdraw of pixels, potentially better accuracy.
//DISABLED: on each slice, only the first instance of the color is written, if the same pixel is drawn then it's ignored.
public bool blendAlbedoVoxelSlices = true;
//this will perform blending with multiple captured voxel slices of the scene emissive buffer
//the scene is captured in multiple slices in 6 different axis's, "overdraw" happens for alot of pixels.
//so during voxelization if a pixel already has data written, we write again but blend with the original result, in theory this should lead to better accuracy of the buffer because each slice depending on the axis is not the exact same every time.
//ENABLED: averages multiple slices if there is overdraw of pixels, potentially better accuracy.
//DISABLED: on each slice, only the first instance of the color is written, if the same pixel is drawn then it's ignored.
//NOTE: This could lead to inaccuracy on some surfaces and could create skewed results since some surfaces depending on how they are captured, will have their vectors altered.
public bool blendEmissiveVoxelSlices = true;
//this will perform blending with multiple captured voxel slices of the scene albedo buffer
//the scene is captured in multiple slices in 6 different axis's, "overdraw" happens for alot of pixels.
//so during voxelization if a pixel already has data written, we write again but blend with the original result, in theory this should lead to better accuracy of the buffer because each slice depending on the axis is not the exact same every time.
//ENABLED: averages multiple slices if there is overdraw of pixels, potentially better accuracy.
//DISABLED: on each slice, only the first instance of the color is written, if the same pixel is drawn then it's ignored.
public bool blendNormalVoxelSlices = false;
//this determines whether or not geometry in the scene can be seen from both sides.
//this is on by default because its good at thickening geometry in the scene and reducing holes/cracks.
//ENABLED: scene is voxelized with geometry visible on all sides with no culling.
//DISABLED: scene is voxelized with geometry visible only on the front face, back faces are culled and invisible.
public bool doubleSidedGeometry = true;
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - VOXEL OPTIMIZATIONS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - VOXEL OPTIMIZATIONS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - VOXEL OPTIMIZATIONS ||||||||||||||||||||||||||||||||||||||||||
//this will only use mesh renderers that are marked "Contribute Global Illumination".
//ENABLED: this will only use meshes in the scene marked for GI | faster voxelization | less memory usage (less objects needing meta textures)
//DISABLED: every mesh renderer in the scene will be used | slower voxelization | more memory usage (more objects needing meta textures)
public bool onlyUseGIContributors = true;
//this will only use mesh renderers that have shadow casting enabled.
//ENABLED: this will only use meshes in the scene marked for GI | faster voxelization | less memory usage (less objects needing meta textures)
//DISABLED: every mesh renderer in the scene will be used | slower voxelization | more memory usage (more objects needing meta textures)
public bool onlyUseShadowCasters = true;
//only use meshes that are within voxelization bounds
//ENABLED: only objects within voxelization bounds will be used | faster voxelization | less memory usage (less objects needing meta textures)
//DISABLED: all objects in the scene will be used for voxelization | slower voxelization | more memory usage (more objects needing meta textures)
public bool onlyUseMeshesWithinBounds = true;
//use the bounding boxes on meshes during "voxelization" to render only what is visible
//ENABLED: renders objects only visible in each voxel slice | much faster voxelization
//DISABLED: renders all objects | much slower voxelization |
public bool useBoundingBoxCullingForRendering = true;
//only use objects that match the layer mask requirements
public LayerMask objectLayerMask = 1;
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - ENVIRONMENT OPTIONS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - ENVIRONMENT OPTIONS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - ENVIRONMENT OPTIONS ||||||||||||||||||||||||||||||||||||||||||
//Should we calculate environment lighting?
public bool enableEnvironmentLighting = true;
//Resolution of the captured environment cubemap.
[Range(32, 4096)] public int environmentResolution = 128;
//Custom environment cubemap if the user wants to input their own.
public Cubemap customEnvironmentMap;
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - BAKE OPTIONS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - BAKE OPTIONS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PUBLIC VARIABLES - BAKE OPTIONS ||||||||||||||||||||||||||||||||||||||||||
public LayerMask lightLayerMask = 1;
[Range(1, 8192)] public int directSurfaceSamples = 128;
[Range(1, 8192)] public int directVolumetricSamples = 128;
[Range(1, 8192)] public int environmentSurfaceSamples = 64;
[Range(1, 8192)] public int environmentVolumetricSamples = 64;
[Range(1, 8192)] public int bounceSurfaceSamples = 128;
[Range(1, 8192)] public int bounceVolumetricSamples = 64;
//Amount of surface shading bounces to do.
[Range(1, 8)] public int bounces = 4;
//Improve surface shading quality by using a cosine hemisphere oriented with the surface normal.
//Results in better ray allocation at lower sample counts (though at the moment there are issues with scene normals)
public bool normalOrientedHemisphereSampling = true;
//[Header("Artistic Controls")]
[Range(1, 10)] public float albedoBoost = 1; //1 is default, physically accurate.
[Range(0, 5)] public float indirectIntensity = 1; //1 is default, physically accurate.
[Range(0, 8)] public float environmentIntensity = 1; //1 is default, physically accurate.
[Range(0, 8)] public float emissiveIntensity = 1; //1 is default, physically accurate.
public LightAttenuationType lightAttenuationType = LightAttenuationType.UnityFalloff;
//[Header("Misc")]
public bool halfPrecisionLighting = false;
//Enables an intentional CPU staller.
//This is a bit of a hack, but a necessary one that will intentionally stall the CPU after X amount of compute shader dispatches.
//The compute shaders we use can get rather expensive, and issuing too many expensive workloads to the GPU can cause TDR/Driver timeouts and crash the editor.
//To get around it, we deliberaly stall the CPU by issuing a GPU Readback call to get data back from the GPU.
//If we get data back from the GPU that means the GPU is ready for more work and it completed whatever prior task it had.
public bool enableGPU_Readback_Limit = true;
//(If enabled) This adjusts the limit to how many times we do a GPU readback to stall the CPU after X amount of samples.
[Range(1, 32)] public int GPU_Readback_Limit = 4;
//[Header("Post Bake Options")]
//Applies a 3D gaussian blur to volumetric light terms to smooth results out.
//High samples though means that leaks can occur as this is not voxel/geometry aware.
[Range(0, 64)] public int volumetricDirectGaussianSamples = 0;
[Range(0, 64)] public int volumetricBounceGaussianSamples = 0;
[Range(0, 64)] public int volumetricEnvironmentGaussianSamples = 0;
//[Header("Gizmos")]
public bool previewBounds = true;
//|||||||||||||||||||||||||||||||||||||||||| PRIVATE VARIABLES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PRIVATE VARIABLES ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| PRIVATE VARIABLES ||||||||||||||||||||||||||||||||||||||||||
public Vector3Int voxelResolution => volumeGenerator.GetVoxelResolution();
private Bounds voxelBounds => volumeGenerator.voxelBounds;
private uint THREAD_GROUP_SIZE_X = 0;
private uint THREAD_GROUP_SIZE_Y = 0;
private uint THREAD_GROUP_SIZE_Z = 0;
private RenderTextureConverter renderTextureConverter;
private MetaPassRenderingV1 metaPassRendererV1;
private MetaPassRenderingV2 metaPassRendererV2;
private ComputeShader voxelDirectSurfaceLight => volumeGeneratorAssets.voxelDirectSurfaceLight;
private ComputeShader voxelDirectVolumetricLight => volumeGeneratorAssets.voxelDirectVolumetricLight;
private ComputeShader voxelBounceSurfaceLight => volumeGeneratorAssets.voxelBounceSurfaceLight;
private ComputeShader voxelBounceVolumetricLight => volumeGeneratorAssets.voxelBounceVolumetricLight;
private ComputeShader voxelEnvironmentSurfaceLight => volumeGeneratorAssets.voxelEnvironmentSurfaceLight;
private ComputeShader voxelEnvironmentVolumetricLight => volumeGeneratorAssets.voxelEnvironmentVolumetricLight;
private ComputeShader combineBuffers => volumeGeneratorAssets.combineBuffers;
private ComputeShader gaussianBlur => volumeGeneratorAssets.gaussianBlur;
private ComputeShader voxelizeScene => volumeGeneratorAssets.voxelizeScene;
private ComputeShader dilate => volumeGeneratorAssets.dilate;
private Texture3D voxelAlbedoBuffer;
private Texture3D voxelNormalBuffer;
private Texture3D voxelEmissiveBuffer;
private Texture3D voxelDirectLightSurfaceBuffer;
private Texture3D voxelDirectLightSurfaceAlbedoBuffer;
private Texture3D voxelDirectLightVolumeBuffer;
private Texture3D voxelEnvironmentLightSurfaceBuffer;
private Texture3D voxelEnvironmentLightSurfaceAlbedoBuffer;
private Texture3D voxelEnvironmentLightVolumeBuffer;
private Texture3D voxelCombinedDirectLightSurfaceBuffer;
private Texture3D voxelCombinedDirectLightSurfaceAlbedoBuffer;
private Texture3D voxelBounceLightSurfaceBuffer;
private Texture3D voxelBounceLightSurfaceAlbedoBuffer;
private Texture3D voxelBounceLightVolumeBuffer;
private Cubemap environmentMap;
private string voxelAlbedoBufferAssetPath => string.Format("{0}/{1}_albedo.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelNormalBufferAssetPath => string.Format("{0}/{1}_normal.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelEmissiveBufferAssetPath => string.Format("{0}/{1}_emissive.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelDirectLightSurfaceBufferAssetPath => string.Format("{0}/{1}_directSurface.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelDirectLightSurfaceAlbedoBufferAssetPath => string.Format("{0}/{1}_directSurfaceAlbedo.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelDirectLightVolumeBufferAssetPath => string.Format("{0}/{1}_directVolumetric.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelEnvironmentLightSurfaceBufferAssetPath => string.Format("{0}/{1}_environmentSurface.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelEnvironmentLightSurfaceAlbedoBufferAssetPath => string.Format("{0}/{1}_environmentSurfaceAlbedo.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelEnvironmentLightVolumetricBufferAssetPath => string.Format("{0}/{1}_environmentVolumetric.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelCombinedDirectLightSurfaceBufferAssetPath => string.Format("{0}/{1}_combinedDirectLightSurface.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelCombinedDirectLightSurfaceAlbedoBufferAssetPath => string.Format("{0}/{1}_combinedDirectLightSurfaceAlbedo.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelBounceLightSurfaceBufferAssetPath => string.Format("{0}/{1}_bounceSurface.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelBounceLightSurfaceAlbedoBufferAssetPath => string.Format("{0}/{1}_bounceSurfaceAlbedo.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelBounceLightVolumeBufferAssetPath => string.Format("{0}/{1}_bounceVolumetric.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string voxelCombinedVolumetricBufferAssetPath => string.Format("{0}/{1}_combinedVolumetric.asset", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private string environmentMapAssetPath => string.Format("{0}/{1}_environment.exr", volumeGeneratorAssets.localAssetSceneDataFolder, voxelName);
private GameObject voxelCameraGameObject;
private Camera voxelCamera;
private ComputeBuffer directionalLightsBuffer = null;
private ComputeBuffer pointLightsBuffer = null;
private ComputeBuffer spotLightsBuffer = null;
private ComputeBuffer areaLightsBuffer = null;
//private static RenderTextureFormat metaPackedFormat = RenderTextureFormat.ARGB64;
private static GraphicsFormat metaPackedFormat = GraphicsFormat.R16G16B16A16_UNorm;
private static RenderTextureFormat unpackedAlbedoBufferFormat = RenderTextureFormat.ARGB32; //NOTE: ARGB1555 is unsupported for random writes
private RenderTextureFormat unpackedEmissiveBufferFormat => emissionHalfPrecision ? RenderTextureFormat.ARGBHalf : RenderTextureFormat.ARGBFloat;
private static RenderTextureFormat unpackedNormalBufferFormat = RenderTextureFormat.ARGB32; //NOTE: ARGB1555 is unsupported for random writes
private TextureFormat textureFormat => halfPrecisionLighting ? TextureFormat.RGBAHalf : TextureFormat.RGBAFloat;
private RenderTextureFormat renderTextureFormat => halfPrecisionLighting ? RenderTextureFormat.ARGBHalf : RenderTextureFormat.ARGBFloat;
//|||||||||||||||||||||||||||||||||||||||||| CONSTRUCTOR ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| CONSTRUCTOR ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| CONSTRUCTOR ||||||||||||||||||||||||||||||||||||||||||
public SampleVoxelTracer(VolumeGenerator volumeGenerator, VolumeGeneratorAssets volumeGeneratorAssets)
{
this.volumeGenerator = volumeGenerator;
this.volumeGeneratorAssets = volumeGeneratorAssets;
renderTextureConverter = new RenderTextureConverter();
}
public Texture3D GetFinalGeneratedVolume() => AssetDatabase.LoadAssetAtPath<Texture3D>(voxelCombinedVolumetricBufferAssetPath);
/// <summary>
/// Loads in all of the generated textures from the voxel tracer.
/// <para>If some don't exist, they are just simply null.</para>
/// </summary>
public void GetGeneratedContent()
{
voxelAlbedoBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelAlbedoBufferAssetPath);
voxelNormalBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelNormalBufferAssetPath);
voxelEmissiveBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelEmissiveBufferAssetPath);
voxelDirectLightSurfaceBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelDirectLightSurfaceBufferAssetPath);
voxelDirectLightSurfaceAlbedoBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelDirectLightSurfaceAlbedoBufferAssetPath);
voxelDirectLightVolumeBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelDirectLightVolumeBufferAssetPath);
if (enableEnvironmentLighting)
{
voxelEnvironmentLightSurfaceBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelEnvironmentLightSurfaceBufferAssetPath);
voxelEnvironmentLightSurfaceAlbedoBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelEnvironmentLightSurfaceAlbedoBufferAssetPath);
voxelEnvironmentLightVolumeBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelEnvironmentLightVolumetricBufferAssetPath);
}
voxelCombinedDirectLightSurfaceBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelCombinedDirectLightSurfaceBufferAssetPath);
voxelCombinedDirectLightSurfaceAlbedoBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelCombinedDirectLightSurfaceAlbedoBufferAssetPath);
voxelBounceLightSurfaceBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelBounceLightSurfaceBufferAssetPath);
voxelBounceLightSurfaceAlbedoBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelBounceLightSurfaceAlbedoBufferAssetPath);
voxelBounceLightVolumeBuffer = AssetDatabase.LoadAssetAtPath<Texture3D>(voxelBounceLightVolumeBufferAssetPath);
}
public void CleanUpGeneratedContent()
{
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelAlbedoBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelAlbedoBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelNormalBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelNormalBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelEmissiveBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelEmissiveBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelDirectLightSurfaceBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelDirectLightSurfaceBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelDirectLightSurfaceAlbedoBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelDirectLightSurfaceAlbedoBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelDirectLightVolumeBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelDirectLightVolumeBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelEnvironmentLightSurfaceBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelEnvironmentLightSurfaceBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelEnvironmentLightSurfaceAlbedoBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelEnvironmentLightSurfaceAlbedoBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelEnvironmentLightVolumetricBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelEnvironmentLightVolumetricBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelCombinedDirectLightSurfaceBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelCombinedDirectLightSurfaceBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelCombinedDirectLightSurfaceAlbedoBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelCombinedDirectLightSurfaceAlbedoBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelBounceLightSurfaceBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelBounceLightSurfaceBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelBounceLightSurfaceAlbedoBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelBounceLightSurfaceAlbedoBufferAssetPath);
if (AssetDatabase.LoadAssetAtPath<Texture3D>(voxelBounceLightVolumeBufferAssetPath) != null) AssetDatabase.DeleteAsset(voxelBounceLightVolumeBufferAssetPath);
if (voxelAlbedoBuffer != null) MonoBehaviour.DestroyImmediate(voxelAlbedoBuffer);
if (voxelNormalBuffer != null) MonoBehaviour.DestroyImmediate(voxelNormalBuffer);
if (voxelEmissiveBuffer != null) MonoBehaviour.DestroyImmediate(voxelEmissiveBuffer);
if (voxelDirectLightSurfaceBuffer != null) MonoBehaviour.DestroyImmediate(voxelDirectLightSurfaceBuffer);
if (voxelDirectLightSurfaceAlbedoBuffer != null) MonoBehaviour.DestroyImmediate(voxelDirectLightSurfaceAlbedoBuffer);
if (voxelDirectLightVolumeBuffer != null) MonoBehaviour.DestroyImmediate(voxelDirectLightVolumeBuffer);
if (voxelEnvironmentLightSurfaceBuffer != null) MonoBehaviour.DestroyImmediate(voxelEnvironmentLightSurfaceBuffer);
if (voxelEnvironmentLightSurfaceAlbedoBuffer != null) MonoBehaviour.DestroyImmediate(voxelEnvironmentLightSurfaceAlbedoBuffer);
if (voxelEnvironmentLightVolumeBuffer != null) MonoBehaviour.DestroyImmediate(voxelEnvironmentLightVolumeBuffer);
if (voxelCombinedDirectLightSurfaceBuffer != null) MonoBehaviour.DestroyImmediate(voxelCombinedDirectLightSurfaceBuffer);
if (voxelCombinedDirectLightSurfaceAlbedoBuffer != null) MonoBehaviour.DestroyImmediate(voxelCombinedDirectLightSurfaceAlbedoBuffer);
if (voxelBounceLightSurfaceBuffer != null) MonoBehaviour.DestroyImmediate(voxelBounceLightSurfaceBuffer);
if (voxelBounceLightSurfaceAlbedoBuffer != null) MonoBehaviour.DestroyImmediate(voxelBounceLightSurfaceAlbedoBuffer);
if (voxelBounceLightVolumeBuffer != null) MonoBehaviour.DestroyImmediate(voxelBounceLightVolumeBuffer);
voxelAlbedoBuffer = null;
voxelNormalBuffer = null;
voxelEmissiveBuffer = null;
voxelDirectLightSurfaceBuffer = null;
voxelDirectLightSurfaceAlbedoBuffer = null;
voxelDirectLightVolumeBuffer = null;
voxelEnvironmentLightSurfaceBuffer = null;
voxelEnvironmentLightSurfaceAlbedoBuffer = null;
voxelEnvironmentLightVolumeBuffer = null;
voxelCombinedDirectLightSurfaceBuffer = null;
voxelCombinedDirectLightSurfaceAlbedoBuffer = null;
voxelBounceLightSurfaceBuffer = null;
voxelBounceLightSurfaceAlbedoBuffer = null;
voxelBounceLightVolumeBuffer = null;
}
/// <summary>
/// Gets all Unity Lights in the scene, and builds compute buffers of them.
/// <para>This is used only when doing Direct Light tracing.</para>
/// </summary>
public void BuildLightComputeBuffers()
{
//|||||||||||||||||||||||||||||||||||||||||| GET SCENE LIGHTS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| GET SCENE LIGHTS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| GET SCENE LIGHTS ||||||||||||||||||||||||||||||||||||||||||
List<VoxelLightDirectional> voxelLightDirectionals = new List<VoxelLightDirectional>();
List<VoxelLightPoint> voxelLightPoints = new List<VoxelLightPoint>();
List<VoxelLightSpot> voxelLightSpots = new List<VoxelLightSpot>();
List<VoxelLightArea> voxelLightAreas = new List<VoxelLightArea>();
foreach (Light sceneLight in MonoBehaviour.FindObjectsOfType<Light>())
{
if (lightLayerMask == (lightLayerMask | (1 << sceneLight.gameObject.layer)) == false)
continue;
if (sceneLight.type == LightType.Directional)
{
VoxelLightDirectional voxelLightDirectional = new VoxelLightDirectional(sceneLight);
voxelLightDirectionals.Add(voxelLightDirectional);
}
else if (sceneLight.type == LightType.Point)
{
VoxelLightPoint voxelLightPoint = new VoxelLightPoint(sceneLight);
voxelLightPoints.Add(voxelLightPoint);
}
else if (sceneLight.type == LightType.Spot)
{
VoxelLightSpot voxelLightSpot = new VoxelLightSpot(sceneLight);
voxelLightSpots.Add(voxelLightSpot);
}
else if (sceneLight.type == LightType.Area)
{
VoxelLightArea voxelLightArea = new VoxelLightArea(sceneLight);
voxelLightAreas.Add(voxelLightArea);
}
}
//|||||||||||||||||||||||||||||||||||||||||| CLEAR LIGHT BUFFERS (If Used) ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| CLEAR LIGHT BUFFERS (If Used) ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| CLEAR LIGHT BUFFERS (If Used) ||||||||||||||||||||||||||||||||||||||||||
//just making sure that these are absolutely cleared and cleaned up.
if (directionalLightsBuffer != null)
{
directionalLightsBuffer.Release();
directionalLightsBuffer.Dispose();
}
if (pointLightsBuffer != null)
{
pointLightsBuffer.Release();
pointLightsBuffer.Dispose();
}
if (spotLightsBuffer != null)
{
spotLightsBuffer.Release();
spotLightsBuffer.Dispose();
}
if (areaLightsBuffer != null)
{
areaLightsBuffer.Release();
areaLightsBuffer.Dispose();
}
directionalLightsBuffer = null;
pointLightsBuffer = null;
spotLightsBuffer = null;
areaLightsBuffer = null;
//|||||||||||||||||||||||||||||||||||||||||| BUILD SCENE LIGHT BUFFERS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| BUILD SCENE LIGHT BUFFERS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| BUILD SCENE LIGHT BUFFERS ||||||||||||||||||||||||||||||||||||||||||
//build directional light buffer
if (voxelLightDirectionals.Count > 0)
{
directionalLightsBuffer = new ComputeBuffer(voxelLightDirectionals.Count, VoxelLightDirectional.GetByteSize());
directionalLightsBuffer.SetData(voxelLightDirectionals.ToArray());
}
//build point light buffer
if (voxelLightPoints.Count > 0)
{
pointLightsBuffer = new ComputeBuffer(voxelLightPoints.Count, VoxelLightPoint.GetByteSize());
pointLightsBuffer.SetData(voxelLightPoints.ToArray());
}
//build spot light buffer
if (voxelLightSpots.Count > 0)
{
spotLightsBuffer = new ComputeBuffer(voxelLightSpots.Count, VoxelLightSpot.GetByteSize());
spotLightsBuffer.SetData(voxelLightSpots.ToArray());
}
//build area light buffer
if (voxelLightAreas.Count > 0)
{
areaLightsBuffer = new ComputeBuffer(voxelLightAreas.Count, VoxelLightArea.GetByteSize());
areaLightsBuffer.SetData(voxelLightAreas.ToArray());
}
Debug.Log(string.Format("[Directional: {0}] [Spot: {1}] [Point: {2}] [Area: {3}]", voxelLightDirectionals.Count, voxelLightSpots.Count, voxelLightPoints.Count, voxelLightAreas.Count));
}
//|||||||||||||||||||||||||||||||||||||||||| STEP 0: SETUP VOXEL CAPTURE ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| STEP 0: SETUP VOXEL CAPTURE ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| STEP 0: SETUP VOXEL CAPTURE ||||||||||||||||||||||||||||||||||||||||||
//This is where we construct our voxel capture rig that will be used when we voxelize the scene in step 1.
/// <summary>
/// Creates a GameObject with a Camera for Voxel Capture.
/// </summary>
public void CreateVoxelCamera()
{
if (voxelCameraGameObject == null)
voxelCameraGameObject = new GameObject("VoxelizeSceneCamera");
if (voxelCamera == null)
voxelCamera = voxelCameraGameObject.AddComponent<Camera>();
voxelCamera.enabled = false;
voxelCamera.forceIntoRenderTexture = true;
voxelCamera.useOcclusionCulling = false;
voxelCamera.allowMSAA = false;
voxelCamera.orthographic = true;
voxelCamera.nearClipPlane = 0.0f;
voxelCamera.farClipPlane = voxelDensitySize;
voxelCamera.clearFlags = CameraClearFlags.Color;
voxelCamera.backgroundColor = new Color(0, 0, 0, 0);
voxelCamera.depthTextureMode = DepthTextureMode.None;
voxelCamera.renderingPath = RenderingPath.Forward;
}
/// <summary>
/// Destroys the Voxel Camera.
/// </summary>
public void CleanupVoxelCamera()
{
if (voxelCameraGameObject != null)
MonoBehaviour.DestroyImmediate(voxelCameraGameObject);
if (voxelCamera != null)
MonoBehaviour.DestroyImmediate(voxelCamera);
voxelCameraGameObject = null;
voxelCamera = null;
}
//|||||||||||||||||||||||||||||||||||||||||| STEP 1: CAPTURE ALBEDO/EMISSIVE VOXEL BUFFERS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| STEP 1: CAPTURE ALBEDO/EMISSIVE VOXEL BUFFERS ||||||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||||||| STEP 1: CAPTURE ALBEDO/EMISSIVE VOXEL BUFFERS ||||||||||||||||||||||||||||||||||||||||||
//This is where we voxelize the current scene within the volume bounds.
// - [Albedo Buffer]
// This is used for the main scene color (RGB), but it is also used importantly for occlusion checking (A) when tracing.
//
// - [Emissive Buffer]
// This is used to capture any emissive materials in the scene.
// This is added in the direct light pass, and it's actual emission of light is calculated in the bounce lighting phase.
//
// - [Normal Buffer]
// This is used only when 'normalOrientedHemisphereSampling' is enabled to orient cosine hemispheres when calculating bounce surface lighting.
public void GenerateAlbedoEmissiveNormalBuffers()
{
volumeGeneratorAssets.PrepareAssetFolders();
volumeGeneratorAssets.GetResources();
if (sceneVoxelizerType == SceneVoxelizerType.MetaExtraction3Pass)
{
metaPassRendererV1 = new MetaPassRenderingV1(volumeGeneratorAssets);
metaPassRendererV1.dilationPixelSize = dilationPixelSize;
metaPassRendererV1.minimumBufferResolution = minimumBufferResolution;
metaPassRendererV1.objectLayerMask = objectLayerMask;
metaPassRendererV1.onlyUseGIContributors = onlyUseGIContributors;
metaPassRendererV1.onlyUseMeshesWithinBounds = onlyUseMeshesWithinBounds;
metaPassRendererV1.onlyUseShadowCasters = onlyUseShadowCasters;
metaPassRendererV1.performDilation = performDilation;
metaPassRendererV1.texelDensityPerUnit = texelDensityPerUnit;
metaPassRendererV1.useBoundingBoxCullingForRendering = useBoundingBoxCullingForRendering;
metaPassRendererV1.sceneObjectsBounds = voxelBounds;
metaPassRendererV1.doubleSidedGeometry = doubleSidedGeometry;
metaPassRendererV1.useBilinearFiltering = useBilinearFiltering;
metaPassRendererV1.emissionHalfPrecision = emissionHalfPrecision;
}
else if (sceneVoxelizerType == SceneVoxelizerType.MetaExtraction1Pass)
{
metaPassRendererV2 = new MetaPassRenderingV2(volumeGeneratorAssets);
metaPassRendererV2.dilationPixelSize = dilationPixelSize;
metaPassRendererV2.minimumBufferResolution = minimumBufferResolution;
metaPassRendererV2.objectLayerMask = objectLayerMask;
metaPassRendererV2.onlyUseGIContributors = onlyUseGIContributors;
metaPassRendererV2.onlyUseMeshesWithinBounds = onlyUseMeshesWithinBounds;
metaPassRendererV2.onlyUseShadowCasters = onlyUseShadowCasters;
metaPassRendererV2.performDilation = performDilation;
metaPassRendererV2.texelDensityPerUnit = texelDensityPerUnit;
metaPassRendererV2.useBoundingBoxCullingForRendering = useBoundingBoxCullingForRendering;
metaPassRendererV2.sceneObjectsBounds = voxelBounds;
metaPassRendererV2.doubleSidedGeometry = doubleSidedGeometry;
metaPassRendererV2.emissionHDREncoding = emissionHDREncoding;
metaPassRendererV2.emissionHDREncodingRange = emissionHDREncodingRange;
}
VolumeGeneratorUtility.UpdateProgressBar("Preparing to generate albedo/normal/emissive...", 0.5f);
float timeBeforeFunction = Time.realtimeSinceStartup;
CreateVoxelCamera(); //Create our voxel camera rig
int renderTextureDepthBits = 32; //bits for the render texture used by the voxel camera (technically 16 does just fine?)
VolumeGeneratorUtility.UpdateProgressBar("Building object meta buffers...", 0.5f);
List<ObjectMetaDataV1> objectMetaDataV1 = new List<ObjectMetaDataV1>();
List<ObjectMetaDataV2> objectMetaDataV2 = new List<ObjectMetaDataV2>();
if (sceneVoxelizerType == SceneVoxelizerType.MetaExtraction3Pass)
objectMetaDataV1 = metaPassRendererV1.ExtractSceneObjectMetaBuffers();
else if (sceneVoxelizerType == SceneVoxelizerType.MetaExtraction1Pass)
objectMetaDataV2 = metaPassRendererV2.ExtractSceneObjectMetaBuffers();
//|||||||||||||||||||||||||||||||||||||| PREPARE SCENE VOXELIZATION ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| PREPARE SCENE VOXELIZATION ||||||||||||||||||||||||||||||||||||||
//|||||||||||||||||||||||||||||||||||||| PREPARE SCENE VOXELIZATION ||||||||||||||||||||||||||||||||||||||
VolumeGeneratorUtility.UpdateProgressBar("Rendering scene...", 0.5f);
//compute per voxel position offset values.
float xOffset = voxelSize.x / voxelResolution.x;
float yOffset = voxelSize.y / voxelResolution.y;
float zOffset = voxelSize.z / voxelResolution.z;
//pre-fetch our voxelize kernel function in the compute shader.
int ComputeShader_VoxelizeScene_X_POS = voxelizeScene.FindKernel("ComputeShader_VoxelizeScene_X_POS");
int ComputeShader_VoxelizeScene_X_NEG = voxelizeScene.FindKernel("ComputeShader_VoxelizeScene_X_NEG");
int ComputeShader_VoxelizeScene_Y_POS = voxelizeScene.FindKernel("ComputeShader_VoxelizeScene_Y_POS");
int ComputeShader_VoxelizeScene_Y_NEG = voxelizeScene.FindKernel("ComputeShader_VoxelizeScene_Y_NEG");
int ComputeShader_VoxelizeScene_Z_POS = voxelizeScene.FindKernel("ComputeShader_VoxelizeScene_Z_POS");
int ComputeShader_VoxelizeScene_Z_NEG = voxelizeScene.FindKernel("ComputeShader_VoxelizeScene_Z_NEG");
//make sure the voxelize shader knows our voxel resolution beforehand.
voxelizeScene.SetVector(ShaderIDs.VolumeResolution, new Vector4(voxelResolution.x, voxelResolution.y, voxelResolution.z, 0));
//create our 3D render texture, which will be accumulating 2D slices of the scene captured at various axis.
RenderTexture sceneAlbedo = new RenderTexture(voxelResolution.x, voxelResolution.y, 0, unpackedAlbedoBufferFormat);
sceneAlbedo.dimension = TextureDimension.Tex3D;
sceneAlbedo.filterMode = FilterMode.Point;
sceneAlbedo.wrapMode = TextureWrapMode.Clamp;
sceneAlbedo.volumeDepth = voxelResolution.z;
sceneAlbedo.enableRandomWrite = true;
sceneAlbedo.Create();
RenderTexture sceneEmissive = new RenderTexture(voxelResolution.x, voxelResolution.y, 0, unpackedEmissiveBufferFormat);
sceneEmissive.dimension = TextureDimension.Tex3D;
sceneEmissive.filterMode = FilterMode.Point;
sceneEmissive.wrapMode = TextureWrapMode.Clamp;
sceneEmissive.volumeDepth = voxelResolution.z;
sceneEmissive.enableRandomWrite = true;
sceneEmissive.Create();
RenderTexture sceneNormal = new RenderTexture(voxelResolution.x, voxelResolution.y, 0, unpackedNormalBufferFormat);
sceneNormal.dimension = TextureDimension.Tex3D;
sceneNormal.filterMode = FilterMode.Point;
sceneNormal.wrapMode = TextureWrapMode.Clamp;
sceneNormal.volumeDepth = voxelResolution.z;
sceneNormal.enableRandomWrite = true;
sceneNormal.Create();
float timeBeforeRendering = Time.realtimeSinceStartup;
//||||||||||||||||||||||||||||||||| X AXIS SETUP |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| X AXIS SETUP |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| X AXIS SETUP |||||||||||||||||||||||||||||||||
//captures the scene on the X axis.
using (CommandBuffer sceneAlbedoCommandBuffer = new CommandBuffer())
{
//create a 2D render texture based off our voxel resolution to capture the scene in the X axis.
RenderTexture voxelPackedCameraSlice = new RenderTexture(voxelResolution.z, voxelResolution.y, renderTextureDepthBits, metaPackedFormat);
voxelPackedCameraSlice.filterMode = FilterMode.Point;
voxelPackedCameraSlice.wrapMode = TextureWrapMode.Clamp;
voxelPackedCameraSlice.enableRandomWrite = true;
voxelCamera.targetTexture = voxelPackedCameraSlice;
voxelCamera.orthographicSize = voxelSize.y * 0.5f;
RenderTexture albedoUnpackedCameraSlice = new RenderTexture(voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, renderTextureDepthBits, metaPackedFormat);
albedoUnpackedCameraSlice.filterMode = FilterMode.Point;
albedoUnpackedCameraSlice.wrapMode = TextureWrapMode.Clamp;
albedoUnpackedCameraSlice.enableRandomWrite = true;
albedoUnpackedCameraSlice.Create();
RenderTexture emissiveUnpackedCameraSlice = new RenderTexture(voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, renderTextureDepthBits, metaPackedFormat);
emissiveUnpackedCameraSlice.filterMode = FilterMode.Point;
emissiveUnpackedCameraSlice.wrapMode = TextureWrapMode.Clamp;
emissiveUnpackedCameraSlice.enableRandomWrite = true;
emissiveUnpackedCameraSlice.Create();
RenderTexture normalUnpackedCameraSlice = new RenderTexture(voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, renderTextureDepthBits, metaPackedFormat);
normalUnpackedCameraSlice.filterMode = FilterMode.Point;
normalUnpackedCameraSlice.wrapMode = TextureWrapMode.Clamp;
normalUnpackedCameraSlice.enableRandomWrite = true;
normalUnpackedCameraSlice.Create();
//||||||||||||||||||||||||||||||||| X POSITIVE AXIS |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| X POSITIVE AXIS |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| X POSITIVE AXIS |||||||||||||||||||||||||||||||||
//orient the voxel camera to face the positive X axis.
voxelCameraGameObject.transform.eulerAngles = new Vector3(0, 90.0f, 0);
for (int i = 0; i < voxelResolution.x; i++)
{
//step through the scene on the X axis
voxelCameraGameObject.transform.position = voxelBounds.center - new Vector3(voxelSize.x / 2.0f, 0, 0) + new Vector3(xOffset * i, 0, 0);
if (sceneVoxelizerType == SceneVoxelizerType.MetaExtraction3Pass)
{
metaPassRendererV1.RenderScene(objectMetaDataV1, voxelCamera, albedoUnpackedCameraSlice, 0);
metaPassRendererV1.RenderScene(objectMetaDataV1, voxelCamera, emissiveUnpackedCameraSlice, 1);
metaPassRendererV1.RenderScene(objectMetaDataV1, voxelCamera, normalUnpackedCameraSlice, 2);
}
else if (sceneVoxelizerType == SceneVoxelizerType.MetaExtraction1Pass)
{
metaPassRendererV2.RenderScene(objectMetaDataV2, voxelCamera, voxelPackedCameraSlice);
metaPassRendererV2.UnpackSceneRender(voxelPackedCameraSlice, albedoUnpackedCameraSlice, emissiveUnpackedCameraSlice, normalUnpackedCameraSlice);
}
//feed the compute shader the appropriate data, and do a dispatch so it can accumulate the scene slice into a 3D texture.
voxelizeScene.SetInt(ShaderIDs.AxisIndex, i);
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "LINEAR_TO_GAMMA", sceneVoxelizerType == SceneVoxelizerType.MetaExtraction3Pass);
//albedo
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "BLEND_SLICES", blendAlbedoVoxelSlices);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_X_POS, ShaderIDs.CameraVoxelRender, albedoUnpackedCameraSlice);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_X_POS, ShaderIDs.Write, sceneAlbedo);
voxelizeScene.Dispatch(ComputeShader_VoxelizeScene_X_POS, voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, 1);
//emissive
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "BLEND_SLICES", blendEmissiveVoxelSlices);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_X_POS, ShaderIDs.CameraVoxelRender, emissiveUnpackedCameraSlice);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_X_POS, ShaderIDs.Write, sceneEmissive);
voxelizeScene.Dispatch(ComputeShader_VoxelizeScene_X_POS, voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, 1);
//normal
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "BLEND_SLICES", blendNormalVoxelSlices);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_X_POS, ShaderIDs.CameraVoxelRender, normalUnpackedCameraSlice);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_X_POS, ShaderIDs.Write, sceneNormal);
voxelizeScene.Dispatch(ComputeShader_VoxelizeScene_X_POS, voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, 1);
}
//||||||||||||||||||||||||||||||||| X NEGATIVE AXIS |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| X NEGATIVE AXIS |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| X NEGATIVE AXIS |||||||||||||||||||||||||||||||||
//orient the voxel camera to face the negative X axis.
voxelCameraGameObject.transform.eulerAngles = new Vector3(0, -90.0f, 0);
for (int i = 0; i < voxelResolution.x; i++)
{
//step through the scene on the X axis
voxelCameraGameObject.transform.position = voxelBounds.center + new Vector3(voxelSize.x / 2.0f, 0, 0) - new Vector3(xOffset * i, 0, 0);
if (sceneVoxelizerType == SceneVoxelizerType.MetaExtraction3Pass)
{
metaPassRendererV1.RenderScene(objectMetaDataV1, voxelCamera, albedoUnpackedCameraSlice, 0);
metaPassRendererV1.RenderScene(objectMetaDataV1, voxelCamera, emissiveUnpackedCameraSlice, 1);
metaPassRendererV1.RenderScene(objectMetaDataV1, voxelCamera, normalUnpackedCameraSlice, 2);
}
else if (sceneVoxelizerType == SceneVoxelizerType.MetaExtraction1Pass)
{
metaPassRendererV2.RenderScene(objectMetaDataV2, voxelCamera, voxelPackedCameraSlice);
metaPassRendererV2.UnpackSceneRender(voxelPackedCameraSlice, albedoUnpackedCameraSlice, emissiveUnpackedCameraSlice, normalUnpackedCameraSlice);
}
//feed the compute shader the appropriate data, and do a dispatch so it can accumulate the scene slice into a 3D texture.
voxelizeScene.SetInt(ShaderIDs.AxisIndex, i);
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "LINEAR_TO_GAMMA", sceneVoxelizerType == SceneVoxelizerType.MetaExtraction3Pass);
//albedo
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "BLEND_SLICES", blendAlbedoVoxelSlices);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_X_NEG, ShaderIDs.CameraVoxelRender, albedoUnpackedCameraSlice);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_X_NEG, ShaderIDs.Write, sceneAlbedo);
voxelizeScene.Dispatch(ComputeShader_VoxelizeScene_X_NEG, voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, 1);
//emissive
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "BLEND_SLICES", blendEmissiveVoxelSlices);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_X_NEG, ShaderIDs.CameraVoxelRender, emissiveUnpackedCameraSlice);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_X_NEG, ShaderIDs.Write, sceneEmissive);
voxelizeScene.Dispatch(ComputeShader_VoxelizeScene_X_NEG, voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, 1);
//normal
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "BLEND_SLICES", blendNormalVoxelSlices);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_X_NEG, ShaderIDs.CameraVoxelRender, normalUnpackedCameraSlice);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_X_NEG, ShaderIDs.Write, sceneNormal);
voxelizeScene.Dispatch(ComputeShader_VoxelizeScene_X_NEG, voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, 1);
}
//release the render texture slice, because we are going to create a new one with new dimensions for the next axis...
voxelPackedCameraSlice.Release();
albedoUnpackedCameraSlice.Release();
emissiveUnpackedCameraSlice.Release();
normalUnpackedCameraSlice.Release();
//||||||||||||||||||||||||||||||||| Y AXIS SETUP |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| Y AXIS SETUP |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| Y AXIS SETUP |||||||||||||||||||||||||||||||||
//captures the scene on the Y axis.
//create a 2D render texture based off our voxel resolution to capture the scene in the Y axis.
voxelPackedCameraSlice = new RenderTexture(voxelResolution.x, voxelResolution.z, renderTextureDepthBits, metaPackedFormat);
voxelPackedCameraSlice.filterMode = FilterMode.Point;
voxelPackedCameraSlice.wrapMode = TextureWrapMode.Clamp;
voxelPackedCameraSlice.enableRandomWrite = true;
voxelCamera.targetTexture = voxelPackedCameraSlice;
voxelCamera.orthographicSize = voxelSize.z * 0.5f;
albedoUnpackedCameraSlice = new RenderTexture(voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, renderTextureDepthBits, metaPackedFormat);
albedoUnpackedCameraSlice.filterMode = FilterMode.Point;
albedoUnpackedCameraSlice.wrapMode = TextureWrapMode.Clamp;
albedoUnpackedCameraSlice.enableRandomWrite = true;
albedoUnpackedCameraSlice.Create();
emissiveUnpackedCameraSlice = new RenderTexture(voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, renderTextureDepthBits, metaPackedFormat);
emissiveUnpackedCameraSlice.filterMode = FilterMode.Point;
emissiveUnpackedCameraSlice.wrapMode = TextureWrapMode.Clamp;
emissiveUnpackedCameraSlice.enableRandomWrite = true;
emissiveUnpackedCameraSlice.Create();
normalUnpackedCameraSlice = new RenderTexture(voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, renderTextureDepthBits, metaPackedFormat);
normalUnpackedCameraSlice.filterMode = FilterMode.Point;
normalUnpackedCameraSlice.wrapMode = TextureWrapMode.Clamp;
normalUnpackedCameraSlice.enableRandomWrite = true;
normalUnpackedCameraSlice.Create();
//||||||||||||||||||||||||||||||||| Y POSITIVE AXIS |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| Y POSITIVE AXIS |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| Y POSITIVE AXIS |||||||||||||||||||||||||||||||||
//orient the voxel camera to face the positive Y axis.
voxelCameraGameObject.transform.eulerAngles = new Vector3(-90.0f, 0, 0);
for (int i = 0; i < voxelResolution.y; i++)
{
//step through the scene on the Y axis
voxelCameraGameObject.transform.position = voxelBounds.center - new Vector3(0, voxelSize.y / 2.0f, 0) + new Vector3(0, yOffset * i, 0);
if (sceneVoxelizerType == SceneVoxelizerType.MetaExtraction3Pass)
{
metaPassRendererV1.RenderScene(objectMetaDataV1, voxelCamera, albedoUnpackedCameraSlice, 0);
metaPassRendererV1.RenderScene(objectMetaDataV1, voxelCamera, emissiveUnpackedCameraSlice, 1);
metaPassRendererV1.RenderScene(objectMetaDataV1, voxelCamera, normalUnpackedCameraSlice, 2);
}
else if (sceneVoxelizerType == SceneVoxelizerType.MetaExtraction1Pass)
{
metaPassRendererV2.RenderScene(objectMetaDataV2, voxelCamera, voxelPackedCameraSlice);
metaPassRendererV2.UnpackSceneRender(voxelPackedCameraSlice, albedoUnpackedCameraSlice, emissiveUnpackedCameraSlice, normalUnpackedCameraSlice);
}
//feed the compute shader the appropriate data, and do a dispatch so it can accumulate the scene slice into a 3D texture.
voxelizeScene.SetInt(ShaderIDs.AxisIndex, i);
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "LINEAR_TO_GAMMA", sceneVoxelizerType == SceneVoxelizerType.MetaExtraction3Pass);
//albedo
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "BLEND_SLICES", blendAlbedoVoxelSlices);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_Y_POS, ShaderIDs.CameraVoxelRender, albedoUnpackedCameraSlice);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_Y_POS, ShaderIDs.Write, sceneAlbedo);
voxelizeScene.Dispatch(ComputeShader_VoxelizeScene_Y_POS, voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, 1);
//emissive
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "BLEND_SLICES", blendEmissiveVoxelSlices);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_Y_POS, ShaderIDs.CameraVoxelRender, emissiveUnpackedCameraSlice);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_Y_POS, ShaderIDs.Write, sceneEmissive);
voxelizeScene.Dispatch(ComputeShader_VoxelizeScene_Y_POS, voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, 1);
//normal
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "BLEND_SLICES", blendNormalVoxelSlices);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_Y_POS, ShaderIDs.CameraVoxelRender, normalUnpackedCameraSlice);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_Y_POS, ShaderIDs.Write, sceneNormal);
voxelizeScene.Dispatch(ComputeShader_VoxelizeScene_Y_POS, voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, 1);
}
//||||||||||||||||||||||||||||||||| Y NEGATIVE AXIS |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| Y NEGATIVE AXIS |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| Y NEGATIVE AXIS |||||||||||||||||||||||||||||||||
//orient the voxel camera to face the negative Y axis.
voxelCameraGameObject.transform.eulerAngles = new Vector3(90.0f, 0, 0);
for (int i = 0; i < voxelResolution.y; i++)
{
//step through the scene on the Y axis
voxelCameraGameObject.transform.position = voxelBounds.center + new Vector3(0, voxelSize.y / 2.0f, 0) - new Vector3(0, yOffset * i, 0);
if (sceneVoxelizerType == SceneVoxelizerType.MetaExtraction3Pass)
{
metaPassRendererV1.RenderScene(objectMetaDataV1, voxelCamera, albedoUnpackedCameraSlice, 0);
metaPassRendererV1.RenderScene(objectMetaDataV1, voxelCamera, emissiveUnpackedCameraSlice, 1);
metaPassRendererV1.RenderScene(objectMetaDataV1, voxelCamera, normalUnpackedCameraSlice, 2);
}
else if (sceneVoxelizerType == SceneVoxelizerType.MetaExtraction1Pass)
{
metaPassRendererV2.RenderScene(objectMetaDataV2, voxelCamera, voxelPackedCameraSlice);
metaPassRendererV2.UnpackSceneRender(voxelPackedCameraSlice, albedoUnpackedCameraSlice, emissiveUnpackedCameraSlice, normalUnpackedCameraSlice);
}
//feed the compute shader the appropriate data, and do a dispatch so it can accumulate the scene slice into a 3D texture.
voxelizeScene.SetInt(ShaderIDs.AxisIndex, i);
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "LINEAR_TO_GAMMA", sceneVoxelizerType == SceneVoxelizerType.MetaExtraction3Pass);
//albedo
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "BLEND_SLICES", blendAlbedoVoxelSlices);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_Y_NEG, ShaderIDs.CameraVoxelRender, albedoUnpackedCameraSlice);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_Y_NEG, ShaderIDs.Write, sceneAlbedo);
voxelizeScene.Dispatch(ComputeShader_VoxelizeScene_Y_NEG, voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, 1);
//emissive
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "BLEND_SLICES", blendEmissiveVoxelSlices);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_Y_NEG, ShaderIDs.CameraVoxelRender, emissiveUnpackedCameraSlice);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_Y_NEG, ShaderIDs.Write, sceneEmissive);
voxelizeScene.Dispatch(ComputeShader_VoxelizeScene_Y_NEG, voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, 1);
//normal
VolumeGeneratorUtility.SetComputeKeyword(voxelizeScene, "BLEND_SLICES", blendNormalVoxelSlices);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_Y_NEG, ShaderIDs.CameraVoxelRender, normalUnpackedCameraSlice);
voxelizeScene.SetTexture(ComputeShader_VoxelizeScene_Y_NEG, ShaderIDs.Write, sceneNormal);
voxelizeScene.Dispatch(ComputeShader_VoxelizeScene_Y_NEG, voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, 1);
}
//release the render texture slice, because we are going to create a new one with new dimensions for the next axis...
voxelPackedCameraSlice.Release();
albedoUnpackedCameraSlice.Release();
emissiveUnpackedCameraSlice.Release();
normalUnpackedCameraSlice.Release();
//||||||||||||||||||||||||||||||||| Z AXIS SETUP |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| Z AXIS SETUP |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| Z AXIS SETUP |||||||||||||||||||||||||||||||||
//captures the scene on the Z axis.
//create a 2D render texture based off our voxel resolution to capture the scene in the Z axis.
voxelPackedCameraSlice = new RenderTexture(voxelResolution.x, voxelResolution.y, renderTextureDepthBits, metaPackedFormat);
voxelPackedCameraSlice.filterMode = FilterMode.Point;
voxelPackedCameraSlice.wrapMode = TextureWrapMode.Clamp;
voxelPackedCameraSlice.enableRandomWrite = true;
voxelCamera.targetTexture = voxelPackedCameraSlice;
voxelCamera.orthographicSize = voxelSize.y * 0.5f;
albedoUnpackedCameraSlice = new RenderTexture(voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, renderTextureDepthBits, metaPackedFormat);
albedoUnpackedCameraSlice.filterMode = FilterMode.Point;
albedoUnpackedCameraSlice.wrapMode = TextureWrapMode.Clamp;
albedoUnpackedCameraSlice.enableRandomWrite = true;
albedoUnpackedCameraSlice.Create();
emissiveUnpackedCameraSlice = new RenderTexture(voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, renderTextureDepthBits, metaPackedFormat);
emissiveUnpackedCameraSlice.filterMode = FilterMode.Point;
emissiveUnpackedCameraSlice.wrapMode = TextureWrapMode.Clamp;
emissiveUnpackedCameraSlice.enableRandomWrite = true;
emissiveUnpackedCameraSlice.Create();
normalUnpackedCameraSlice = new RenderTexture(voxelPackedCameraSlice.width, voxelPackedCameraSlice.height, renderTextureDepthBits, metaPackedFormat);
normalUnpackedCameraSlice.filterMode = FilterMode.Point;
normalUnpackedCameraSlice.wrapMode = TextureWrapMode.Clamp;
normalUnpackedCameraSlice.enableRandomWrite = true;
normalUnpackedCameraSlice.Create();
//||||||||||||||||||||||||||||||||| Z POSITIVE AXIS |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| Z POSITIVE AXIS |||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||| Z POSITIVE AXIS |||||||||||||||||||||||||||||||||
gitextract_z7rokmvj/ ├── .gitignore ├── BakedVolumetrics/ │ ├── .vsconfig │ ├── Assets/ │ │ ├── BakedVolumetrics/ │ │ │ ├── Data.meta │ │ │ ├── OfflineGeneration/ │ │ │ │ ├── Scripts/ │ │ │ │ │ ├── Editor/ │ │ │ │ │ │ ├── BakedVolumetricsTool.cs │ │ │ │ │ │ └── BakedVolumetricsTool.cs.meta │ │ │ │ │ ├── Editor.meta │ │ │ │ │ ├── Enums/ │ │ │ │ │ │ ├── DensityType.cs │ │ │ │ │ │ ├── DensityType.cs.meta │ │ │ │ │ │ ├── EnvironmentMapResolution.cs │ │ │ │ │ │ ├── EnvironmentMapResolution.cs.meta │ │ │ │ │ │ ├── HDREncoding.cs │ │ │ │ │ │ ├── HDREncoding.cs.meta │ │ │ │ │ │ ├── LightAttenuationType.cs │ │ │ │ │ │ ├── LightAttenuationType.cs.meta │ │ │ │ │ │ ├── LightingSource.cs │ │ │ │ │ │ ├── LightingSource.cs.meta │ │ │ │ │ │ ├── RaymarchSamples.cs │ │ │ │ │ │ ├── RaymarchSamples.cs.meta │ │ │ │ │ │ ├── SceneVoxelizerType.cs │ │ │ │ │ │ ├── SceneVoxelizerType.cs.meta │ │ │ │ │ │ ├── VolumeBitDepth.cs │ │ │ │ │ │ ├── VolumeBitDepth.cs.meta │ │ │ │ │ │ ├── VoxelCalculation.cs │ │ │ │ │ │ ├── VoxelCalculation.cs.meta │ │ │ │ │ │ ├── VoxelPreviewAxis.cs │ │ │ │ │ │ └── VoxelPreviewAxis.cs.meta │ │ │ │ │ ├── Enums.meta │ │ │ │ │ ├── MetaPassRenderingV1.cs │ │ │ │ │ ├── MetaPassRenderingV1.cs.meta │ │ │ │ │ ├── MetaPassRenderingV2.cs │ │ │ │ │ ├── MetaPassRenderingV2.cs.meta │ │ │ │ │ ├── NoiseLibrary.cs │ │ │ │ │ ├── NoiseLibrary.cs.meta │ │ │ │ │ ├── RenderTextureConverter.cs │ │ │ │ │ ├── RenderTextureConverter.cs.meta │ │ │ │ │ ├── RenderTextureSize.cs │ │ │ │ │ ├── RenderTextureSize.cs.meta │ │ │ │ │ ├── SampleLightprobe.cs │ │ │ │ │ ├── SampleLightprobe.cs.meta │ │ │ │ │ ├── SampleVoxelTracer.cs │ │ │ │ │ ├── SampleVoxelTracer.cs.meta │ │ │ │ │ ├── ShaderIDs.cs │ │ │ │ │ ├── ShaderIDs.cs.meta │ │ │ │ │ ├── Structs/ │ │ │ │ │ │ ├── MaterialMetaDataV1.cs │ │ │ │ │ │ ├── MaterialMetaDataV1.cs.meta │ │ │ │ │ │ ├── MaterialMetaDataV2.cs │ │ │ │ │ │ ├── MaterialMetaDataV2.cs.meta │ │ │ │ │ │ ├── ObjectMetaDataV1.cs │ │ │ │ │ │ ├── ObjectMetaDataV1.cs.meta │ │ │ │ │ │ ├── ObjectMetaDataV2.cs │ │ │ │ │ │ ├── ObjectMetaDataV2.cs.meta │ │ │ │ │ │ ├── VoxelLightArea.cs │ │ │ │ │ │ ├── VoxelLightArea.cs.meta │ │ │ │ │ │ ├── VoxelLightDirectional.cs │ │ │ │ │ │ ├── VoxelLightDirectional.cs.meta │ │ │ │ │ │ ├── VoxelLightPoint.cs │ │ │ │ │ │ ├── VoxelLightPoint.cs.meta │ │ │ │ │ │ ├── VoxelLightSpot.cs │ │ │ │ │ │ └── VoxelLightSpot.cs.meta │ │ │ │ │ ├── Structs.meta │ │ │ │ │ ├── VolumeGenerator.cs │ │ │ │ │ ├── VolumeGenerator.cs.meta │ │ │ │ │ ├── VolumeGeneratorAssets.cs │ │ │ │ │ ├── VolumeGeneratorAssets.cs.meta │ │ │ │ │ ├── VolumeGeneratorEditor.cs │ │ │ │ │ ├── VolumeGeneratorEditor.cs.meta │ │ │ │ │ ├── VolumeGeneratorUtility.cs │ │ │ │ │ └── VolumeGeneratorUtility.cs.meta │ │ │ │ ├── Scripts.meta │ │ │ │ ├── Shaders/ │ │ │ │ │ ├── Adjustments.compute │ │ │ │ │ ├── Adjustments.compute.meta │ │ │ │ │ ├── BitPackingHelper.cginc │ │ │ │ │ ├── BitPackingHelper.cginc.meta │ │ │ │ │ ├── CombineBuffers.compute │ │ │ │ │ ├── CombineBuffers.compute.meta │ │ │ │ │ ├── ComputeTextureSampling.cginc │ │ │ │ │ ├── ComputeTextureSampling.cginc.meta │ │ │ │ │ ├── DataPacking.compute │ │ │ │ │ ├── DataPacking.compute.meta │ │ │ │ │ ├── Density.compute │ │ │ │ │ ├── Density.compute.meta │ │ │ │ │ ├── Dilation.compute │ │ │ │ │ ├── Dilation.compute.meta │ │ │ │ │ ├── EncodingDecodingHDR.cginc │ │ │ │ │ ├── EncodingDecodingHDR.cginc.meta │ │ │ │ │ ├── EncodingDecodingNormal.cginc │ │ │ │ │ ├── EncodingDecodingNormal.cginc.meta │ │ │ │ │ ├── GaussianBlur3D.compute │ │ │ │ │ ├── GaussianBlur3D.compute.meta │ │ │ │ │ ├── HDRPacking.compute │ │ │ │ │ ├── HDRPacking.compute.meta │ │ │ │ │ ├── MetaPassPacking.cginc │ │ │ │ │ ├── MetaPassPacking.cginc.meta │ │ │ │ │ ├── Random.cginc │ │ │ │ │ ├── Random.cginc.meta │ │ │ │ │ ├── Sampling.cginc │ │ │ │ │ ├── Sampling.cginc.meta │ │ │ │ │ ├── SceneObjectShaderV1.shader │ │ │ │ │ ├── SceneObjectShaderV1.shader.meta │ │ │ │ │ ├── SceneObjectShaderV2.shader │ │ │ │ │ ├── SceneObjectShaderV2.shader.meta │ │ │ │ │ ├── UnityLights.cginc │ │ │ │ │ ├── UnityLights.cginc.meta │ │ │ │ │ ├── VoxelBounceSurfaceLight.compute │ │ │ │ │ ├── VoxelBounceSurfaceLight.compute.meta │ │ │ │ │ ├── VoxelBounceVolumetricLight.compute │ │ │ │ │ ├── VoxelBounceVolumetricLight.compute.meta │ │ │ │ │ ├── VoxelDirectSurfaceLight.compute │ │ │ │ │ ├── VoxelDirectSurfaceLight.compute.meta │ │ │ │ │ ├── VoxelDirectVolumetricLight.compute │ │ │ │ │ ├── VoxelDirectVolumetricLight.compute.meta │ │ │ │ │ ├── VoxelEnvironmentSurfaceLight.compute │ │ │ │ │ ├── VoxelEnvironmentSurfaceLight.compute.meta │ │ │ │ │ ├── VoxelEnvironmentVolumetricLight.compute │ │ │ │ │ ├── VoxelEnvironmentVolumetricLight.compute.meta │ │ │ │ │ ├── VoxelTracerUtilities.cginc │ │ │ │ │ ├── VoxelTracerUtilities.cginc.meta │ │ │ │ │ ├── VoxelizeScene.compute │ │ │ │ │ └── VoxelizeScene.compute.meta │ │ │ │ └── Shaders.meta │ │ │ ├── OfflineGeneration.meta │ │ │ ├── Runtime/ │ │ │ │ ├── Scripts/ │ │ │ │ │ ├── CameraDepth.cs │ │ │ │ │ ├── CameraDepth.cs.meta │ │ │ │ │ ├── PostProcessing/ │ │ │ │ │ │ ├── ComputeShaderParameter.cs │ │ │ │ │ │ ├── ComputeShaderParameter.cs.meta │ │ │ │ │ │ ├── ShaderIDs.cs │ │ │ │ │ │ ├── ShaderIDs.cs.meta │ │ │ │ │ │ ├── V1/ │ │ │ │ │ │ │ ├── BakedVolumetricsV1.cs │ │ │ │ │ │ │ ├── BakedVolumetricsV1.cs.meta │ │ │ │ │ │ │ ├── BakedVolumetricsV1Renderer.cs │ │ │ │ │ │ │ └── BakedVolumetricsV1Renderer.cs.meta │ │ │ │ │ │ ├── V1.meta │ │ │ │ │ │ ├── V2/ │ │ │ │ │ │ │ ├── BakedVolumetricsV2.cs │ │ │ │ │ │ │ ├── BakedVolumetricsV2.cs.meta │ │ │ │ │ │ │ ├── BakedVolumetricsV2Renderer.cs │ │ │ │ │ │ │ └── BakedVolumetricsV2Renderer.cs.meta │ │ │ │ │ │ ├── V2.meta │ │ │ │ │ │ ├── V3/ │ │ │ │ │ │ │ ├── BakedVolumetricsV3.cs │ │ │ │ │ │ │ ├── BakedVolumetricsV3.cs.meta │ │ │ │ │ │ │ ├── BakedVolumetricsV3Renderer.cs │ │ │ │ │ │ │ ├── BakedVolumetricsV3Renderer.cs.meta │ │ │ │ │ │ │ ├── BakedVolumetricsV3SingleVolume.cs │ │ │ │ │ │ │ ├── BakedVolumetricsV3SingleVolume.cs.meta │ │ │ │ │ │ │ ├── BakedVolumetricsV3VolumeArrayParameter.cs │ │ │ │ │ │ │ └── BakedVolumetricsV3VolumeArrayParameter.cs.meta │ │ │ │ │ │ ├── V3.meta │ │ │ │ │ │ ├── V4/ │ │ │ │ │ │ │ ├── BakedVolumetricsV4.cs │ │ │ │ │ │ │ ├── BakedVolumetricsV4.cs.meta │ │ │ │ │ │ │ ├── BakedVolumetricsV4Renderer.cs │ │ │ │ │ │ │ └── BakedVolumetricsV4Renderer.cs.meta │ │ │ │ │ │ └── V4.meta │ │ │ │ │ └── PostProcessing.meta │ │ │ │ ├── Scripts.meta │ │ │ │ ├── Shaders/ │ │ │ │ │ ├── PostV1/ │ │ │ │ │ │ ├── BakedVolumetricsV1.shader │ │ │ │ │ │ └── BakedVolumetricsV1.shader.meta │ │ │ │ │ ├── PostV1.meta │ │ │ │ │ ├── PostV2/ │ │ │ │ │ │ ├── BakedVolumetricsV2.shader │ │ │ │ │ │ └── BakedVolumetricsV2.shader.meta │ │ │ │ │ ├── PostV2.meta │ │ │ │ │ ├── PostV3/ │ │ │ │ │ │ ├── BakedVolumetricsV3.shader │ │ │ │ │ │ └── BakedVolumetricsV3.shader.meta │ │ │ │ │ ├── PostV3.meta │ │ │ │ │ ├── PostV4.meta │ │ │ │ │ ├── PostV5.meta │ │ │ │ │ ├── Scene/ │ │ │ │ │ │ ├── FogRealtimeExperiment.shader │ │ │ │ │ │ ├── FogRealtimeExperiment.shader.meta │ │ │ │ │ │ ├── QuadIntrinsics.cginc │ │ │ │ │ │ ├── QuadIntrinsics.cginc.meta │ │ │ │ │ │ ├── SceneVolumetricFog.shader │ │ │ │ │ │ ├── SceneVolumetricFog.shader.meta │ │ │ │ │ │ ├── SceneVolumetricFog_LPPV.shader │ │ │ │ │ │ ├── SceneVolumetricFog_LPPV.shader.meta │ │ │ │ │ │ ├── ShaderNotes.txt │ │ │ │ │ │ └── ShaderNotes.txt.meta │ │ │ │ │ └── Scene.meta │ │ │ │ └── Shaders.meta │ │ │ └── Runtime.meta │ │ ├── BakedVolumetrics.meta │ │ ├── CubemapFog.meta │ │ ├── CustomBloom.meta │ │ ├── Editor.meta │ │ ├── ProductionSky.meta │ │ ├── RPG_FPS_game_assets_industrial.meta │ │ ├── Scenes/ │ │ │ ├── VolumetricsScene/ │ │ │ │ ├── LightingData.asset │ │ │ │ ├── LightingData.asset.meta │ │ │ │ ├── Lightmap-0_comp_light.exr │ │ │ │ ├── Lightmap-0_comp_light.exr.meta │ │ │ │ ├── Lightmap-1_comp_light.exr │ │ │ │ ├── Lightmap-1_comp_light.exr.meta │ │ │ │ ├── Lightmap-2_comp_light.exr │ │ │ │ ├── Lightmap-2_comp_light.exr.meta │ │ │ │ ├── Lightmap-3_comp_light.exr │ │ │ │ ├── Lightmap-3_comp_light.exr.meta │ │ │ │ ├── Lightmap-4_comp_light.exr │ │ │ │ ├── Lightmap-4_comp_light.exr.meta │ │ │ │ ├── Lightmap-5_comp_light.exr │ │ │ │ ├── Lightmap-5_comp_light.exr.meta │ │ │ │ ├── ReflectionProbe-0.exr │ │ │ │ ├── ReflectionProbe-0.exr.meta │ │ │ │ ├── VolumetricsScene_LightProbePlacement.asset │ │ │ │ └── VolumetricsScene_LightProbePlacement.asset.meta │ │ │ ├── VolumetricsScene.giparams │ │ │ ├── VolumetricsScene.giparams.meta │ │ │ ├── VolumetricsScene.lighting │ │ │ ├── VolumetricsScene.lighting.meta │ │ │ ├── VolumetricsScene.meta │ │ │ ├── VolumetricsScene.unity │ │ │ ├── VolumetricsScene.unity.meta │ │ │ ├── VolumetricsScene_Profiles/ │ │ │ │ ├── Post-process Volume Profile.asset │ │ │ │ └── Post-process Volume Profile.asset.meta │ │ │ └── VolumetricsScene_Profiles.meta │ │ ├── Scenes.meta │ │ ├── Shaders/ │ │ │ ├── ProBuilderDiffuse.mat │ │ │ ├── ProBuilderDiffuse.mat.meta │ │ │ ├── ProBuilderStandard.mat │ │ │ ├── ProBuilderStandard.mat.meta │ │ │ ├── SimpleLightmapDiffuse.shader │ │ │ └── SimpleLightmapDiffuse.shader.meta │ │ ├── Shaders.meta │ │ ├── XR.meta │ │ └── XRI.meta │ ├── Packages/ │ │ ├── manifest.json │ │ └── packages-lock.json │ ├── ProjectSettings/ │ │ ├── AudioManager.asset │ │ ├── BurstAotSettings_Android.json │ │ ├── ClusterInputManager.asset │ │ ├── CommonBurstAotSettings.json │ │ ├── DynamicsManager.asset │ │ ├── EditorBuildSettings.asset │ │ ├── EditorSettings.asset │ │ ├── GraphicsSettings.asset │ │ ├── InputManager.asset │ │ ├── NavMeshAreas.asset │ │ ├── PackageManagerSettings.asset │ │ ├── Packages/ │ │ │ └── com.unity.probuilder/ │ │ │ └── Settings.json │ │ ├── Physics2DSettings.asset │ │ ├── PresetManager.asset │ │ ├── ProjectSettings.asset │ │ ├── ProjectVersion.txt │ │ ├── QualitySettings.asset │ │ ├── SceneTemplateSettings.json │ │ ├── TagManager.asset │ │ ├── TimeManager.asset │ │ ├── TimelineSettings.asset │ │ ├── UnityConnectSettings.asset │ │ ├── VFXManager.asset │ │ ├── VersionControlSettings.asset │ │ ├── XRPackageSettings.asset │ │ └── XRSettings.asset │ └── UserSettings/ │ └── EditorUserSettings.asset ├── LICENSE └── README.md
SYMBOL INDEX (161 symbols across 44 files)
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Editor/BakedVolumetricsTool.cs
class BakedVolumetricsTool (line 11) | public class BakedVolumetricsTool : EditorWindow
method ShowWindow (line 21) | [MenuItem("Baked Volumetrics/Setup")]
method OnGUI (line 31) | void OnGUI()
method CreateVolume (line 48) | public void CreateVolume()
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/DensityType.cs
type DensityType (line 4) | public enum DensityType
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/EnvironmentMapResolution.cs
type EnvironmentMapResolution (line 4) | public enum EnvironmentMapResolution
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/HDREncoding.cs
type HDREncoding (line 4) | public enum HDREncoding
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/LightAttenuationType.cs
type LightAttenuationType (line 4) | public enum LightAttenuationType
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/LightingSource.cs
type LightingSource (line 4) | public enum LightingSource
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/RaymarchSamples.cs
type RaymarchSamples (line 4) | public enum RaymarchSamples
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/SceneVoxelizerType.cs
type SceneVoxelizerType (line 4) | public enum SceneVoxelizerType
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VolumeBitDepth.cs
type VolumeBitDepth (line 4) | public enum VolumeBitDepth
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VoxelCalculation.cs
type VoxelCalculation (line 4) | public enum VoxelCalculation
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VoxelPreviewAxis.cs
type VoxelPreviewAxis (line 4) | public enum VoxelPreviewAxis
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/MetaPassRenderingV1.cs
class MetaPassRenderingV1 (line 10) | public class MetaPassRenderingV1
method MetaPassRenderingV1 (line 108) | public MetaPassRenderingV1(VolumeGeneratorAssets volumeGeneratorAssets)
method ExtractSceneObjectMetaBuffers (line 121) | public List<ObjectMetaDataV1> ExtractSceneObjectMetaBuffers()
method CleanUpSceneObjectMetaBuffers (line 378) | public void CleanUpSceneObjectMetaBuffers(List<ObjectMetaDataV1> objec...
method RenderScene (line 388) | public void RenderScene(List<ObjectMetaDataV1> sceneObjectMetaData, Ca...
method GetRenderersAfterLOD0 (line 480) | public static Renderer[] GetRenderersAfterLOD0(LODGroup lodGroup)
method GetRendererHashCodes (line 519) | public static int[] GetRendererHashCodes(Renderer[] renderers)
method GetRendererHashCodesAfterLOD0 (line 534) | public static int[] GetRendererHashCodesAfterLOD0(LODGroup lodGroup)
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/MetaPassRenderingV2.cs
class MetaPassRenderingV2 (line 10) | public class MetaPassRenderingV2
method MetaPassRenderingV2 (line 98) | public MetaPassRenderingV2(VolumeGeneratorAssets volumeGeneratorAssets)
method ExtractSceneObjectMetaBuffers (line 111) | public List<ObjectMetaDataV2> ExtractSceneObjectMetaBuffers()
method CleanUpSceneObjectMetaBuffers (line 397) | public void CleanUpSceneObjectMetaBuffers(List<ObjectMetaDataV2> objec...
method RenderScene (line 407) | public void RenderScene(List<ObjectMetaDataV2> sceneObjectMetaData, Ca...
method UnpackSceneRender (line 476) | public void UnpackSceneRender(RenderTexture packedRenderTexture, Rende...
method GetRenderersAfterLOD0 (line 498) | public static Renderer[] GetRenderersAfterLOD0(LODGroup lodGroup)
method GetRendererHashCodes (line 537) | public static int[] GetRendererHashCodes(Renderer[] renderers)
method GetRendererHashCodesAfterLOD0 (line 552) | public static int[] GetRendererHashCodesAfterLOD0(LODGroup lodGroup)
method SetHDREncodingKeywords (line 566) | public static void SetHDREncodingKeywords(ComputeShader computeShader,...
method SetHDREncodingKeywords (line 574) | public static void SetHDREncodingKeywords(Material material, HDREncodi...
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/NoiseLibrary.cs
class NoiseLibrary (line 9) | public static class NoiseLibrary
method GetRandomNoise (line 13) | public static Texture2D GetRandomNoise()
method GetBlueNoise (line 49) | public static Texture2D GetBlueNoise()
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/RenderTextureConverter.cs
class RenderTextureConverter (line 14) | public class RenderTextureConverter
method ConvertRenderTexture2DToTexture2D (line 19) | public Texture2D ConvertRenderTexture2DToTexture2D(RenderTexture rende...
method SaveRenderTexture2DAsTexture2D (line 46) | public void SaveRenderTexture2DAsTexture2D(RenderTexture renderTexture...
method SaveAsyncRenderTexture2DAsTexture2D (line 53) | public void SaveAsyncRenderTexture2DAsTexture2D(RenderTexture renderTe...
method ConvertRenderTexture3DToTexture3D (line 77) | public Texture3D ConvertRenderTexture3DToTexture3D(RenderTexture rende...
method SaveRenderTexture3DAsTexture3D (line 105) | public void SaveRenderTexture3DAsTexture3D(RenderTexture renderTexture...
method SaveRenderTexture3DAsTexture3D (line 112) | public void SaveRenderTexture3DAsTexture3D(RenderTexture renderTexture...
method SaveRenderTexture3DAsTexture3D (line 124) | public void SaveRenderTexture3DAsTexture3D(RenderTexture renderTexture...
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/RenderTextureSize.cs
class RenderTextureSize (line 9) | public static class RenderTextureSize
method GetRenderTextureFormatChannelCount (line 11) | public static int GetRenderTextureFormatChannelCount(RenderTextureForm...
method GetRenderTextureMemorySize (line 88) | public static ulong GetRenderTextureMemorySize(RenderTexture renderTex...
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/SampleLightprobe.cs
class SampleLightprobe (line 14) | public class SampleLightprobe
method SampleLightprobe (line 58) | public SampleLightprobe(VolumeGenerator volumeGenerator, VolumeGenerat...
method GetFinalGeneratedVolume (line 70) | public Texture3D GetFinalGeneratedVolume() => AssetDatabase.LoadAssetA...
method GenerateVolume (line 76) | public void GenerateVolume()
method SetupSceneColliders (line 274) | public void SetupSceneColliders()
method RemoveSceneColliders (line 302) | public void RemoveSceneColliders()
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/SampleVoxelTracer.cs
class SampleVoxelTracer (line 30) | public class SampleVoxelTracer
method SampleVoxelTracer (line 318) | public SampleVoxelTracer(VolumeGenerator volumeGenerator, VolumeGenera...
method GetFinalGeneratedVolume (line 326) | public Texture3D GetFinalGeneratedVolume() => AssetDatabase.LoadAssetA...
method GetGeneratedContent (line 332) | public void GetGeneratedContent()
method CleanUpGeneratedContent (line 355) | public void CleanUpGeneratedContent()
method BuildLightComputeBuffers (line 407) | public void BuildLightComputeBuffers()
method CreateVoxelCamera (line 522) | public void CreateVoxelCamera()
method CleanupVoxelCamera (line 546) | public void CleanupVoxelCamera()
method GenerateAlbedoEmissiveNormalBuffers (line 572) | public void GenerateAlbedoEmissiveNormalBuffers()
method CaptureEnvironment (line 1113) | public void CaptureEnvironment()
method TraceDirectSurfaceLighting (line 1144) | public void TraceDirectSurfaceLighting()
method TraceDirectVolumeLighting (line 1285) | public void TraceDirectVolumeLighting()
method TraceEnvironmentSurfaceLighting (line 1454) | public void TraceEnvironmentSurfaceLighting()
method TraceEnvironmentVolumeLighting (line 1575) | public void TraceEnvironmentVolumeLighting()
method CombineDirectSurfaceLightingTerms (line 1723) | public void CombineDirectSurfaceLightingTerms()
method TraceBounceSurfaceLighting (line 1850) | public void TraceBounceSurfaceLighting()
method TraceBounceVolumeLighting (line 1976) | public void TraceBounceVolumeLighting()
method CombineVolumeLighting (line 2155) | public void CombineVolumeLighting()
method GenerateVolume (line 2218) | public void GenerateVolume()
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/ShaderIDs.cs
class ShaderIDs (line 6) | public static class ShaderIDs
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/MaterialMetaDataV1.cs
type MaterialMetaDataV1 (line 11) | public struct MaterialMetaDataV1
method ReleaseTextures (line 16) | public void ReleaseTextures()
method isEmpty (line 25) | public bool isEmpty() => albedoBuffer == null || emissiveBuffer == null;
method GetDebugMemorySize (line 27) | public long GetDebugMemorySize()
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/MaterialMetaDataV2.cs
type MaterialMetaDataV2 (line 11) | public struct MaterialMetaDataV2
method ReleaseTextures (line 15) | public void ReleaseTextures()
method isEmpty (line 21) | public bool isEmpty() => packedMetaBuffer == null;
method GetDebugMemorySize (line 23) | public long GetDebugMemorySize() => Profiler.GetRuntimeMemorySizeLong(...
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/ObjectMetaDataV1.cs
type ObjectMetaDataV1 (line 9) | public struct ObjectMetaDataV1
method CleanUp (line 16) | public void CleanUp()
method GetDebugMemorySize (line 29) | public long GetDebugMemorySize()
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/ObjectMetaDataV2.cs
type ObjectMetaDataV2 (line 9) | public struct ObjectMetaDataV2
method CleanUp (line 16) | public void CleanUp()
method GetDebugMemorySize (line 29) | public long GetDebugMemorySize()
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/VoxelLightArea.cs
type VoxelLightArea (line 12) | public struct VoxelLightArea
method GetByteSize (line 31) | public static int GetByteSize() => Marshal.SizeOf(typeof(VoxelLightAre...
method VoxelLightArea (line 37) | public VoxelLightArea(Light areaLight)
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/VoxelLightDirectional.cs
type VoxelLightDirectional (line 12) | public struct VoxelLightDirectional
method GetByteSize (line 26) | public static int GetByteSize() => Marshal.SizeOf(typeof(VoxelLightDir...
method VoxelLightDirectional (line 32) | public VoxelLightDirectional(Light directionalLight)
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/VoxelLightPoint.cs
type VoxelLightPoint (line 12) | public struct VoxelLightPoint
method GetByteSize (line 23) | public static int GetByteSize() => Marshal.SizeOf(typeof(VoxelLightPoi...
method VoxelLightPoint (line 29) | public VoxelLightPoint(Light pointLight)
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/VoxelLightSpot.cs
type VoxelLightSpot (line 12) | public struct VoxelLightSpot
method GetByteSize (line 25) | public static int GetByteSize() => Marshal.SizeOf(typeof(VoxelLightSpo...
method VoxelLightSpot (line 31) | public VoxelLightSpot(Light spotLight)
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/VolumeGenerator.cs
class VolumeGenerator (line 17) | public class VolumeGenerator : MonoBehaviour
method GetTotalVoxelCount (line 99) | public int GetTotalVoxelCount() => volumeResolution.x * volumeResoluti...
method GetVoxelResolution (line 101) | public Vector3Int GetVoxelResolution() => volumeResolution;
method GetVolumeSpaceUsage (line 103) | public long GetVolumeSpaceUsage()
method GetGeneratedVolume (line 113) | public Texture3D GetGeneratedVolume()
method GetFinalVolume (line 123) | public Texture3D GetFinalVolume() => AssetDatabase.LoadAssetAtPath<Tex...
method GetDensityVolume (line 125) | public Texture3D GetDensityVolume() => AssetDatabase.LoadAssetAtPath<T...
method GetTextureFormat (line 127) | public TextureFormat GetTextureFormat()
method GetRenderTextureFormat (line 144) | public RenderTextureFormat GetRenderTextureFormat()
method GetEmptyVolumeTexture (line 161) | public Texture3D GetEmptyVolumeTexture() => new Texture3D(GetVoxelReso...
method Setup (line 167) | public void Setup()
method SetupSceneObjectVolume (line 184) | public void SetupSceneObjectVolume()
method GenerateVolume (line 222) | public void GenerateVolume()
method UpdateMaterial (line 275) | public void UpdateMaterial()
method CalculateResolution (line 350) | private void CalculateResolution()
method GenerateLightProbeGroup (line 358) | public void GenerateLightProbeGroup()
method CheckForLightProbes (line 406) | public bool CheckForLightProbes()
method ApplyAdjustments (line 413) | public void ApplyAdjustments(Texture3D volumeRead)
method ApplyDensity (line 483) | public void ApplyDensity(Texture3D volumeRead, bool generateSeperateTe...
method OnDrawGizmos (line 566) | private void OnDrawGizmos()
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/VolumeGeneratorAssets.cs
class VolumeGeneratorAssets (line 8) | public class VolumeGeneratorAssets
method GetResources (line 56) | public void GetResources()
method HasResources (line 79) | public bool HasResources()
method PrepareAssetFolders (line 165) | public bool PrepareAssetFolders()
method GetVolumeMaterial (line 186) | public Material GetVolumeMaterial(string volumeName)
method GetVolume_LPPV_Material (line 211) | public Material GetVolume_LPPV_Material(string volumeName)
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/VolumeGeneratorEditor.cs
class VolumeGeneratorEditor (line 15) | [CustomEditor(typeof(VolumeGenerator))]
method VolumePropertiesUI (line 35) | private void VolumePropertiesUI()
method VolumeQualityUI (line 46) | private void VolumeQualityUI()
method VolumeRenderingUI (line 77) | private void VolumeRenderingUI()
method VolumeDensityUI (line 115) | private void VolumeDensityUI()
method SampleLightprobeUI (line 200) | private void SampleLightprobeUI()
method SampleVoxelTracer (line 235) | private void SampleVoxelTracer()
method ApplyPostUI (line 496) | private void ApplyPostUI()
method GizmosUI (line 529) | private void GizmosUI()
method OnInspectorGUI (line 547) | public override void OnInspectorGUI()
FILE: BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/VolumeGeneratorUtility.cs
class VolumeGeneratorUtility (line 9) | public static class VolumeGeneratorUtility
method UpdateProgressBar (line 11) | public static void UpdateProgressBar(string description, float progres...
method CloseProgressBar (line 13) | public static void CloseProgressBar() => EditorUtility.ClearProgressBa...
method ContainBounds (line 15) | public static bool ContainBounds(Bounds bounds, Bounds target) => boun...
method SetComputeKeyword (line 17) | public static void SetComputeKeyword(ComputeShader computeShader, stri...
method SetMaterialKeyword (line 25) | public static void SetMaterialKeyword(Material material, string keywor...
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/CameraDepth.cs
class CameraDepth (line 12) | [ExecuteInEditMode]
method Awake (line 49) | private void Awake()
method Update (line 57) | private void Update()
method OnEnable (line 63) | private void OnEnable()
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/ComputeShaderParameter.cs
class ComputeShaderParameter (line 9) | [Serializable]
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/ShaderIDs.cs
class ShaderIDs (line 12) | public static class ShaderIDs
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V1/BakedVolumetricsV1.cs
class BakedVolumetricsV1 (line 20) | [Serializable]
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V1/BakedVolumetricsV1Renderer.cs
class BakedVolumetricsV1Renderer (line 20) | public sealed class BakedVolumetricsV1Renderer : PostProcessEffectRender...
method Render (line 22) | public override void Render(PostProcessRenderContext context)
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V2/BakedVolumetricsV2.cs
class BakedVolumetricsV2 (line 26) | [Serializable]
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V2/BakedVolumetricsV2Renderer.cs
class BakedVolumetricsV2Renderer (line 10) | public sealed class BakedVolumetricsV2Renderer : PostProcessEffectRender...
method Render (line 12) | public override void Render(PostProcessRenderContext context)
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3/BakedVolumetricsV3.cs
class BakedVolumetricsV3 (line 10) | [Serializable]
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3/BakedVolumetricsV3Renderer.cs
class BakedVolumetricsV3Renderer (line 11) | public sealed class BakedVolumetricsV3Renderer : PostProcessEffectRender...
method Render (line 13) | public override void Render(PostProcessRenderContext context)
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3/BakedVolumetricsV3SingleVolume.cs
class BakedVolumetricsV3SingleVolume (line 10) | [Serializable]
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3/BakedVolumetricsV3VolumeArrayParameter.cs
class BakedVolumetricsV3VolumeArrayParameter (line 10) | [Serializable]
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V4/BakedVolumetricsV4.cs
class BakedVolumetricsV4 (line 10) | [Serializable]
FILE: BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V4/BakedVolumetricsV4Renderer.cs
class BakedVolumetricsV4Renderer (line 10) | public sealed class BakedVolumetricsV4Renderer : PostProcessEffectRender...
method Render (line 12) | public override void Render(PostProcessRenderContext context)
Copy disabled (too large)
Download .json
Condensed preview — 252 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,808K chars).
[
{
"path": ".gitignore",
"chars": 2062,
"preview": "# This .gitignore file should be placed at the root of your Unity project directory\n#\n# Get latest from https://github.c"
},
{
"path": "BakedVolumetrics/.vsconfig",
"chars": 97,
"preview": "{\n \"version\": \"1.0\",\n \"components\": [\n \"Microsoft.VisualStudio.Workload.ManagedGame\"\n ]\n}\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Data.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 2493f939ee61ce942a7836eeea8a000a\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Editor/BakedVolumetricsTool.cs",
"chars": 1708,
"preview": "#if UNITY_EDITOR\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing UnityEngine;\nusin"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Editor/BakedVolumetricsTool.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 3baed212f309edc449d41a77e3f203a2\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Editor.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 652cacc7ea4499748bc9b87c5f693928\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/DensityType.cs",
"chars": 188,
"preview": "#if UNITY_EDITOR\nnamespace BakedVolumetricsOffline\n{\n public enum DensityType\n {\n Constant,\n Luminan"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/DensityType.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: e4d479c8ee192d44b80e56962677f8fc\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/EnvironmentMapResolution.cs",
"chars": 291,
"preview": "#if UNITY_EDITOR\nnamespace BakedVolumetrics\n{\n public enum EnvironmentMapResolution\n {\n _32 = 32,\n _"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/EnvironmentMapResolution.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: d86d25fdd5383f44294af89bc9ff927c\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/HDREncoding.cs",
"chars": 162,
"preview": "#if UNITY_EDITOR\nnamespace BakedVolumetricsOffline\n{\n public enum HDREncoding\n {\n RGBM,\n RGBD,\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/HDREncoding.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 88f58f012cdc552458b80c1b26d61fa2\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/LightAttenuationType.cs",
"chars": 184,
"preview": "#if UNITY_EDITOR\nnamespace BakedVolumetricsOffline\n{\n public enum LightAttenuationType\n {\n UnityFalloff,\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/LightAttenuationType.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: c98a680c57a1ca949afd0e186c48b3f1\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/LightingSource.cs",
"chars": 177,
"preview": "#if UNITY_EDITOR\nnamespace BakedVolumetricsOffline\n{\n public enum LightingSource\n {\n LightProbes,\n L"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/LightingSource.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 0eb8ff02c96ecbc43820aa7802066a2c\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/RaymarchSamples.cs",
"chars": 196,
"preview": "#if UNITY_EDITOR\nnamespace BakedVolumetricsOffline\n{\n public enum RaymarchSamples\n {\n _8,\n _16,\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/RaymarchSamples.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 6b2fec1a70de2b341be2b6e5f2a117eb\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/SceneVoxelizerType.cs",
"chars": 214,
"preview": "#if UNITY_EDITOR\nnamespace BakedVolumetricsOffline\n{\n public enum SceneVoxelizerType\n {\n MetaExtraction3Pas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/SceneVoxelizerType.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 294a1a616c5b47142abad2dd622cd902\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VolumeBitDepth.cs",
"chars": 164,
"preview": "#if UNITY_EDITOR\nnamespace BakedVolumetricsOffline\n{\n public enum VolumeBitDepth\n {\n RGB8,\n RGBA8,\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VolumeBitDepth.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 496c832b60017054b82b981d8aa7b43f\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VoxelCalculation.cs",
"chars": 140,
"preview": "#if UNITY_EDITOR\nnamespace BakedVolumetricsOffline\n{\n public enum VoxelCalculation\n {\n Custom,\n Auto"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VoxelCalculation.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 84f1a27c6f1798748a92f5d8046e0637\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VoxelPreviewAxis.cs",
"chars": 138,
"preview": "#if UNITY_EDITOR\nnamespace BakedVolumetricsOffline\n{\n public enum VoxelPreviewAxis\n {\n X,\n Y,\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums/VoxelPreviewAxis.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: bed3395e3eb23cd4d95f79536c82faad\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Enums.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 226031ea146f3fa4589331a567affa0f\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/MetaPassRenderingV1.cs",
"chars": 35316,
"preview": "#if UNITY_EDITOR\nusing System;\nusing System.Collections.Generic;\nusing UnityEditor;\nusing UnityEngine;\nusing UnityEngine"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/MetaPassRenderingV1.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: e61e4bdc66f5967479499e3df5024d3b\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/MetaPassRenderingV2.cs",
"chars": 38463,
"preview": "#if UNITY_EDITOR\nusing System;\nusing System.Collections.Generic;\nusing UnityEditor;\nusing UnityEngine;\nusing UnityEngine"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/MetaPassRenderingV2.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 2381c032992e5cd4ebf5f9cb6b40e29e\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/NoiseLibrary.cs",
"chars": 2271,
"preview": "#if UNITY_EDITOR\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEditor;\nusing UnityEngine;\n\nname"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/NoiseLibrary.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 789a4571d277d034cb5dfff9406d399a\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/RenderTextureConverter.cs",
"chars": 7301,
"preview": "#if UNITY_EDITOR\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine.Rendering;\nusing UnityEng"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/RenderTextureConverter.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: aa5818da501db1d45848d25f24cfde5c\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/RenderTextureSize.cs",
"chars": 11453,
"preview": "#if UNITY_EDITOR\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.Experi"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/RenderTextureSize.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: fa186bf571a241f43a97230884bb28b9\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/SampleLightprobe.cs",
"chars": 18332,
"preview": "#if UNITY_EDITOR\nusing System.Collections.Generic;\nusing UnityEditor.SceneManagement;\nusing UnityEditor;\nusing UnityEng"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/SampleLightprobe.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 27f8e1eb4cc4b524d9713690abcd9f12\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/SampleVoxelTracer.cs",
"chars": 160791,
"preview": "#if UNITY_EDITOR\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Runtime.Constrai"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/SampleVoxelTracer.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: d7e894e3f1af67646ad8675ff281b1d4\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/ShaderIDs.cs",
"chars": 3860,
"preview": "#if UNITY_EDITOR\nusing UnityEngine;\n\nnamespace BakedVolumetricsOffline\n{\n public static class ShaderIDs\n {\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/ShaderIDs.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 603db57c254e69946b905e088e3b9232\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/MaterialMetaDataV1.cs",
"chars": 1127,
"preview": "#if UNITY_EDITOR\nusing UnityEngine;\nusing UnityEngine.Profiling;\n\nnamespace BakedVolumetricsOffline\n{\n /// <summary>\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/MaterialMetaDataV1.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: b65a7e99a6a477448920ec7f0ba6375f\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/MaterialMetaDataV2.cs",
"chars": 721,
"preview": "#if UNITY_EDITOR\nusing UnityEngine;\nusing UnityEngine.Profiling;\n\nnamespace BakedVolumetricsOffline\n{\n /// <summary>\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/MaterialMetaDataV2.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 024f1fd8083672a4094d69c632b12eab\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/ObjectMetaDataV1.cs",
"chars": 930,
"preview": "#if UNITY_EDITOR\nusing UnityEngine;\n\nnamespace BakedVolumetricsOffline\n{\n /// <summary>\n /// Object that holds the"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/ObjectMetaDataV1.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 2b6004489d0a4be448f31c4886bc6b96\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/ObjectMetaDataV2.cs",
"chars": 930,
"preview": "#if UNITY_EDITOR\nusing UnityEngine;\n\nnamespace BakedVolumetricsOffline\n{\n /// <summary>\n /// Object that holds the"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/ObjectMetaDataV2.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 058fb3069e92b1a479fbd142b6098170\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/VoxelLightArea.cs",
"chars": 2642,
"preview": "#if UNITY_EDITOR\nusing System.Runtime.InteropServices;\nusing UnityEngine;\n\nnamespace BakedVolumetricsOffline\n{\n /// <"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/VoxelLightArea.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 36d12a32b0e1092409b371aaafe129f5\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/VoxelLightDirectional.cs",
"chars": 2184,
"preview": "#if UNITY_EDITOR\nusing System.Runtime.InteropServices;\nusing UnityEngine;\n\nnamespace BakedVolumetricsOffline\n{\n /// <"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/VoxelLightDirectional.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 0e573a7d2e4624b46a8f01fd3a2da0b0\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/VoxelLightPoint.cs",
"chars": 1942,
"preview": "#if UNITY_EDITOR\nusing System.Runtime.InteropServices;\nusing UnityEngine;\n\nnamespace BakedVolumetricsOffline\n{\n /// <"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/VoxelLightPoint.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 59dd5e27a7c6dd44686bc96d89a580e9\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/VoxelLightSpot.cs",
"chars": 2144,
"preview": "#if UNITY_EDITOR\nusing System.Runtime.InteropServices;\nusing UnityEngine;\n\nnamespace BakedVolumetricsOffline\n{\n /// <"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs/VoxelLightSpot.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 86b68de59fed5e6449ec1a18ca652326\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/Structs.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 34fa79055fb3583469d6b91a12b46b89\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/VolumeGenerator.cs",
"chars": 33879,
"preview": "#if UNITY_EDITOR\nusing System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.IO;\nusing System.Coll"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/VolumeGenerator.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 9df88accf741f7a4cb4f73d3e1fc8ffb\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/VolumeGeneratorAssets.cs",
"chars": 11839,
"preview": "#if UNITY_EDITOR\nusing UnityEditor;\nusing UnityEditor.SceneManagement;\nusing UnityEngine;\n\nnamespace BakedVolumetricsOff"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/VolumeGeneratorAssets.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: f4a4a12ad8cfb2e45a6d91aa5b75b33a\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/VolumeGeneratorEditor.cs",
"chars": 39742,
"preview": "#if UNITY_EDITOR\nusing System.IO;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEditor;\nusing "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/VolumeGeneratorEditor.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 75ffa3119cdbf7e42806eb83fbe9a251\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/VolumeGeneratorUtility.cs",
"chars": 1159,
"preview": "#if UNITY_EDITOR\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEditor;\n\nname"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts/VolumeGeneratorUtility.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 12dfb75448876824d8ad68525244340a\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Scripts.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: ee86339b20301354e83b967d60fbad3b\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/Adjustments.compute",
"chars": 3101,
"preview": "#define THREAD_GROUP_SIZE_X 4\n#define THREAD_GROUP_SIZE_Y 4\n#define THREAD_GROUP_SIZE_Z 4\n//64 threads\n\n#include \"Unity"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/Adjustments.compute.meta",
"chars": 181,
"preview": "fileFormatVersion: 2\nguid: 74c993dacec6e1347a4b3e10c579d427\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/BitPackingHelper.cginc",
"chars": 11355,
"preview": "#define BITS_32 32\n#define BITS_24 24\n#define BITS_20 20\n#define BITS_18 18\n#define BITS_16 16\n#define BITS_15 15\n#defin"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/BitPackingHelper.cginc.meta",
"chars": 230,
"preview": "fileFormatVersion: 2\nguid: e67e2dc15890ac04db98c31df9f56e3b\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/CombineBuffers.compute",
"chars": 3590,
"preview": "#define THREAD_GROUP_SIZE_X 4\n#define THREAD_GROUP_SIZE_Y 4\n#define THREAD_GROUP_SIZE_Z 4\n//64 threads\n\n//https://github"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/CombineBuffers.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: 0c70aae36e8b9274383c48bfa9bf8b1a\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/ComputeTextureSampling.cginc",
"chars": 1159,
"preview": "//|||||||||||||||||||||||||||||||||||||| TEXTURE SAMPLING ||||||||||||||||||||||||||||||||||||||\n//|||||||||||||||||||||"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/ComputeTextureSampling.cginc.meta",
"chars": 230,
"preview": "fileFormatVersion: 2\nguid: 4b019873f6952d145973394c36ceb045\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/DataPacking.compute",
"chars": 2593,
"preview": "#define THREAD_GROUP_SIZE_X 8\n#define THREAD_GROUP_SIZE_Y 8\n#define THREAD_GROUP_SIZE_Z 8\n\n#include \"MetaPassPacking.cg"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/DataPacking.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: c8168cba7c17acb46931822251a6fcaa\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/Density.compute",
"chars": 3376,
"preview": "#define THREAD_GROUP_SIZE_X 4\n#define THREAD_GROUP_SIZE_Y 4\n#define THREAD_GROUP_SIZE_Z 4\n//64 threads\n\n#include \"Comput"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/Density.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: 343b878fcba01e642b69d7b43a577903\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/Dilation.compute",
"chars": 5283,
"preview": "#define THREAD_GROUP_SIZE_X 8\n#define THREAD_GROUP_SIZE_Y 8\n#define THREAD_GROUP_SIZE_Z 8\n\n//|||||||||||||||||||||||||||"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/Dilation.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: 7d858efdb78b78041987a70f6c3347c6\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/EncodingDecodingHDR.cginc",
"chars": 5846,
"preview": "//|||||||||||||||||||||||||||||||| RGBM ||||||||||||||||||||||||||||||||\n//|||||||||||||||||||||||||||||||| RGBM |||||||"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/EncodingDecodingHDR.cginc.meta",
"chars": 230,
"preview": "fileFormatVersion: 2\nguid: 1711583a63218644eacb88297f417eff\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/EncodingDecodingNormal.cginc",
"chars": 4152,
"preview": "//https://aras-p.info/texts/CompactNormalStorage.html\n//Method #1: Store X & Y and Reconstruct Z\n/*\nfloat2 EncodeNormal("
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/EncodingDecodingNormal.cginc.meta",
"chars": 230,
"preview": "fileFormatVersion: 2\nguid: c2ff3364efbcb444ca6e77e64c17c2a7\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/GaussianBlur3D.compute",
"chars": 2432,
"preview": "//#define THREAD_GROUP_SIZE_X 8\n//#define THREAD_GROUP_SIZE_Y 8\n//#define THREAD_GROUP_SIZE_Z 8\n//512 threads\n\n#define "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/GaussianBlur3D.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: b7a67fbe910cd8f44a173bce231a43cb\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/HDRPacking.compute",
"chars": 2767,
"preview": "#define THREAD_GROUP_SIZE_X 4\n#define THREAD_GROUP_SIZE_Y 4\n#define THREAD_GROUP_SIZE_Z 4\n//64 threads\n\n\n#include \"Enco"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/HDRPacking.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: 669febf4c31d78e43a9d093bd74f0fa9\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/MetaPassPacking.cginc",
"chars": 11650,
"preview": "#include \"BitPackingHelper.cginc\"\n#include \"EncodingDecodingHDR.cginc\"\n#include \"EncodingDecodingNormal.cginc\"\n\n//Pack 3"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/MetaPassPacking.cginc.meta",
"chars": 230,
"preview": "fileFormatVersion: 2\nguid: 94f7c66159b4509418d679c3cdc39b2b\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/Random.cginc",
"chars": 2954,
"preview": "//||||||||||||||||||||||||||||| RANDOM FUNCTIONS |||||||||||||||||||||||||||||\n//||||||||||||||||||||||||||||| RANDOM FU"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/Random.cginc.meta",
"chars": 230,
"preview": "fileFormatVersion: 2\nguid: 5c55e8352e7770b499c3eaf394ebd171\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/Sampling.cginc",
"chars": 1645,
"preview": "//||||||||||||||||||||||||||||| SAMPLING FUNCTIONS |||||||||||||||||||||||||||||\n//||||||||||||||||||||||||||||| SAMPLIN"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/Sampling.cginc.meta",
"chars": 230,
"preview": "fileFormatVersion: 2\nguid: 79f427002ad7cb94085cce917632c066\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/SceneObjectShaderV1.shader",
"chars": 2882,
"preview": "Shader \"BakedVolumetrics/MetaPassObjectShaderV1\"\n{\n Properties\n {\n [Enum(UnityEngine.Rendering.CullMode)] _"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/SceneObjectShaderV1.shader.meta",
"chars": 230,
"preview": "fileFormatVersion: 2\nguid: 3b25ebaac6bad7d4c843b501aa056d03\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/SceneObjectShaderV2.shader",
"chars": 3476,
"preview": "Shader \"BakedVolumetrics/MetaPassObjectShaderV2\"\n{\n Properties\n {\n [Enum(UnityEngine.Rendering.CullMode)] _"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/SceneObjectShaderV2.shader.meta",
"chars": 230,
"preview": "fileFormatVersion: 2\nguid: a377276c32213844b9b37592529001c6\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/UnityLights.cginc",
"chars": 2300,
"preview": "//||||||||||||||||||||||||||||| UNITY LIGHTS |||||||||||||||||||||||||||||\n//||||||||||||||||||||||||||||| UNITY LIGHTS "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/UnityLights.cginc.meta",
"chars": 230,
"preview": "fileFormatVersion: 2\nguid: b12f8500e0a1e6e4db31ec224a56d8a1\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelBounceSurfaceLight.compute",
"chars": 5351,
"preview": "//#define THREAD_GROUP_SIZE_X 8\n//#define THREAD_GROUP_SIZE_Y 8\n//#define THREAD_GROUP_SIZE_Z 8\n//512 threads\n\n#define T"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelBounceSurfaceLight.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: 710075abd3ba2a747b3d31383c034545\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelBounceVolumetricLight.compute",
"chars": 4818,
"preview": "//#define THREAD_GROUP_SIZE_X 8\n//#define THREAD_GROUP_SIZE_Y 8\n//#define THREAD_GROUP_SIZE_Z 8\n//512 threads\n\n#define T"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelBounceVolumetricLight.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: 1171f0a79e45deb4f82a7bb2018dbe2e\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelDirectSurfaceLight.compute",
"chars": 29853,
"preview": "//|||||||||||||||||||||||||||||||||||||| KEYWORDS ||||||||||||||||||||||||||||||||||||||\n//|||||||||||||||||||||||||||||"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelDirectSurfaceLight.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: e409e7142ddbe8d4eb4ded3b065b617f\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelDirectVolumetricLight.compute",
"chars": 28559,
"preview": "//#define THREAD_GROUP_SIZE_X 8\n//#define THREAD_GROUP_SIZE_Y 8\n//#define THREAD_GROUP_SIZE_Z 8\n//512 threads\n\n#define T"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelDirectVolumetricLight.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: 7a664ba6ed2511046b5706a12eac2384\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelEnvironmentSurfaceLight.compute",
"chars": 5667,
"preview": "//#define THREAD_GROUP_SIZE_X 8\n//#define THREAD_GROUP_SIZE_Y 8\n//#define THREAD_GROUP_SIZE_Z 8\n//512 threads\n\n#define T"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelEnvironmentSurfaceLight.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: 66dcd5cb4778d564bb1c6dec5039a711\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelEnvironmentVolumetricLight.compute",
"chars": 5513,
"preview": "//#define THREAD_GROUP_SIZE_X 8\n//#define THREAD_GROUP_SIZE_Y 8\n//#define THREAD_GROUP_SIZE_Z 8\n//512 threads\n\n#define T"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelEnvironmentVolumetricLight.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: 55e08506be336fd44b1c013caf6dc2d0\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelTracerUtilities.cginc",
"chars": 2250,
"preview": "//||||||||||||||||||||||||||||| UTILITY FUNCTIONS |||||||||||||||||||||||||||||\n//||||||||||||||||||||||||||||| UTILITY "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelTracerUtilities.cginc.meta",
"chars": 230,
"preview": "fileFormatVersion: 2\nguid: 509b7ce7533bce44488f0cfb9bcc993a\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelizeScene.compute",
"chars": 8290,
"preview": "#define THREAD_GROUP_SIZE_X 8\n#define THREAD_GROUP_SIZE_Y 8\n#define THREAD_GROUP_SIZE_Z 8\n\n//|||||||||||||||||||||||||||"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders/VoxelizeScene.compute.meta",
"chars": 207,
"preview": "fileFormatVersion: 2\nguid: 6a7f5c41bcc80034295603b8e6c349af\nComputeShaderImporter:\n externalObjects: {}\n currentAPIMas"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration/Shaders.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: aaf2c9abcb87e474bb23b944b0d7b7d1\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/OfflineGeneration.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 79862a7f677408a43a0525cb9db63df0\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/CameraDepth.cs",
"chars": 2071,
"preview": "using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n//using UnityEngine.XR;\n//using UnityEng"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/CameraDepth.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 9fcecc39b2339ac43baf5ea9cb2993f4\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/ComputeShaderParameter.cs",
"chars": 282,
"preview": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.Rendering"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/ComputeShaderParameter.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 33f00fca457ad4148b5225fac557d1e5\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/ShaderIDs.cs",
"chars": 1519,
"preview": "using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\n/*\n * NOTE: Using ShaderIDs are more eff"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/ShaderIDs.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: ad54fd0ca85171d4e886a325e9b27766\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V1/BakedVolumetricsV1.cs",
"chars": 1446,
"preview": "/*\n * ----------------------------------------------------------\n * Baked Volumetrics Post Process V1\n * \n * This is the"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V1/BakedVolumetricsV1.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: f75252d0cbb0f3c4fb7fffd2942fdd6a\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V1/BakedVolumetricsV1Renderer.cs",
"chars": 2844,
"preview": "/*\n * ----------------------------------------------------------\n * Baked Volumetrics Post Process V1\n * \n * This is the"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V1/BakedVolumetricsV1Renderer.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: b65b605111431714492acd00bbf5c044\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V1.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: a1f7273d1508bbd409c9486f6f9d8dc5\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V2/BakedVolumetricsV2.cs",
"chars": 1543,
"preview": "/*\n * ----------------------------------------------------------\n * Baked Volumetrics Post Process V2\n * \n * This is the"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V2/BakedVolumetricsV2.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: dffda2f8e3ff96e47a10929280e5885b\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V2/BakedVolumetricsV2Renderer.cs",
"chars": 2832,
"preview": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.Rendering"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V2/BakedVolumetricsV2Renderer.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 20139fd11e70db545b8851b8212654cf\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V2.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: af6bb89874a2851458c760138c876181\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3/BakedVolumetricsV3.cs",
"chars": 891,
"preview": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.Rendering"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3/BakedVolumetricsV3.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: dd2a5ca62ca0edb4a897b5b51a91b10c\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3/BakedVolumetricsV3Renderer.cs",
"chars": 3871,
"preview": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.Profiling"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3/BakedVolumetricsV3Renderer.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 52cc4a80430741b4e88e6d848f4a97e7\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3/BakedVolumetricsV3SingleVolume.cs",
"chars": 434,
"preview": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.Rendering"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3/BakedVolumetricsV3SingleVolume.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: eddbd0ebac14dbd45952454ca3579e49\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3/BakedVolumetricsV3VolumeArrayParameter.cs",
"chars": 341,
"preview": "using BakedVolumetrics;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusi"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3/BakedVolumetricsV3VolumeArrayParameter.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: a8e58e652116ab346aaaf39d02eb5eb2\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V3.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 1647d4aa209276349952c2f45d213da3\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V4/BakedVolumetricsV4.cs",
"chars": 723,
"preview": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.Rendering"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V4/BakedVolumetricsV4.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 29538f8cd7c88464281889036bd15030\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V4/BakedVolumetricsV4Renderer.cs",
"chars": 2959,
"preview": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.Rendering"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V4/BakedVolumetricsV4Renderer.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: b81ba885f7f24c64f9c9f45f4199980a\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing/V4.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 4c93eec951c5cb64baa4331161e0c0e3\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts/PostProcessing.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: e7f5db883ea17154eb4b39272b37e89c\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Scripts.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: fd7edc647adda5943830b54a768e8158\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/PostV1/BakedVolumetricsV1.shader",
"chars": 7888,
"preview": "Shader \"Hidden/BakedVolumetricsV1\"\n{\n\tSubShader\n\t{\n\t\t//Cull Off ZWrite Off ZTest Always\n\t\tZTest Off Cull Off ZWrite Off "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/PostV1/BakedVolumetricsV1.shader.meta",
"chars": 204,
"preview": "fileFormatVersion: 2\nguid: 9df50695b9ebe844b8f71b5e8e3139ac\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/PostV1.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 528114c424d69474cb7f5c4d8fdc179f\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/PostV2/BakedVolumetricsV2.shader",
"chars": 10866,
"preview": "Shader \"Hidden/BakedVolumetricsV2\"\n{\n\tSubShader\n\t{\n\t\t//Cull Off ZWrite Off ZTest Always\n\t\tZTest Off Cull Off ZWrite Off "
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/PostV2/BakedVolumetricsV2.shader.meta",
"chars": 204,
"preview": "fileFormatVersion: 2\nguid: b58e7ac031f3ad94cb9d6ee795134a82\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/PostV2.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: d7b37c067e0df904a95eab65cb7bc91a\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/PostV3/BakedVolumetricsV3.shader",
"chars": 9728,
"preview": "Shader \"Hidden/BakedVolumetricsV3\"\n{\n\tSubShader\n\t{\n\t\tZTest Off \n\t\tCull Off \n\t\tZWrite Off \n\t\tBlend Off\n\n\t\tFog \n\t\t{ \n\t\t\tMo"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/PostV3/BakedVolumetricsV3.shader.meta",
"chars": 204,
"preview": "fileFormatVersion: 2\nguid: 6a97ab4d0ec7e7a4fad752c5425ec4b5\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/PostV3.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: f8fd5ee6bba0aaa48a6fd178e2be79db\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/PostV4.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: c0b4f327d7c77f543b94fa66fd850dd1\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/PostV5.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: af8c753b9f336aa4abb9e5c763d379ed\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/Scene/FogRealtimeExperiment.shader",
"chars": 17343,
"preview": "Shader \"BakedVolumetrics/RealtimeExperiment\"\n{\n Properties\n {\n [Header(Volume)]\n _SceneAlbedo(\"Scen"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/Scene/FogRealtimeExperiment.shader.meta",
"chars": 204,
"preview": "fileFormatVersion: 2\nguid: 037ccf130121763428f3b47488055127\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/Scene/QuadIntrinsics.cginc",
"chars": 15158,
"preview": "// SPDX-License-Identifier: MIT\n// Author: pema99\n\n// This file contains functions that simulate Quad and Wave Intrinsic"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/Scene/QuadIntrinsics.cginc.meta",
"chars": 230,
"preview": "fileFormatVersion: 2\nguid: 4f3299a825f3a5940be41f2ab5801386\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/Scene/SceneVolumetricFog.shader",
"chars": 18445,
"preview": "/*\nNOTE: Using HDR Compression on the generated volume is not possible if bilinear filtering is used.\nBilinear filterin"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/Scene/SceneVolumetricFog.shader.meta",
"chars": 204,
"preview": "fileFormatVersion: 2\nguid: 4c531454e78090b41bad275f01555477\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/Scene/SceneVolumetricFog_LPPV.shader",
"chars": 17836,
"preview": "//References\n//UnityCG.cginc - https://github.com/TwoTailsGames/Unity-Built-in-Shaders/blob/master/CGIncludes/UnityCG.c"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/Scene/SceneVolumetricFog_LPPV.shader.meta",
"chars": 204,
"preview": "fileFormatVersion: 2\nguid: acbada3758749ba469201507be61d626\nShaderImporter:\n externalObjects: {}\n defaultTextures: []\n"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/Scene/ShaderNotes.txt",
"chars": 16106,
"preview": "/*\n* Notes for shader macros used in Unity.\n* \n* Only the ones that are used in the shader... everything else is exclude"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/Scene/ShaderNotes.txt.meta",
"chars": 158,
"preview": "fileFormatVersion: 2\nguid: e72dc61937e10834eb908a5bdbc09729\nTextScriptImporter:\n externalObjects: {}\n userData: \n ass"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders/Scene.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 999a0968af53bdf4c9274f7f0147a374\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime/Shaders.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 527c6e90f0941714b9b8abc91a9aec1c\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics/Runtime.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 46166ae8c817ecc45bbf2d8fb038a1b7\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/BakedVolumetrics.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 5458ba8c13be9334ead1e632cd862ae7\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/CubemapFog.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 84cd9e2fd6add9342acc882ae18cb2d2\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/CustomBloom.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: d8bd8d35c12aafb458df774cc29e6c9a\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/Editor.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 549963680fe56ba47b8079e83dac90a3\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/ProductionSky.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: d0b8cb14d106fd049a5160ab9c7ea694\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/RPG_FPS_game_assets_industrial.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 8708faa8007bb6a4ebd0b36e765faa03\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene/LightingData.asset.meta",
"chars": 190,
"preview": "fileFormatVersion: 2\nguid: 81f4e04f228272645a52affb5f396e55\nNativeFormatImporter:\n externalObjects: {}\n mainObjectFile"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene/Lightmap-0_comp_light.exr.meta",
"chars": 2775,
"preview": "fileFormatVersion: 2\nguid: f95fc60fe19615a408add0c0418a3f55\nTextureImporter:\n internalIDToNameTable: []\n externalObjec"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene/Lightmap-1_comp_light.exr.meta",
"chars": 2775,
"preview": "fileFormatVersion: 2\nguid: d67359433bb8bab4d90831cfe2b7768b\nTextureImporter:\n internalIDToNameTable: []\n externalObjec"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene/Lightmap-2_comp_light.exr.meta",
"chars": 2775,
"preview": "fileFormatVersion: 2\nguid: 5951d149d6cfe544883691536914ccc9\nTextureImporter:\n internalIDToNameTable: []\n externalObjec"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene/Lightmap-3_comp_light.exr.meta",
"chars": 2775,
"preview": "fileFormatVersion: 2\nguid: 044bccf4529f37c43b242e888a2255e4\nTextureImporter:\n internalIDToNameTable: []\n externalObjec"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene/Lightmap-4_comp_light.exr.meta",
"chars": 2775,
"preview": "fileFormatVersion: 2\nguid: 0dfa7d3e1a5a61a4ab08b6358236694f\nTextureImporter:\n internalIDToNameTable: []\n externalObjec"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene/Lightmap-5_comp_light.exr.meta",
"chars": 2775,
"preview": "fileFormatVersion: 2\nguid: 391f7603c0b68f44fb16e9db5a8c1810\nTextureImporter:\n internalIDToNameTable: []\n externalObjec"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene/ReflectionProbe-0.exr.meta",
"chars": 2117,
"preview": "fileFormatVersion: 2\nguid: 39d0ed0aee41dcf488389b79e66c9079\nTextureImporter:\n internalIDToNameTable: []\n externalObjec"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene/VolumetricsScene_LightProbePlacement.asset.meta",
"chars": 189,
"preview": "fileFormatVersion: 2\nguid: 592f2383ed56e7c479396100e53ae8c7\nNativeFormatImporter:\n externalObjects: {}\n mainObjectFile"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene.giparams",
"chars": 656,
"preview": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!1113 &111300000\nLightmapParameters:\n m_ObjectHideFlags: 0\n m_Correspon"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene.giparams.meta",
"chars": 190,
"preview": "fileFormatVersion: 2\nguid: c0ed0a62e6c4f144d9af71ac6f535a66\nNativeFormatImporter:\n externalObjects: {}\n mainObjectFile"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene.lighting",
"chars": 1755,
"preview": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!850595691 &4890085278179872738\nLightingSettings:\n m_ObjectHideFlags: 0\n"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene.lighting.meta",
"chars": 200,
"preview": "fileFormatVersion: 2\nguid: b22e3075c68fbfe4e875d4236c366fde\nNativeFormatImporter:\n externalObjects: {}\n mainObjectFile"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 9f9dc8ec9604c6f42b7fdb8e2b92b1cf\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene.unity",
"chars": 9569088,
"preview": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!29 &1\nOcclusionCullingSettings:\n m_ObjectHideFlags: 0\n serializedVersi"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene.unity.meta",
"chars": 155,
"preview": "fileFormatVersion: 2\nguid: 26349cabe9d7eae4990c13a839b4f8be\nDefaultImporter:\n externalObjects: {}\n userData: \n assetB"
},
{
"path": "BakedVolumetrics/Assets/Scenes/VolumetricsScene_Profiles/Post-process Volume Profile.asset",
"chars": 25612,
"preview": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!114 &-7693575959006385970\nMonoBehaviour:\n m_ObjectHideFlags: 3\n m_Corr"
}
]
// ... and 52 more files (download for full content)
About this extraction
This page contains the full source code of the frostbone25/Unity-Baked-Volumetrics GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 252 files (106.9 MB), approximately 2.6M tokens, and a symbol index with 161 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.