├── .gitignore ├── Assets ├── 0.UnityDefaultDraw.meta ├── 0.UnityDefaultDraw │ ├── Material0.1.mat │ ├── Material0.1.mat.meta │ ├── Material0.2.mat │ ├── Material0.2.mat.meta │ ├── Scene0.unity │ ├── Scene0.unity.meta │ ├── Shader0.1.shader │ ├── Shader0.1.shader.meta │ ├── Shader0.2.shader │ └── Shader0.2.shader.meta ├── 1.DrawViaScript.meta ├── 1.DrawViaScript │ ├── DrawMesh.cs │ ├── DrawMesh.cs.meta │ ├── DrawMeshInstanced.cs │ ├── DrawMeshInstanced.cs.meta │ ├── DrawMeshInstancedMPB.cs │ ├── DrawMeshInstancedMPB.cs.meta │ ├── DrawMeshInstancedManual.cs │ ├── DrawMeshInstancedManual.cs.meta │ ├── Material1.3.mat │ ├── Material1.3.mat.meta │ ├── Material1.4.mat │ ├── Material1.4.mat.meta │ ├── Scene1.unity │ ├── Scene1.unity.meta │ ├── Shader1.3.shader │ ├── Shader1.3.shader.meta │ ├── Shader1.4.shader │ └── Shader1.4.shader.meta ├── 2.IndirectDraw.meta ├── 2.IndirectDraw │ ├── IndirectInstance.cs │ ├── IndirectInstance.cs.meta │ ├── IndirectInstanceBuffer.cs │ ├── IndirectInstanceBuffer.cs.meta │ ├── InstanceArray.cs │ ├── InstanceArray.cs.meta │ ├── InstanceBuffer.cs │ ├── InstanceBuffer.cs.meta │ ├── Material2.2.mat │ ├── Material2.2.mat.meta │ ├── Material2.3.mat │ ├── Material2.3.mat.meta │ ├── Material2.4.mat │ ├── Material2.4.mat.meta │ ├── Scene2.unity │ ├── Scene2.unity.meta │ ├── Shader2.2.shader │ ├── Shader2.2.shader.meta │ ├── Shader2.3.shader │ ├── Shader2.3.shader.meta │ ├── Shader2.4.shader │ └── Shader2.4.shader.meta ├── 3.MergeInstance.meta ├── 3.MergeInstance │ ├── AdvancedMergeInstance.cs │ ├── AdvancedMergeInstance.cs.meta │ ├── LegacyMultiMesh.cs │ ├── LegacyMultiMesh.cs.meta │ ├── Material3.2.mat │ ├── Material3.2.mat.meta │ ├── Material3.3.mat │ ├── Material3.3.mat.meta │ ├── Material3.4.mat │ ├── Material3.4.mat.meta │ ├── MergeInstance.cs │ ├── MergeInstance.cs.meta │ ├── ProcedualDraw.cs │ ├── ProcedualDraw.cs.meta │ ├── Scene3.unity │ ├── Scene3.unity.meta │ ├── Shader3.2.shader │ ├── Shader3.2.shader.meta │ ├── Shader3.3.shader │ ├── Shader3.3.shader.meta │ ├── Shader3.4.shader │ └── Shader3.4.shader.meta ├── 4.FrustumCulling.meta ├── 4.FrustumCulling │ ├── CPUFrustumCulling.cs │ ├── CPUFrustumCulling.cs.meta │ ├── ComputeShader4.2.compute │ ├── ComputeShader4.2.compute.meta │ ├── Debug.meta │ ├── Debug │ │ ├── FrustumCullingDebugger.cs │ │ └── FrustumCullingDebugger.cs.meta │ ├── GPUFrustumCulling.cs │ ├── GPUFrustumCulling.cs.meta │ ├── Material4.2.mat │ ├── Material4.2.mat.meta │ ├── Scene4.unity │ ├── Scene4.unity.meta │ ├── Shader4.2.shader │ └── Shader4.2.shader.meta ├── 5.MeshClusterRendering.meta ├── 5.MeshClusterRendering │ ├── ClustersCulling.cs │ ├── ClustersCulling.cs.meta │ ├── ClustersData.cs │ ├── ClustersData.cs.meta │ ├── ClustersRendering.cs │ ├── ClustersRendering.cs.meta │ ├── ComputeShader5.2.compute │ ├── ComputeShader5.2.compute.meta │ ├── ComputeShader5.3.compute │ ├── ComputeShader5.3.compute.meta │ ├── Debug.meta │ ├── Debug │ │ ├── ClustersDebugger.cs │ │ ├── ClustersDebugger.cs.meta │ │ ├── MaterialDebug5.mat │ │ ├── MaterialDebug5.mat.meta │ │ ├── ShaderDebug5.shader │ │ └── ShaderDebug5.shader.meta │ ├── Editor.meta │ ├── Editor │ │ ├── ClustersDataGenerator.cs │ │ └── ClustersDataGenerator.cs.meta │ ├── Material5.1.mat │ ├── Material5.1.mat.meta │ ├── Material5.2.mat │ ├── Material5.2.mat.meta │ ├── Material5.3.mat │ ├── Material5.3.mat.meta │ ├── MultiMeshClusters.cs │ ├── MultiMeshClusters.cs.meta │ ├── Res.meta │ ├── Res │ │ ├── CapsuleClusters.asset │ │ ├── CapsuleClusters.asset.meta │ │ ├── CapsuleMesh.asset │ │ ├── CapsuleMesh.asset.meta │ │ ├── CubeClusters.asset │ │ ├── CubeClusters.asset.meta │ │ ├── CubeMesh.asset │ │ ├── CubeMesh.asset.meta │ │ ├── CylinderClusters.asset │ │ ├── CylinderClusters.asset.meta │ │ ├── CylinderMesh.asset │ │ ├── CylinderMesh.asset.meta │ │ ├── SphereClusters.asset │ │ ├── SphereClusters.asset.meta │ │ ├── SphereMesh.asset │ │ └── SphereMesh.asset.meta │ ├── Scene5.unity │ ├── Scene5.unity.meta │ ├── Shader5.1.shader │ ├── Shader5.1.shader.meta │ ├── Shader5.2.shader │ ├── Shader5.2.shader.meta │ ├── Shader5.3.shader │ └── Shader5.3.shader.meta ├── 6.BackFaceCulling.meta ├── 6.BackFaceCulling │ ├── BackFaceCulling.cs │ ├── BackFaceCulling.cs.meta │ ├── BoundingCone.cs │ ├── BoundingCone.cs.meta │ ├── BoundingSphere.cs │ ├── BoundingSphere.cs.meta │ ├── ClustersData.cs │ ├── ClustersData.cs.meta │ ├── ComputeShader6.1.compute │ ├── ComputeShader6.1.compute.meta │ ├── Debug.meta │ ├── Debug │ │ ├── ConeDebugger.cs │ │ └── ConeDebugger.cs.meta │ ├── Editor.meta │ ├── Editor │ │ ├── ClustersDataGenerator.cs │ │ └── ClustersDataGenerator.cs.meta │ ├── Res.meta │ ├── Res │ │ ├── CapsuleClusters.asset │ │ ├── CapsuleClusters.asset.meta │ │ ├── CapsuleMesh.asset │ │ ├── CapsuleMesh.asset.meta │ │ ├── CubeClusters.asset │ │ ├── CubeClusters.asset.meta │ │ ├── CubeMesh.asset │ │ ├── CubeMesh.asset.meta │ │ ├── CylinderClusters.asset │ │ ├── CylinderClusters.asset.meta │ │ ├── CylinderMesh.asset │ │ ├── CylinderMesh.asset.meta │ │ ├── SphereClusters.asset │ │ ├── SphereClusters.asset.meta │ │ ├── SphereMesh.asset │ │ └── SphereMesh.asset.meta │ ├── Scene6.unity │ └── Scene6.unity.meta ├── 7.OcclusionCulling.meta ├── 7.OcclusionCulling │ ├── AdvancedPreZWriteUAV.cs │ ├── AdvancedPreZWriteUAV.cs.meta │ ├── Debug.meta │ ├── Debug │ │ ├── MaterialDebug7.mat │ │ ├── MaterialDebug7.mat.meta │ │ ├── PreZDebugger.cs │ │ ├── PreZDebugger.cs.meta │ │ ├── ShaderDebug7.shader │ │ └── ShaderDebug7.shader.meta │ ├── Material7.1.mat │ ├── Material7.1.mat.meta │ ├── Material7.1.preZ.mat │ ├── Material7.1.preZ.mat.meta │ ├── Material7.2.mat │ ├── Material7.2.mat.meta │ ├── Material7.2.preZ.mat │ ├── Material7.2.preZ.mat.meta │ ├── Material7.3.mat │ ├── Material7.3.mat.meta │ ├── Material7.3.preZ.mat │ ├── Material7.3.preZ.mat.meta │ ├── PreZWriteUAV.cs │ ├── PreZWriteUAV.cs.meta │ ├── Scene7.unity │ ├── Scene7.unity.meta │ ├── Shader7.1.preZ.shader │ ├── Shader7.1.preZ.shader.meta │ ├── Shader7.2.preZ.shader │ └── Shader7.2.preZ.shader.meta ├── 8.HZBOcclusionCulling.meta └── 8.HZBOcclusionCulling │ ├── Debug.meta │ ├── Debug │ ├── CullingDebugger.cs │ ├── CullingDebugger.cs.meta │ ├── MaterialDebug8.mat │ ├── MaterialDebug8.mat.meta │ ├── ShaderDebug8.shader │ └── ShaderDebug8.shader.meta │ ├── HZBOcclusionCulling.cs │ ├── HZBOcclusionCulling.cs.meta │ ├── HiZGenerator.cs │ ├── HiZGenerator.cs.meta │ ├── Material8.1.hiZ.mat │ ├── Material8.1.hiZ.mat.meta │ ├── Material8.1.mat │ ├── Material8.1.mat.meta │ ├── Material8.1.oC.mat │ ├── Material8.1.oC.mat.meta │ ├── Scene8.unity │ ├── Scene8.unity.meta │ ├── Shader8.1.hiZ.shader │ ├── Shader8.1.hiZ.shader.meta │ ├── Shader8.1.oC.shader │ └── Shader8.1.oC.shader.meta ├── LICENSE ├── Packages ├── manifest.json └── packages-lock.json ├── ProjectSettings ├── AudioManager.asset ├── AutoStreamingSettings.asset ├── ClusterInputManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── MemorySettings.asset ├── MultiplayerManager.asset ├── NavMeshAreas.asset ├── PackageManagerSettings.asset ├── Packages │ └── com.unity.testtools.codecoverage │ │ └── Settings.json ├── Physics2DSettings.asset ├── PresetManager.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── SceneTemplateSettings.json ├── TagManager.asset ├── TimeManager.asset ├── UnityConnectSettings.asset ├── VFXManager.asset ├── VersionControlSettings.asset └── XRSettings.asset └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Mm]emoryCaptures/ 12 | 13 | # Asset meta data should only be ignored when the corresponding asset is also ignored 14 | !/[Aa]ssets/**/*.meta 15 | 16 | # Uncomment this line if you wish to ignore the asset store tools plugin 17 | # /[Aa]ssets/AssetStoreTools* 18 | 19 | # Autogenerated Jetbrains Rider plugin 20 | [Aa]ssets/Plugins/Editor/JetBrains* 21 | 22 | # Visual Studio cache directory 23 | .vs/ 24 | 25 | # Gradle cache directory 26 | .gradle/ 27 | 28 | # Autogenerated VS/MD/Consulo solution and project files 29 | ExportedObj/ 30 | .consulo/ 31 | *.csproj 32 | *.unityproj 33 | *.sln 34 | *.suo 35 | *.tmp 36 | *.user 37 | *.userprefs 38 | *.pidb 39 | *.booproj 40 | *.svd 41 | *.pdb 42 | *.mdb 43 | *.opendb 44 | *.VC.db 45 | 46 | # Unity3D generated meta files 47 | *.pidb.meta 48 | *.pdb.meta 49 | *.mdb.meta 50 | 51 | # Unity3D generated file on crash reports 52 | sysinfo.txt 53 | 54 | # Builds 55 | *.apk 56 | *.unitypackage 57 | 58 | # Crashlytics generated file 59 | crashlytics-build.properties 60 | 61 | .vsconfig 62 | /UserSettings 63 | /Assets/NonVersionedAssets 64 | /Assets/NonVersionedAssets.meta -------------------------------------------------------------------------------- /Assets/0.UnityDefaultDraw.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9c3d8de6e8c933a4b8378f976f397809 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/0.UnityDefaultDraw/Material0.1.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material0.1 11 | m_Shader: {fileID: 4800000, guid: 6b173f50317f2bc45b563fbeaafd5fcf, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: 23 | - _BumpMap: 24 | m_Texture: {fileID: 0} 25 | m_Scale: {x: 1, y: 1} 26 | m_Offset: {x: 0, y: 0} 27 | - _DetailAlbedoMap: 28 | m_Texture: {fileID: 0} 29 | m_Scale: {x: 1, y: 1} 30 | m_Offset: {x: 0, y: 0} 31 | - _DetailMask: 32 | m_Texture: {fileID: 0} 33 | m_Scale: {x: 1, y: 1} 34 | m_Offset: {x: 0, y: 0} 35 | - _DetailNormalMap: 36 | m_Texture: {fileID: 0} 37 | m_Scale: {x: 1, y: 1} 38 | m_Offset: {x: 0, y: 0} 39 | - _EmissionMap: 40 | m_Texture: {fileID: 0} 41 | m_Scale: {x: 1, y: 1} 42 | m_Offset: {x: 0, y: 0} 43 | - _MainTex: 44 | m_Texture: {fileID: 0} 45 | m_Scale: {x: 1, y: 1} 46 | m_Offset: {x: 0, y: 0} 47 | - _MetallicGlossMap: 48 | m_Texture: {fileID: 0} 49 | m_Scale: {x: 1, y: 1} 50 | m_Offset: {x: 0, y: 0} 51 | - _OcclusionMap: 52 | m_Texture: {fileID: 0} 53 | m_Scale: {x: 1, y: 1} 54 | m_Offset: {x: 0, y: 0} 55 | - _ParallaxMap: 56 | m_Texture: {fileID: 0} 57 | m_Scale: {x: 1, y: 1} 58 | m_Offset: {x: 0, y: 0} 59 | m_Ints: [] 60 | m_Floats: 61 | - _BumpScale: 1 62 | - _Cutoff: 0.5 63 | - _DetailNormalMapScale: 1 64 | - _DstBlend: 0 65 | - _GlossMapScale: 1 66 | - _Glossiness: 0.5 67 | - _GlossyReflections: 1 68 | - _Metallic: 0 69 | - _Mode: 0 70 | - _OcclusionStrength: 1 71 | - _Parallax: 0.02 72 | - _SmoothnessTextureChannel: 0 73 | - _SpecularHighlights: 1 74 | - _SrcBlend: 1 75 | - _UVSec: 0 76 | - _ZWrite: 1 77 | m_Colors: 78 | - _Color: {r: 1, g: 0.54901963, b: 0, a: 1} 79 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} 80 | m_BuildTextureStacks: [] 81 | -------------------------------------------------------------------------------- /Assets/0.UnityDefaultDraw/Material0.1.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 08986c6a512122c449ca90ee18bde78c 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/0.UnityDefaultDraw/Material0.2.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material0.2 11 | m_Shader: {fileID: 4800000, guid: fcea2ce76134383499eb884e040a2bd1, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 1 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: 26 | - _Color: {r: 0.7232704, g: 1, b: 0.76774484, a: 1} 27 | m_BuildTextureStacks: [] 28 | -------------------------------------------------------------------------------- /Assets/0.UnityDefaultDraw/Material0.2.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 181f30a0f06dbb749aa8c62b4c5532e3 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/0.UnityDefaultDraw/Scene0.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9fc0d4010bbf28b4594072e72b8655ab 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/0.UnityDefaultDraw/Shader0.1.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader0.1" 2 | { 3 | Properties 4 | { 5 | _Color("Color", Color) = (0, 1, 1, 1) 6 | } 7 | SubShader 8 | { 9 | Pass 10 | { 11 | CGPROGRAM 12 | #pragma vertex vert 13 | #pragma fragment frag 14 | 15 | #include "UnityCG.cginc" 16 | 17 | struct appdata 18 | { 19 | float4 vertex : POSITION; 20 | }; 21 | 22 | struct v2f 23 | { 24 | float4 vertex : SV_POSITION; 25 | }; 26 | 27 | float4 _Color; 28 | 29 | v2f vert(appdata v) 30 | { 31 | v2f o; 32 | o.vertex = UnityObjectToClipPos(v.vertex); 33 | return o; 34 | } 35 | 36 | fixed4 frag(v2f i) : SV_Target 37 | { 38 | fixed4 col = _Color; 39 | return col; 40 | } 41 | ENDCG 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Assets/0.UnityDefaultDraw/Shader0.1.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6b173f50317f2bc45b563fbeaafd5fcf 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/0.UnityDefaultDraw/Shader0.2.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader0.2 " 2 | { 3 | Properties 4 | { 5 | _Color("Color", Color) = (0, 1, 1, 1) 6 | } 7 | SubShader 8 | { 9 | Pass 10 | { 11 | CGPROGRAM 12 | #pragma vertex vert 13 | #pragma fragment frag 14 | #pragma multi_compile_instancing 15 | 16 | #include "UnityCG.cginc" 17 | 18 | struct appdata 19 | { 20 | float4 vertex : POSITION; 21 | UNITY_VERTEX_INPUT_INSTANCE_ID 22 | }; 23 | 24 | struct v2f 25 | { 26 | float4 vertex : SV_POSITION; 27 | }; 28 | 29 | float4 _Color; 30 | 31 | v2f vert(appdata v) 32 | { 33 | UNITY_SETUP_INSTANCE_ID(v) 34 | v2f o; 35 | o.vertex = UnityObjectToClipPos(v.vertex); 36 | return o; 37 | } 38 | 39 | fixed4 frag(v2f i) : SV_Target 40 | { 41 | fixed4 col = _Color; 42 | return col; 43 | } 44 | ENDCG 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Assets/0.UnityDefaultDraw/Shader0.2.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fcea2ce76134383499eb884e040a2bd1 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 780bf212262642448b8127a860f432f1 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/DrawMesh.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace DrawViaScript 4 | { 5 | public class DrawMesh : MonoBehaviour 6 | { 7 | public Mesh DMesh; 8 | public Material DMaterial; 9 | void Update() 10 | { 11 | var model = transform.localToWorldMatrix; 12 | Graphics.DrawMesh(DMesh, model, DMaterial, 0); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/DrawMesh.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 661676a4302488444bd28b2873bbc94c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/DrawMeshInstanced.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace DrawViaScript 4 | { 5 | public class DrawMeshInstanced : MonoBehaviour 6 | { 7 | public Mesh DMesh; 8 | public Material DMaterial; 9 | private Matrix4x4[] models; 10 | void Start() 11 | { 12 | models = new Matrix4x4[25]; 13 | var parentPosition = transform.position; 14 | for (int i = 0, k = 0; i < 5; i++) 15 | { 16 | for (int j = 0; j < 5; j++, k++) 17 | { 18 | var pos = parentPosition + new Vector3(0, i * 2, j * 2); 19 | models[k] = Matrix4x4.Translate(pos); 20 | } 21 | } 22 | } 23 | void Update() 24 | { 25 | Graphics.DrawMeshInstanced(DMesh, 0, DMaterial, models); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/DrawMeshInstanced.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3eee33734ccb3604c92bd21e1e3c35bb 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/DrawMeshInstancedMPB.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace DrawViaScript 4 | { 5 | public class DrawMeshInstancedMPB : MonoBehaviour 6 | { 7 | public Mesh DMesh; 8 | public Material DMaterial; 9 | private Matrix4x4[] models; 10 | private MaterialPropertyBlock mpb; 11 | void Start() 12 | { 13 | models = new Matrix4x4[25]; 14 | var colors = new Vector4[25]; 15 | var parentPosition = transform.position; 16 | for (int i = 0, k = 0; i < 5; i++) 17 | { 18 | for (int j = 0; j < 5; j++, k++) 19 | { 20 | var pos = parentPosition + new Vector3(0, i * 2, j * 2); 21 | models[k] = Matrix4x4.Translate(pos); 22 | colors[k] = new Vector4(Random.Range(0.0f, 0.8f), Random.value, Random.value, 1.0f); 23 | } 24 | } 25 | mpb = new MaterialPropertyBlock(); 26 | mpb.SetVectorArray("_Color", colors); 27 | } 28 | void Update() 29 | { 30 | Graphics.DrawMeshInstanced(DMesh, 0, DMaterial, models, 25, mpb); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/DrawMeshInstancedMPB.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ac632c927d67b414ba3504daaacc9319 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DMesh: {instanceID: 0} 8 | - DMaterial: {fileID: 2100000, guid: e0dd3387352a0134e972c8284971fc77, type: 2} 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/DrawMeshInstancedManual.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace DrawViaScript 4 | { 5 | public class DrawMeshInstancedManual : MonoBehaviour 6 | { 7 | public Mesh DMesh; 8 | public Material DMaterial; 9 | private Matrix4x4[] models; 10 | void Start() 11 | { 12 | models = new Matrix4x4[25]; 13 | var colors = new Vector4[25]; 14 | var parentPosition = transform.position; 15 | for (int i = 0, k = 0; i < 5; i++) 16 | { 17 | for (int j = 0; j < 5; j++, k++) 18 | { 19 | var pos = parentPosition + new Vector3(0, i * 2, j * 2); 20 | models[k] = Matrix4x4.Translate(pos); 21 | colors[k] = new Vector4(Random.Range(0.0f, 0.8f), Random.value, Random.value, 1.0f); 22 | } 23 | } 24 | DMaterial.SetVectorArray("_Color", colors); 25 | } 26 | void Update() 27 | { 28 | Graphics.DrawMeshInstanced(DMesh, 0, DMaterial, models); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/DrawMeshInstancedManual.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3c970efd1777a7a4383c6f7602fcec2b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DMesh: {instanceID: 0} 8 | - DMaterial: {fileID: 2100000, guid: c9d6d5dae46046146af25bb5186ec4c2, type: 2} 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/Material1.3.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material1.3 11 | m_Shader: {fileID: 4800000, guid: de7e7f181aa07e74b8cfb79e4693c792, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 1 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: 26 | - _Color: {r: 0, g: 0.50588226, b: 1, a: 1} 27 | m_BuildTextureStacks: [] 28 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/Material1.3.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e0dd3387352a0134e972c8284971fc77 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/Material1.4.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material1.4 11 | m_Shader: {fileID: 4800000, guid: cfd26d66588fe02439652be7f17cda06, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 1 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: 26 | - _Color: {r: 0, g: 1, b: 0.24605918, a: 1} 27 | m_BuildTextureStacks: [] 28 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/Material1.4.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c9d6d5dae46046146af25bb5186ec4c2 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/Scene1.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1c19aedbf37873445b52d379726c3db5 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/Shader1.3.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader1.3" 2 | { 3 | Properties 4 | { 5 | _Color("Color", Color) = (0, 1, 1, 1) 6 | } 7 | SubShader 8 | { 9 | Pass 10 | { 11 | CGPROGRAM 12 | #pragma vertex vert 13 | #pragma fragment frag 14 | #pragma multi_compile_instancing 15 | 16 | #include "UnityCG.cginc" 17 | 18 | struct appdata 19 | { 20 | float4 vertex : POSITION; 21 | UNITY_VERTEX_INPUT_INSTANCE_ID 22 | }; 23 | 24 | struct v2f 25 | { 26 | float4 vertex : SV_POSITION; 27 | UNITY_VERTEX_INPUT_INSTANCE_ID 28 | }; 29 | 30 | UNITY_INSTANCING_BUFFER_START(Props) 31 | UNITY_DEFINE_INSTANCED_PROP(float4, _Color) 32 | UNITY_INSTANCING_BUFFER_END(Props) 33 | 34 | v2f vert(appdata v) 35 | { 36 | UNITY_SETUP_INSTANCE_ID(v); 37 | v2f o; 38 | UNITY_TRANSFER_INSTANCE_ID(v, o); 39 | o.vertex = UnityObjectToClipPos(v.vertex); 40 | return o; 41 | } 42 | 43 | fixed4 frag(v2f i) : SV_Target 44 | { 45 | UNITY_SETUP_INSTANCE_ID(i); 46 | fixed4 col = UNITY_ACCESS_INSTANCED_PROP(Props, _Color); 47 | return col; 48 | } 49 | ENDCG 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/Shader1.3.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: de7e7f181aa07e74b8cfb79e4693c792 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/Shader1.4.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader1.4" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | CGPROGRAM 8 | #pragma vertex vert 9 | #pragma fragment frag 10 | #pragma shader_feature INSTANCING_ON 11 | #define UNITY_INSTANCING_ENABLED 12 | 13 | #include "UnityCG.cginc" 14 | 15 | struct appdata 16 | { 17 | float4 vertex : POSITION; 18 | uint instanceID : SV_InstanceID; 19 | }; 20 | 21 | struct v2f 22 | { 23 | float4 vertex : SV_POSITION; 24 | uint instanceID : SV_InstanceID; 25 | }; 26 | 27 | float4 _Color[125]; 28 | 29 | v2f vert(appdata v) 30 | { 31 | v2f o; 32 | o.instanceID = v.instanceID; 33 | unity_ObjectToWorld = unity_Builtins0Array[v.instanceID].unity_ObjectToWorldArray; 34 | o.vertex = UnityObjectToClipPos(v.vertex); 35 | return o; 36 | } 37 | 38 | fixed4 frag(v2f i) : SV_Target 39 | { 40 | fixed4 col = _Color[i.instanceID]; 41 | return col; 42 | } 43 | ENDCG 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Assets/1.DrawViaScript/Shader1.4.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cfd26d66588fe02439652be7f17cda06 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ccfdc829ac7fe4b48871ddcfbf4eaf68 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/IndirectInstance.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace IndirectDraw 4 | { 5 | public class IndirectInstance : MonoBehaviour 6 | { 7 | public Mesh DMesh; 8 | public Material DMaterial; 9 | public int Count; 10 | 11 | private Bounds proxyBounds; 12 | private ComputeBuffer argsBuffer; 13 | void Start() 14 | { 15 | proxyBounds = new Bounds(Vector3.zero, 100.0f * Vector3.one); 16 | argsBuffer = new ComputeBuffer(1, 5 * sizeof(uint), ComputeBufferType.IndirectArguments); 17 | argsBuffer.name = nameof(argsBuffer); 18 | UpdateInstance(); 19 | } 20 | void UpdateInstance() 21 | { 22 | if (Count < 1) Count = 1; 23 | argsBuffer.SetData(new uint[5] { DMesh.GetIndexCount(0), (uint)Count, 0, 0, 0 }); 24 | DMaterial.SetInt("_InstanceCount", Count); 25 | DMaterial.SetVector("_ParentPosition", transform.position); 26 | } 27 | void Update() 28 | { 29 | if (Input.GetKey(KeyCode.UpArrow)) 30 | { 31 | Count++; 32 | UpdateInstance(); 33 | } 34 | else if (Input.GetKey(KeyCode.DownArrow) && Count > 1) 35 | { 36 | Count--; 37 | UpdateInstance(); 38 | } 39 | Graphics.DrawMeshInstancedIndirect(DMesh, 0, DMaterial, proxyBounds, argsBuffer); 40 | } 41 | private void OnDestroy() 42 | { 43 | argsBuffer?.Release(); 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/IndirectInstance.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 40d1d0f50d293f247af7a6d0d001323b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DMesh: {instanceID: 0} 8 | - DMaterial: {fileID: 2100000, guid: a05af2c895fdbec48ba929e7a12fca61, type: 2} 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/IndirectInstanceBuffer.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace IndirectDraw 4 | { 5 | public class IndirectInstanceBuffer : MonoBehaviour 6 | { 7 | public Mesh DMesh; 8 | public Material DMaterial; 9 | public int Count; 10 | 11 | private Bounds proxyBounds; 12 | private ComputeBuffer argsBuffer; 13 | private ComputeBuffer instanceBuffer; 14 | void Start() 15 | { 16 | proxyBounds = new Bounds(Vector3.zero, 100.0f * Vector3.one); 17 | argsBuffer = new ComputeBuffer(1, 5 * sizeof(uint), ComputeBufferType.IndirectArguments); 18 | argsBuffer.name = nameof(argsBuffer); 19 | UpdateInstance(); 20 | } 21 | void UpdateInstance() 22 | { 23 | if (Count < 1) Count = 1; 24 | instanceBuffer?.Release(); 25 | var paras = new InstancePara[Count]; 26 | var parentPosition = transform.position; 27 | int row = Mathf.FloorToInt(Mathf.Sqrt(Count - 1)) + 1; 28 | Random.InitState(0); 29 | for (int i = 0, k = 0; i < row; i++) 30 | { 31 | for (int j = 0; j < row && k < Count; j++, k++) 32 | { 33 | paras[k].model = Matrix4x4.TRS(parentPosition + new Vector3(0, i * 2, j * 2), Quaternion.identity, Vector3.one * Random.Range(0.2f, 1.2f)); 34 | paras[k].color = new Vector4(Random.Range(0.0f, 0.8f), Random.value, Random.value, 1.0f); 35 | } 36 | } 37 | instanceBuffer = new ComputeBuffer(Count, InstancePara.SIZE); 38 | instanceBuffer.name = nameof(instanceBuffer) + ":" + instanceBuffer.count; 39 | instanceBuffer.SetData(paras); 40 | DMaterial.SetBuffer("_InstanceBuffer", instanceBuffer); 41 | argsBuffer.SetData(new uint[5] { DMesh.GetIndexCount(0), (uint)Count, 0, 0, 0 }); 42 | } 43 | void Update() 44 | { 45 | if (Input.GetKey(KeyCode.UpArrow)) 46 | { 47 | Count++; 48 | UpdateInstance(); 49 | } 50 | else if (Input.GetKey(KeyCode.DownArrow) && Count > 1) 51 | { 52 | Count--; 53 | UpdateInstance(); 54 | } 55 | Graphics.DrawMeshInstancedIndirect(DMesh, 0, DMaterial, proxyBounds, argsBuffer); 56 | } 57 | private void OnDestroy() 58 | { 59 | argsBuffer?.Release(); 60 | instanceBuffer?.Release(); 61 | } 62 | struct InstancePara 63 | { 64 | public Matrix4x4 model; 65 | public Vector4 color; 66 | public const int SIZE = 16 * sizeof(float) + 4 * sizeof(float); 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/IndirectInstanceBuffer.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c00338ab34eb54345a1427011feab25b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DMesh: {instanceID: 0} 8 | - DMaterial: {fileID: 2100000, guid: d31636785443fb04b8c4fe07002eec37, type: 2} 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/InstanceArray.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace IndirectDraw 4 | { 5 | public class InstanceArray : MonoBehaviour 6 | { 7 | public Mesh DMesh; 8 | public Material DMaterial; 9 | [Range(1, 1023)] 10 | public int Count = 100; 11 | 12 | private Matrix4x4[] models; 13 | private MaterialPropertyBlock mpb; 14 | void Start() 15 | { 16 | UpdateInstance(); 17 | } 18 | void UpdateInstance() 19 | { 20 | if (Count < 1) Count = 1; 21 | if (Count > 1023) Count = 1023; 22 | models = new Matrix4x4[Count]; 23 | var colors = new Vector4[Count]; 24 | var parentPosition = transform.position; 25 | int row = Mathf.FloorToInt(Mathf.Sqrt(Count - 1)) + 1; 26 | Random.InitState(0); 27 | for (int i = 0, k = 0; i < row; i++) 28 | { 29 | for (int j = 0; j < row && k < Count; j++, k++) 30 | { 31 | var pos = parentPosition + new Vector3(0, i * 2, j * 2); 32 | models[k] = Matrix4x4.Translate(pos); 33 | colors[k] = new Vector4(Random.Range(0.0f, 0.8f), Random.value, Random.value, 1.0f); 34 | } 35 | } 36 | mpb = new MaterialPropertyBlock(); 37 | mpb.SetVectorArray("_Color", colors); 38 | } 39 | void Update() 40 | { 41 | if (Input.GetKey(KeyCode.UpArrow)) 42 | { 43 | Count++; 44 | UpdateInstance(); 45 | } 46 | else if (Input.GetKey(KeyCode.DownArrow) && Count > 1) 47 | { 48 | Count--; 49 | UpdateInstance(); 50 | } 51 | Graphics.DrawMeshInstanced(DMesh, 0, DMaterial, models, Count, mpb); 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/InstanceArray.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 372e39464c1b8ee449690d416fd22298 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/InstanceBuffer.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace IndirectDraw 4 | { 5 | public class InstanceBuffer : MonoBehaviour 6 | { 7 | public Mesh DMesh; 8 | public Material DMaterial; 9 | [Range(1, 511)] 10 | public int Count = 100; 11 | 12 | private Matrix4x4[] models; 13 | private ComputeBuffer instanceBuffer; 14 | void Start() 15 | { 16 | UpdateInstance(); 17 | } 18 | void UpdateInstance() 19 | { 20 | if (Count < 1) Count = 1; 21 | if (Count > 511) Count = 511; 22 | instanceBuffer?.Release(); 23 | models = new Matrix4x4[Count]; 24 | var paras = new InstancePara[Count]; 25 | var parentPosition = transform.position; 26 | int row = Mathf.FloorToInt(Mathf.Sqrt(Count - 1)) + 1; 27 | Random.InitState(0); 28 | for (int i = 0, k = 0; i < row; i++) 29 | { 30 | for (int j = 0; j < row && k < Count; j++, k++) 31 | { 32 | paras[k].position = parentPosition + new Vector3(0, i * 2, j * 2); 33 | models[0] = Matrix4x4.identity; 34 | paras[k].color = new Vector4(Random.Range(0.0f, 0.8f), Random.value, Random.value, 1.0f); 35 | } 36 | } 37 | instanceBuffer = new ComputeBuffer(Count, InstancePara.SIZE); 38 | instanceBuffer.name = nameof(instanceBuffer) + ":" + instanceBuffer.count; 39 | instanceBuffer.SetData(paras); 40 | DMaterial.SetBuffer("_InstanceBuffer", instanceBuffer); 41 | } 42 | void Update() 43 | { 44 | if (Input.GetKey(KeyCode.UpArrow)) 45 | { 46 | Count++; 47 | UpdateInstance(); 48 | } 49 | else if (Input.GetKey(KeyCode.DownArrow) && Count > 1) 50 | { 51 | Count--; 52 | UpdateInstance(); 53 | } 54 | Graphics.DrawMeshInstanced(DMesh, 0, DMaterial, models, Count); 55 | } 56 | private void OnDestroy() 57 | { 58 | instanceBuffer?.Release(); 59 | } 60 | struct InstancePara 61 | { 62 | public Vector4 position; 63 | public Vector4 color; 64 | public const int SIZE = 4 * sizeof(float) + 4 * sizeof(float); 65 | } 66 | } 67 | } -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/InstanceBuffer.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 81c2ca8a63308074ab7436093b679202 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DMesh: {instanceID: 0} 8 | - DMaterial: {fileID: 2100000, guid: 7c58e6e822d23d647bd4c54ed6d1ce83, type: 2} 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Material2.2.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material2.2 11 | m_Shader: {fileID: 4800000, guid: 8339e8564a6a8e24db676e4cc3f692ca, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 1 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Material2.2.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7c58e6e822d23d647bd4c54ed6d1ce83 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Material2.3.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material2.3 11 | m_Shader: {fileID: 4800000, guid: 5c136e361023aa2468543bbfd182aa0e, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 1 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Material2.3.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a05af2c895fdbec48ba929e7a12fca61 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Material2.4.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material2.4 11 | m_Shader: {fileID: 4800000, guid: 0e5a1ea82a844aa46b3d47ad7aba6fdf, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 1 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Material2.4.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d31636785443fb04b8c4fe07002eec37 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Scene2.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 085f8007da0acbd4c84e7265e1a06919 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Shader2.2.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader2.2" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | CGPROGRAM 8 | #pragma vertex vert 9 | #pragma fragment frag 10 | #pragma shader_feature INSTANCING_ON 11 | #define UNITY_INSTANCING_ENABLED 12 | 13 | #include "UnityCG.cginc" 14 | 15 | struct appdata 16 | { 17 | float4 vertex : POSITION; 18 | uint instanceID : SV_InstanceID; 19 | }; 20 | 21 | struct v2f 22 | { 23 | float4 vertex : SV_POSITION; 24 | uint instanceID : SV_InstanceID; 25 | }; 26 | 27 | struct InstancePara 28 | { 29 | float4 position; 30 | float4 color; 31 | }; 32 | StructuredBuffer _InstanceBuffer; 33 | 34 | v2f vert(appdata v) 35 | { 36 | v2f o; 37 | float4 offset = _InstanceBuffer[v.instanceID].position; 38 | o.vertex = UnityObjectToClipPos(v.vertex + offset); 39 | o.instanceID = v.instanceID; 40 | return o; 41 | } 42 | 43 | fixed4 frag(v2f i) : SV_Target 44 | { 45 | fixed4 col = _InstanceBuffer[i.instanceID].color; 46 | return col; 47 | } 48 | ENDCG 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Shader2.2.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8339e8564a6a8e24db676e4cc3f692ca 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Shader2.3.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader2.3" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | CGPROGRAM 8 | #pragma vertex vert 9 | #pragma fragment frag 10 | #pragma shader_feature INSTANCING_ON 11 | #define UNITY_INSTANCING_ENABLED 12 | #define UNITY_DONT_INSTANCE_OBJECT_MATRICES 13 | 14 | #include "UnityCG.cginc" 15 | 16 | struct appdata 17 | { 18 | float4 vertex : POSITION; 19 | uint instanceID : SV_InstanceID; 20 | }; 21 | 22 | struct v2f 23 | { 24 | float4 vertex : SV_POSITION; 25 | fixed4 color : COLOR; 26 | }; 27 | 28 | float4 _ParentPosition; 29 | uint _InstanceCount; 30 | 31 | v2f vert(appdata v) 32 | { 33 | v2f o; 34 | int row = ceil(sqrt(_InstanceCount)); 35 | float3 offset = float3(0, 2.0f * floor(v.instanceID / row), 2.0f * (v.instanceID % row)); 36 | float3 worldPos = v.vertex.xyz + _ParentPosition + offset; 37 | o.vertex = mul(UNITY_MATRIX_VP, float4(worldPos, 1)); 38 | float r = frac(2345.0f * sin(1234.0f * v.instanceID)) * 0.8f + 0.2f; 39 | float g = frac(6789.0f * sin(5678.0f * v.instanceID)); 40 | float b = frac(1369.0f * sin(9009.0f * v.instanceID)); 41 | fixed4 col = float4(r, g, b, 1); 42 | o.color = col; 43 | return o; 44 | } 45 | 46 | fixed4 frag(v2f i) : SV_Target 47 | { 48 | fixed4 col = i.color; 49 | return col; 50 | } 51 | ENDCG 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Shader2.3.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5c136e361023aa2468543bbfd182aa0e 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Shader2.4.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader2.3" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | CGPROGRAM 8 | #pragma vertex vert 9 | #pragma fragment frag 10 | #pragma shader_feature INSTANCING_ON 11 | #define UNITY_INSTANCING_ENABLED 12 | #define UNITY_DONT_INSTANCE_OBJECT_MATRICES 13 | 14 | #include "UnityCG.cginc" 15 | 16 | struct appdata 17 | { 18 | float4 vertex : POSITION; 19 | uint instanceID : SV_InstanceID; 20 | }; 21 | 22 | struct v2f 23 | { 24 | float4 vertex : SV_POSITION; 25 | uint instanceID : SV_InstanceID; 26 | }; 27 | 28 | struct InstancePara 29 | { 30 | float4x4 model; 31 | float4 color; 32 | }; 33 | StructuredBuffer _InstanceBuffer; 34 | 35 | v2f vert(appdata v) 36 | { 37 | v2f o; 38 | unity_ObjectToWorld = _InstanceBuffer[v.instanceID].model; 39 | o.vertex = UnityObjectToClipPos(v.vertex); 40 | o.instanceID = v.instanceID; 41 | return o; 42 | } 43 | 44 | fixed4 frag(v2f i) : SV_Target 45 | { 46 | fixed4 col = _InstanceBuffer[i.instanceID].color; 47 | return col; 48 | } 49 | ENDCG 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Assets/2.IndirectDraw/Shader2.4.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0e5a1ea82a844aa46b3d47ad7aba6fdf 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0e9d362024f728745ae21d639b5f2629 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/AdvancedMergeInstance.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace MergeInstance 4 | { 5 | public class AdvancedMergeInstance : MonoBehaviour 6 | { 7 | public Mesh DMeshA; //sphere 8 | public Mesh DMeshB; //capsule 9 | public Material DMaterial; 10 | 11 | private Matrix4x4[] models; 12 | private ComputeBuffer instanceBuffer; 13 | private ComputeBuffer vertexBuffer; 14 | private ComputeBuffer indexBuffer; 15 | private const uint MESH_VERTEX_COUNT = 2496; 16 | private Mesh proxyMesh; 17 | private void Start() 18 | { 19 | InitMergeMesh(); 20 | InitProxyMesh(); 21 | UpdateInstance(); 22 | } 23 | private void InitMergeMesh() 24 | { 25 | var indexDataA = DMeshA.triangles; 26 | var indexDataB = DMeshB.triangles; 27 | var vertexDataA = DMeshA.vertices; 28 | var vertexDataB = DMeshB.vertices; 29 | var mergeIndexData = new int[MESH_VERTEX_COUNT * 2]; 30 | for (int i = 0; i < indexDataA.Length; i++) 31 | { 32 | mergeIndexData[i] = indexDataA[i]; 33 | } 34 | for (int i = indexDataA.Length; i < MESH_VERTEX_COUNT; i++) 35 | { 36 | mergeIndexData[i] = indexDataA[indexDataA.Length - 1]; 37 | } 38 | for (int i = 0; i < indexDataB.Length; i++) 39 | { 40 | mergeIndexData[MESH_VERTEX_COUNT + i] = indexDataB[i] + vertexDataA.Length; 41 | } 42 | for (int i = (int)MESH_VERTEX_COUNT + indexDataB.Length; i < 2 * MESH_VERTEX_COUNT; i++) 43 | { 44 | mergeIndexData[i] = indexDataB[indexDataB.Length - 1] + vertexDataA.Length; 45 | } 46 | var mergeVertexData = new Vector3[vertexDataA.Length + vertexDataB.Length]; 47 | for (int i = 0; i < vertexDataA.Length; i++) 48 | { 49 | mergeVertexData[i] = vertexDataA[i]; 50 | } 51 | for (var i = 0; i < vertexDataB.Length; i++) 52 | { 53 | mergeVertexData[i + vertexDataA.Length] = vertexDataB[i]; 54 | } 55 | vertexBuffer = new ComputeBuffer(mergeVertexData.Length, 3 * sizeof(float)); 56 | vertexBuffer.name = nameof(vertexBuffer) + ":" + vertexBuffer.count; 57 | indexBuffer = new ComputeBuffer(mergeIndexData.Length, sizeof(int)); 58 | indexBuffer.name = nameof(indexBuffer) + ":" + indexBuffer.count; 59 | vertexBuffer.SetData(mergeVertexData); 60 | indexBuffer.SetData(mergeIndexData); 61 | DMaterial.SetBuffer("_VertexBuffer", vertexBuffer); 62 | DMaterial.SetBuffer("_IndexBuffer", indexBuffer); 63 | } 64 | private void InitProxyMesh() 65 | { 66 | proxyMesh = new Mesh(); 67 | var proxyVertexData = new Vector3[MESH_VERTEX_COUNT]; 68 | var proxyIndexData = new int[MESH_VERTEX_COUNT]; 69 | for (int i = 0; i < MESH_VERTEX_COUNT; i++) 70 | { 71 | proxyVertexData[i] = new Vector3(Random.value, Random.value, Random.value); 72 | proxyIndexData[i] = i; 73 | } 74 | proxyMesh.vertices = proxyVertexData; 75 | proxyMesh.triangles = proxyIndexData; 76 | proxyMesh.bounds = new Bounds(Vector3.zero, Vector3.one * 100.0f); 77 | } 78 | private void UpdateInstance() 79 | { 80 | models = new Matrix4x4[125 * 2]; 81 | var parentPosition = transform.position; 82 | for (int i = 0, n = 0; i < 5; i++) 83 | { 84 | for (int j = 0; j < 5; j++) 85 | { 86 | for (int k = 0; k < 5; k++, n++) 87 | { 88 | models[n] = Matrix4x4.TRS(parentPosition + 2.0f * new Vector3(i - 5, j, k), Quaternion.identity, Vector3.one * Random.Range(0.5f, 1.0f)); 89 | models[125 + n] = Matrix4x4.TRS(parentPosition + 2.0f * new Vector3(i + 5, j, k), Random.rotationUniform, Vector3.one * Random.Range(0.5f, 1.0f)); 90 | } 91 | } 92 | } 93 | var instanceParas = new InstancePara[125 * 2]; 94 | for (int i = 0; i < 125 * 2; i++) 95 | { 96 | instanceParas[i].indexOffset = i < 125 ? 0 : MESH_VERTEX_COUNT; 97 | instanceParas[i].color = new Vector4(i < 125 ? Random.value : Random.Range(0.1f, 0.6f), Random.value, Random.Range(0.2f, 1.0f), 1); 98 | } 99 | if (instanceBuffer == null) 100 | { 101 | instanceBuffer = new ComputeBuffer(125 * 2, InstancePara.SIZE); 102 | instanceBuffer.name = nameof(instanceBuffer) + ":" + instanceBuffer.count; 103 | DMaterial.SetBuffer("_InstanceBuffer", instanceBuffer); 104 | } 105 | instanceBuffer.SetData(instanceParas); 106 | } 107 | void Update() 108 | { 109 | if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.DownArrow)) 110 | { 111 | UpdateInstance(); 112 | } 113 | Graphics.DrawMeshInstanced(proxyMesh, 0, DMaterial, models); 114 | } 115 | private void OnDestroy() 116 | { 117 | instanceBuffer?.Release(); 118 | vertexBuffer?.Release(); 119 | indexBuffer?.Release(); 120 | } 121 | struct InstancePara 122 | { 123 | public uint indexOffset; 124 | public Vector4 color; 125 | public const int SIZE = sizeof(uint) + 4 * sizeof(float); 126 | } 127 | } 128 | } -------------------------------------------------------------------------------- /Assets/3.MergeInstance/AdvancedMergeInstance.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ff8d8997dd690704e8fd8be453f6cd01 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DMeshA: {instanceID: 0} 8 | - DMeshB: {instanceID: 0} 9 | - DMaterial: {fileID: 2100000, guid: b886982a3cf4ed14280c97e64d2dcb94, type: 2} 10 | executionOrder: 0 11 | icon: {instanceID: 0} 12 | userData: 13 | assetBundleName: 14 | assetBundleVariant: 15 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/LegacyMultiMesh.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace MergeInstance 4 | { 5 | public class LegacyMultiMesh : MonoBehaviour 6 | { 7 | public Mesh DMeshA; 8 | public Mesh DMeshB; 9 | public Material DMaterial; 10 | 11 | private Material DMaterialA; 12 | private Material DMaterialB; 13 | private Matrix4x4[] modelsA; 14 | private Matrix4x4[] modelsB; 15 | private void Start() 16 | { 17 | DMaterialA = Instantiate(DMaterial); 18 | DMaterialB = Instantiate(DMaterial); 19 | UpdateInstance(); 20 | } 21 | private void UpdateInstance() 22 | { 23 | modelsA = new Matrix4x4[125]; 24 | modelsB = new Matrix4x4[125]; 25 | var colorsA = new Vector4[125]; 26 | var colorsB = new Vector4[125]; 27 | var parentPosition = transform.position; 28 | for (int i = 0, n = 0; i < 5; i++) 29 | { 30 | for (int j = 0; j < 5; j++) 31 | { 32 | for (int k = 0; k < 5; k++, n++) 33 | { 34 | modelsA[n] = Matrix4x4.TRS(parentPosition + 2.0f * new Vector3(i - 5, j, k), Quaternion.identity, Vector3.one * Random.Range(0.5f, 1.0f)); 35 | modelsB[n] = Matrix4x4.TRS(parentPosition + 2.0f * new Vector3(i + 5, j, k), Random.rotationUniform, Vector3.one * Random.Range(0.5f, 1.0f)); 36 | colorsA[n] = new Vector4(Random.Range(0.0f, 0.7f), Random.Range(0.2f, 1.0f), Random.Range(0.3f, 1.0f), 1); 37 | colorsB[n] = new Vector4(Random.Range(0.7f, 1.0f), Random.Range(0.3f, 0.8f), Random.Range(0.0f, 0.4f), 1); 38 | } 39 | } 40 | } 41 | DMaterialA.SetVectorArray("_Color", colorsA); 42 | DMaterialB.SetVectorArray("_Color", colorsB); 43 | } 44 | void Update() 45 | { 46 | if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.DownArrow)) 47 | { 48 | UpdateInstance(); 49 | } 50 | Graphics.DrawMeshInstanced(DMeshA, 0, DMaterialA, modelsA); 51 | Graphics.DrawMeshInstanced(DMeshB, 0, DMaterialB, modelsB); 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /Assets/3.MergeInstance/LegacyMultiMesh.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ba1aa0541219c7e4ebdcb499aea7a03a 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Material3.2.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material3.2 11 | m_Shader: {fileID: 4800000, guid: b76712bdaf1def14a90db968f1b6a664, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Material3.2.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 33410b2b3bdf1954ba34db8bc21fe3e7 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Material3.3.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material3.3 11 | m_Shader: {fileID: 4800000, guid: db7aed6ddf9b3bf4bbde3334926c9b01, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 1 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Material3.3.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b886982a3cf4ed14280c97e64d2dcb94 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Material3.4.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material3.4 11 | m_Shader: {fileID: 4800000, guid: 128096e28d36bcb439e7e9c56f5eb25f, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 1 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Material3.4.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b18471e09d358164fa340e0c9e09fffc 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/MergeInstance.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 89356df19648f334cbf552242ec521b6 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DMeshA: {instanceID: 0} 8 | - DMeshB: {instanceID: 0} 9 | - DMaterial: {fileID: 2100000, guid: 33410b2b3bdf1954ba34db8bc21fe3e7, type: 2} 10 | executionOrder: 0 11 | icon: {instanceID: 0} 12 | userData: 13 | assetBundleName: 14 | assetBundleVariant: 15 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/ProcedualDraw.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace MergeInstance 4 | { 5 | public class ProcedualDraw : MonoBehaviour 6 | { 7 | public Mesh DMeshA; //sphere 8 | public Mesh DMeshB; //capsule 9 | public Material DMaterial; 10 | 11 | private Matrix4x4[] models; 12 | private ComputeBuffer instanceBuffer; 13 | private ComputeBuffer vertexBuffer; 14 | private ComputeBuffer indexBuffer; 15 | private const uint MESH_VERTEX_COUNT = 2496; 16 | private Bounds proxyBounds; 17 | private void Start() 18 | { 19 | proxyBounds = new Bounds(Vector3.zero, 100.0f * Vector3.one); 20 | InitMergeMesh(); 21 | UpdateInstance(); 22 | } 23 | private void InitMergeMesh() 24 | { 25 | var indexDataA = DMeshA.triangles; 26 | var indexDataB = DMeshB.triangles; 27 | var vertexDataA = DMeshA.vertices; 28 | var vertexDataB = DMeshB.vertices; 29 | var mergeIndexData = new int[MESH_VERTEX_COUNT * 2]; 30 | for (int i = 0; i < indexDataA.Length; i++) 31 | { 32 | mergeIndexData[i] = indexDataA[i]; 33 | } 34 | for (int i = indexDataA.Length; i < MESH_VERTEX_COUNT; i++) 35 | { 36 | mergeIndexData[i] = indexDataA[indexDataA.Length - 1]; 37 | } 38 | for (int i = 0; i < indexDataB.Length; i++) 39 | { 40 | mergeIndexData[MESH_VERTEX_COUNT + i] = indexDataB[i] + vertexDataA.Length; 41 | } 42 | for (int i = (int)MESH_VERTEX_COUNT + indexDataB.Length; i < 2 * MESH_VERTEX_COUNT; i++) 43 | { 44 | mergeIndexData[i] = indexDataB[indexDataB.Length - 1] + vertexDataA.Length; 45 | } 46 | var mergeVertexData = new Vector3[vertexDataA.Length + vertexDataB.Length]; 47 | for (int i = 0; i < vertexDataA.Length; i++) 48 | { 49 | mergeVertexData[i] = vertexDataA[i]; 50 | } 51 | for (var i = 0; i < vertexDataB.Length; i++) 52 | { 53 | mergeVertexData[i + vertexDataA.Length] = vertexDataB[i]; 54 | } 55 | vertexBuffer = new ComputeBuffer(mergeVertexData.Length, 3 * sizeof(float)); 56 | vertexBuffer.name = nameof(vertexBuffer) + ":" + vertexBuffer.count; 57 | indexBuffer = new ComputeBuffer(mergeIndexData.Length, sizeof(int)); 58 | indexBuffer.name = nameof(indexBuffer) + ":" + indexBuffer.count; 59 | vertexBuffer.SetData(mergeVertexData); 60 | indexBuffer.SetData(mergeIndexData); 61 | DMaterial.SetBuffer("_VertexBuffer", vertexBuffer); 62 | DMaterial.SetBuffer("_IndexBuffer", indexBuffer); 63 | } 64 | private void UpdateInstance() 65 | { 66 | models = new Matrix4x4[125 * 2]; 67 | var parentPosition = transform.position; 68 | for (int i = 0, n = 0; i < 5; i++) 69 | { 70 | for (int j = 0; j < 5; j++) 71 | { 72 | for (int k = 0; k < 5; k++, n++) 73 | { 74 | models[n] = Matrix4x4.TRS(parentPosition + 2.0f * new Vector3(i - 5, j, k), Quaternion.identity, Vector3.one * Random.Range(0.5f, 1.0f)); 75 | models[125 + n] = Matrix4x4.TRS(parentPosition + 2.0f * new Vector3(i + 5, j, k), Random.rotationUniform, Vector3.one * Random.Range(0.5f, 1.0f)); 76 | } 77 | } 78 | } 79 | var instanceParas = new InstancePara[125 * 2]; 80 | for (int i = 0; i < 125 * 2; i++) 81 | { 82 | instanceParas[i].indexOffset = i < 125 ? 0 : MESH_VERTEX_COUNT; 83 | instanceParas[i].model = models[i]; 84 | instanceParas[i].color = new Vector4(i < 125 ? Random.value : Random.Range(0.1f, 0.3f), Random.value, Random.Range(0.7f, 1.0f), 1); 85 | } 86 | if (instanceBuffer == null) 87 | { 88 | instanceBuffer = new ComputeBuffer(125 * 2, InstancePara.SIZE); 89 | instanceBuffer.name = nameof(instanceBuffer) + ":" + instanceBuffer.count; 90 | DMaterial.SetBuffer("_InstanceBuffer", instanceBuffer); 91 | } 92 | instanceBuffer.SetData(instanceParas); 93 | } 94 | void Update() 95 | { 96 | if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.DownArrow)) 97 | { 98 | UpdateInstance(); 99 | } 100 | Graphics.DrawProcedural(DMaterial, proxyBounds, MeshTopology.Triangles, (int)MESH_VERTEX_COUNT, 125 * 2); 101 | } 102 | private void OnDestroy() 103 | { 104 | instanceBuffer?.Release(); 105 | vertexBuffer?.Release(); 106 | indexBuffer?.Release(); 107 | } 108 | struct InstancePara 109 | { 110 | public uint indexOffset; 111 | public Matrix4x4 model; 112 | public Vector4 color; 113 | public const int SIZE = sizeof(uint) + 16 * sizeof(float) + 4 * sizeof(float); 114 | } 115 | } 116 | } -------------------------------------------------------------------------------- /Assets/3.MergeInstance/ProcedualDraw.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 19f9e92c9a534b749ae125cf179fb67b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DMeshA: {instanceID: 0} 8 | - DMeshB: {instanceID: 0} 9 | - DMaterial: {fileID: 2100000, guid: b18471e09d358164fa340e0c9e09fffc, type: 2} 10 | executionOrder: 0 11 | icon: {instanceID: 0} 12 | userData: 13 | assetBundleName: 14 | assetBundleVariant: 15 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Scene3.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fb2aa6f8d3c98ee4c942e7f412502f0c 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Shader3.2.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader3.2" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | CGPROGRAM 8 | #pragma vertex vert 9 | #pragma fragment frag 10 | #define MESH_VERTEX_COUNT 2496 11 | 12 | #include "UnityCG.cginc" 13 | 14 | struct appdata 15 | { 16 | uint vertexID : SV_VertexID; 17 | }; 18 | 19 | struct v2f 20 | { 21 | float4 vertex : SV_POSITION; 22 | float3 color : COLOR; 23 | }; 24 | 25 | struct InstancePara 26 | { 27 | uint indexOffset; 28 | float4x4 model; 29 | float4 color; 30 | }; 31 | 32 | StructuredBuffer _VertexBuffer; 33 | StructuredBuffer _IndexBuffer; 34 | StructuredBuffer _InstanceBuffer; 35 | 36 | v2f vert(appdata v) 37 | { 38 | uint instanceID = v.vertexID / MESH_VERTEX_COUNT; 39 | uint vertexID = v.vertexID % MESH_VERTEX_COUNT; 40 | InstancePara para = _InstanceBuffer[instanceID]; 41 | uint index = _IndexBuffer[para.indexOffset + vertexID]; 42 | float3 vertex = _VertexBuffer[index]; 43 | 44 | v2f o; 45 | unity_ObjectToWorld = para.model; 46 | o.vertex = UnityObjectToClipPos(vertex); 47 | o.color = para.color; 48 | return o; 49 | } 50 | 51 | fixed4 frag(v2f i) : SV_Target 52 | { 53 | fixed4 col = fixed4(i.color,1); 54 | return col; 55 | } 56 | ENDCG 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Shader3.2.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b76712bdaf1def14a90db968f1b6a664 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Shader3.3.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader3.3" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | CGPROGRAM 8 | #pragma vertex vert 9 | #pragma fragment frag 10 | #pragma shader_feature INSTANCING_ON 11 | #define UNITY_INSTANCING_ENABLED 12 | #define MESH_VERTEX_COUNT 2496 13 | 14 | #include "UnityCG.cginc" 15 | 16 | struct appdata 17 | { 18 | uint vertexID : SV_VertexID; 19 | uint instanceID : SV_InstanceID; 20 | }; 21 | 22 | struct v2f 23 | { 24 | float4 vertex : SV_POSITION; 25 | float3 color : COLOR; 26 | }; 27 | 28 | struct InstancePara 29 | { 30 | uint indexOffset; 31 | float4 color; 32 | }; 33 | 34 | StructuredBuffer _VertexBuffer; 35 | StructuredBuffer _IndexBuffer; 36 | StructuredBuffer _InstanceBuffer; 37 | 38 | v2f vert(appdata v) 39 | { 40 | uint vertexID = v.vertexID % MESH_VERTEX_COUNT; 41 | InstancePara para = _InstanceBuffer[v.instanceID]; 42 | uint index = _IndexBuffer[para.indexOffset + vertexID]; 43 | float3 vertex = _VertexBuffer[index]; 44 | 45 | v2f o; 46 | unity_ObjectToWorld = unity_Builtins0Array[v.instanceID].unity_ObjectToWorldArray; 47 | o.vertex = UnityObjectToClipPos(vertex); 48 | o.color = para.color; 49 | return o; 50 | } 51 | 52 | fixed4 frag(v2f i) : SV_Target 53 | { 54 | fixed4 col = fixed4(i.color,1); 55 | return col; 56 | } 57 | ENDCG 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Shader3.3.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: db7aed6ddf9b3bf4bbde3334926c9b01 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Shader3.4.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader3.4" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | CGPROGRAM 8 | #pragma vertex vert 9 | #pragma fragment frag 10 | #pragma shader_feature INSTANCING_ON 11 | #define UNITY_INSTANCING_ENABLED 12 | #define UNITY_DONT_INSTANCE_OBJECT_MATRICES 13 | #define MESH_VERTEX_COUNT 2496 14 | 15 | #include "UnityCG.cginc" 16 | 17 | struct appdata 18 | { 19 | uint vertexID : SV_VertexID; 20 | uint instanceID : SV_InstanceID; 21 | }; 22 | 23 | struct v2f 24 | { 25 | float4 vertex : SV_POSITION; 26 | float3 color : COLOR; 27 | }; 28 | 29 | struct InstancePara 30 | { 31 | uint indexOffset; 32 | float4x4 model; 33 | float4 color; 34 | }; 35 | 36 | StructuredBuffer _VertexBuffer; 37 | StructuredBuffer _IndexBuffer; 38 | StructuredBuffer _InstanceBuffer; 39 | 40 | v2f vert(appdata v) 41 | { 42 | uint vertexID = v.vertexID % MESH_VERTEX_COUNT; 43 | InstancePara para = _InstanceBuffer[v.instanceID]; 44 | uint index = _IndexBuffer[para.indexOffset + vertexID]; 45 | float3 vertex = _VertexBuffer[index]; 46 | 47 | v2f o; 48 | unity_ObjectToWorld = para.model; 49 | o.vertex = UnityObjectToClipPos(vertex); 50 | o.color = para.color; 51 | return o; 52 | } 53 | 54 | fixed4 frag(v2f i) : SV_Target 55 | { 56 | fixed4 col = fixed4(i.color,1); 57 | return col; 58 | } 59 | ENDCG 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Assets/3.MergeInstance/Shader3.4.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 128096e28d36bcb439e7e9c56f5eb25f 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/4.FrustumCulling.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 06512afaa6df22f4688f09e63333a322 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/CPUFrustumCulling.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace FrustumCulling 4 | { 5 | public class CPUFrustumCulling : MonoBehaviour 6 | { 7 | public Camera DCamera; 8 | public Mesh DMesh; 9 | public Material DMaterial; 10 | public int Count; 11 | 12 | private InstancePara[] instanceParas; 13 | private Bounds proxyBounds; 14 | private ComputeBuffer instanceBuffer; 15 | private Plane[] cullingPlanes = new Plane[6]; 16 | void Start() 17 | { 18 | proxyBounds = new Bounds(Vector3.zero, 100.0f * Vector3.one); 19 | UpdateInstance(); 20 | } 21 | private void UpdateInstance() 22 | { 23 | if (Count < 1) Count = 1; 24 | instanceParas = new InstancePara[Count]; 25 | var row = Mathf.FloorToInt(Mathf.Pow(Count - 1, 1.0f / 3.0f)) + 1; 26 | var parentPosition = transform.position; 27 | Random.InitState(0); 28 | for (int i = 0, n = 0; i < row; i++) 29 | { 30 | for (int j = 0; j < row; j++) 31 | { 32 | for (int k = 0; k < row && n < Count; k++, n++) 33 | { 34 | instanceParas[n].model = Matrix4x4.TRS(parentPosition + 2.0f * new Vector3(i, j, k), Quaternion.identity, Vector3.one * Random.Range(0.5f, 1.0f)); 35 | instanceParas[n].color = new Vector4(Random.Range(0.3f, 0.6f), Random.value, Random.Range(0.7f, 1.0f), 1); 36 | } 37 | } 38 | } 39 | instanceBuffer?.Release(); 40 | instanceBuffer = new ComputeBuffer(Count, InstancePara.SIZE); 41 | instanceBuffer.name = nameof(instanceBuffer) + ":" + instanceBuffer.count; 42 | DMaterial.SetBuffer("_InstanceBuffer", instanceBuffer); 43 | } 44 | void Update() 45 | { 46 | if (Input.GetKey(KeyCode.UpArrow)) 47 | { 48 | Count = Count + Mathf.Max(Count / 10, 1); 49 | UpdateInstance(); 50 | } 51 | else if (Input.GetKey(KeyCode.DownArrow) && Count > 1) 52 | { 53 | Count = Count - Mathf.Max(Count / 10, 1); 54 | UpdateInstance(); 55 | } 56 | GeometryUtility.CalculateFrustumPlanes(DCamera, cullingPlanes); 57 | var visibleCount = CPUFrustumCull(); 58 | if (visibleCount > 0) 59 | { 60 | Graphics.DrawMeshInstancedProcedural(DMesh, 0, DMaterial, proxyBounds, visibleCount); 61 | } 62 | } 63 | private int CPUFrustumCull() 64 | { 65 | var instanceParasResult = new InstancePara[Count]; 66 | var bounds = DMesh.bounds; 67 | int visibleCount = 0; 68 | for (int i = 0; i < Count; i++) 69 | { 70 | var mt = instanceParas[i].model.transpose; 71 | if (PlaneTestBounds(bounds, cullingPlanes, ref mt)) 72 | { 73 | instanceParasResult[visibleCount++] = instanceParas[i]; 74 | } 75 | } 76 | if (visibleCount > 0) 77 | { 78 | instanceBuffer.SetData(instanceParasResult); 79 | } 80 | return visibleCount; 81 | } 82 | private bool PlaneTestBounds(Bounds boxLocal, Plane[] worldPlanes, ref Matrix4x4 mT) 83 | { 84 | foreach (var plane in worldPlanes) 85 | { 86 | var planeLocal = mT * new Vector4(plane.normal.x, plane.normal.y, plane.normal.z, plane.distance); 87 | Vector3 normalAbs = new Vector3(Mathf.Abs(planeLocal.x), Mathf.Abs(planeLocal.y), Mathf.Abs(planeLocal.z)); 88 | float radius = Vector3.Dot(normalAbs, boxLocal.extents); 89 | float dist = Vector3.Dot(planeLocal, boxLocal.center) + planeLocal.w; 90 | if (radius + dist <= 0) 91 | { 92 | return false; 93 | } 94 | } 95 | return true; 96 | } 97 | private void OnDestroy() 98 | { 99 | instanceBuffer?.Release(); 100 | } 101 | struct InstancePara 102 | { 103 | public Matrix4x4 model; 104 | public Vector4 color; 105 | public const int SIZE = 16 * sizeof(float) + 4 * sizeof(float); 106 | } 107 | } 108 | } -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/CPUFrustumCulling.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f6ffc7aca171ec94fb43237369f2b957 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/ComputeShader4.2.compute: -------------------------------------------------------------------------------- 1 | #pragma kernel FrustumCullMain 2 | #define KERNEL_SIZE_X 64 3 | 4 | struct InstancePara 5 | { 6 | float4x4 model; 7 | float4 padding_for_other_para; 8 | }; 9 | StructuredBuffer _InstanceBuffer; 10 | RWStructuredBuffer _ArgsBuffer; 11 | RWStructuredBuffer _VisibilityBuffer; 12 | uint _Count; 13 | float3 _BoundsCenter; 14 | float3 _BoundsExtent; 15 | float4 _CullingPlanes[6]; 16 | 17 | inline bool PlaneTest(float4 planeWorld, float3 boundsCenterLocal, float3 boundsExtentLocal, float4x4 modelTranspose) 18 | { 19 | float4 planeLocal = mul(modelTranspose, planeWorld); 20 | float3 normalAbs = abs(planeLocal.xyz); 21 | float radius = dot(normalAbs, boundsExtentLocal); 22 | float dist = dot(planeLocal.xyz, boundsCenterLocal) + planeLocal.w; 23 | return radius + dist > 0; 24 | } 25 | 26 | [numthreads(KERNEL_SIZE_X, 1, 1)] 27 | void FrustumCullMain(uint3 id : SV_DispatchThreadID) 28 | { 29 | if (id.x < _Count) 30 | { 31 | float4x4 mT = transpose(_InstanceBuffer[id.x].model); 32 | [unroll] 33 | for (int i = 0; i < 6; i++) 34 | { 35 | if (!PlaneTest(_CullingPlanes[i], _BoundsCenter, _BoundsExtent, mT)) 36 | { 37 | return; 38 | } 39 | } 40 | int currentIndex = 0; 41 | InterlockedAdd(_ArgsBuffer[1], 1, currentIndex); 42 | _VisibilityBuffer[currentIndex] = id.x; 43 | } 44 | } -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/ComputeShader4.2.compute.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ec6cafa80de694a429f4f592c9199e8b 3 | ComputeShaderImporter: 4 | externalObjects: {} 5 | preprocessorOverride: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/Debug.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 845817f259e922940ad81518abbf509a 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/Debug/FrustumCullingDebugger.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace FrustumCulling 4 | { 5 | public class FrustumCullingDebugger : MonoBehaviour 6 | { 7 | public Camera DCamera; 8 | public Bounds DBounds; 9 | private Plane[] cullingPlanes = new Plane[6]; 10 | 11 | void Update() 12 | { 13 | GeometryUtility.CalculateFrustumPlanes(DCamera, cullingPlanes); 14 | } 15 | private bool CPUFrustumCull() 16 | { 17 | var mt = this.transform.localToWorldMatrix.transpose; 18 | return PlaneTestBounds(DBounds, cullingPlanes, ref mt); 19 | } 20 | private bool PlaneTestBounds(Bounds boxLocal, Plane[] worldPlanes, ref Matrix4x4 mT) 21 | { 22 | foreach (var plane in worldPlanes) 23 | { 24 | var planeLocal = mT * new Vector4(plane.normal.x, plane.normal.y, plane.normal.z, plane.distance); 25 | Vector3 normalAbs = new Vector3(Mathf.Abs(planeLocal.x), Mathf.Abs(planeLocal.y), Mathf.Abs(planeLocal.z)); 26 | float radius = Vector3.Dot(normalAbs, boxLocal.extents); 27 | float dist = Vector3.Dot(planeLocal, boxLocal.center) + planeLocal.w; 28 | if (radius + dist <= 0) 29 | { 30 | return false; 31 | } 32 | } 33 | return true; 34 | } 35 | private void OnDrawGizmos() 36 | { 37 | if (Application.isPlaying) 38 | { 39 | Gizmos.matrix = this.transform.localToWorldMatrix; 40 | Gizmos.color = CPUFrustumCull() ? Color.yellow : Color.red; 41 | Gizmos.DrawCube(DBounds.center, DBounds.size); 42 | Gizmos.color = Color.green; 43 | Gizmos.matrix = DCamera.transform.localToWorldMatrix; 44 | Gizmos.DrawFrustum(Vector3.zero, DCamera.fieldOfView, DCamera.farClipPlane, DCamera.nearClipPlane, DCamera.aspect); 45 | } 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/Debug/FrustumCullingDebugger.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f229e9aad2bcefd41a0c2cc38df69b32 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/GPUFrustumCulling.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace FrustumCulling 4 | { 5 | public class GPUFrustumCulling : MonoBehaviour 6 | { 7 | public Camera DCamera; 8 | public Mesh DMesh; 9 | public Material DMaterial; 10 | public int Count; 11 | public ComputeShader DComputeShader; 12 | 13 | private const int KERNEL_SIZE_X = 64; 14 | private uint indexCount; 15 | private int cullKernelID; 16 | private int kernelGroupX; 17 | private Bounds proxyBounds; 18 | private ComputeBuffer argsBuffer; 19 | private ComputeBuffer visibilityBuffer; 20 | private ComputeBuffer instanceBuffer; 21 | private Plane[] cullingPlanes = new Plane[6]; 22 | private Vector4[] cullingPlaneVectors = new Vector4[6]; 23 | void Start() 24 | { 25 | proxyBounds = new Bounds(Vector3.zero, 1000.0f * Vector3.one); 26 | argsBuffer = new ComputeBuffer(1, 5 * sizeof(uint), ComputeBufferType.IndirectArguments); 27 | argsBuffer.name = nameof(argsBuffer); 28 | cullKernelID = DComputeShader.FindKernel("FrustumCullMain"); 29 | indexCount = DMesh.GetIndexCount(0); 30 | var bounds = DMesh.bounds; 31 | DComputeShader.SetVector("_BoundsCenter", bounds.center); 32 | DComputeShader.SetVector("_BoundsExtent", new Vector3(0.5f, 0.5f, 0.5f)); 33 | DComputeShader.SetBuffer(cullKernelID, "_ArgsBuffer", argsBuffer); 34 | UpdateInstance(); 35 | } 36 | private void UpdateInstance() 37 | { 38 | if (Count < 1) Count = 1; 39 | var instanceParas = new InstancePara[Count]; 40 | var row = Mathf.FloorToInt(Mathf.Pow(Count - 1, 1.0f / 3.0f)) + 1; 41 | var parentPosition = transform.position; 42 | Random.InitState(0); 43 | for (int i = 0, n = 0; i < row; i++) 44 | { 45 | for (int j = 0; j < row; j++) 46 | { 47 | for (int k = 0; k < row && n < Count; k++, n++) 48 | { 49 | instanceParas[n].model = Matrix4x4.TRS(parentPosition + 2.0f * new Vector3(i, j, k), Quaternion.identity, Vector3.one * Random.Range(0.5f, 1.0f)); 50 | instanceParas[n].color = new Vector4(Random.Range(0.7f, 1.0f), Random.Range(0.1f, 0.6f), Random.value, 1); 51 | } 52 | } 53 | } 54 | instanceBuffer?.Release(); 55 | instanceBuffer = new ComputeBuffer(Count, InstancePara.SIZE); 56 | instanceBuffer.name = nameof(instanceBuffer) + ":" + instanceBuffer.count; 57 | instanceBuffer.SetData(instanceParas); 58 | visibilityBuffer?.Release(); 59 | visibilityBuffer = new ComputeBuffer(Count, sizeof(uint)); 60 | visibilityBuffer.name = nameof(visibilityBuffer) + ":" + visibilityBuffer.count; 61 | visibilityBuffer.SetData(new uint[Count]); 62 | 63 | DComputeShader.SetBuffer(cullKernelID, "_InstanceBuffer", instanceBuffer); 64 | DComputeShader.SetBuffer(cullKernelID, "_VisibilityBuffer", visibilityBuffer); 65 | DComputeShader.SetInt("_Count", Count); 66 | DMaterial.SetBuffer("_InstanceBuffer", instanceBuffer); 67 | DMaterial.SetBuffer("_VisibilityBuffer", visibilityBuffer); 68 | kernelGroupX = Mathf.CeilToInt(1.0f * Count / KERNEL_SIZE_X); 69 | } 70 | private void UpdateCullingPlane() 71 | { 72 | GeometryUtility.CalculateFrustumPlanes(DCamera, cullingPlanes); 73 | for (int i = 0; i < 6; i++) 74 | { 75 | var normal = cullingPlanes[i].normal; 76 | cullingPlaneVectors[i] = new Vector4(normal.x, normal.y, normal.z, cullingPlanes[i].distance); 77 | } 78 | } 79 | void Update() 80 | { 81 | if (Input.GetKey(KeyCode.UpArrow)) 82 | { 83 | Count = Count + Mathf.Max(Count / 10, 1); 84 | UpdateInstance(); 85 | } 86 | else if (Input.GetKey(KeyCode.DownArrow) && Count > 1) 87 | { 88 | Count = Count - Mathf.Max(Count / 10, 1); 89 | UpdateInstance(); 90 | } 91 | UpdateCullingPlane(); 92 | DComputeShader.SetVectorArray("_CullingPlanes", cullingPlaneVectors); 93 | argsBuffer.SetData(new uint[5] { indexCount, 0, 0, 0, 0 }); 94 | DComputeShader.Dispatch(cullKernelID, kernelGroupX, 1, 1); 95 | Graphics.DrawMeshInstancedIndirect(DMesh, 0, DMaterial, proxyBounds, argsBuffer); 96 | } 97 | private void OnDestroy() 98 | { 99 | argsBuffer?.Release(); 100 | visibilityBuffer?.Release(); 101 | instanceBuffer?.Release(); 102 | } 103 | struct InstancePara 104 | { 105 | public Matrix4x4 model; 106 | public Vector4 color; 107 | public const int SIZE = 16 * sizeof(float) + 4 * sizeof(float); 108 | } 109 | } 110 | } -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/GPUFrustumCulling.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9e84f5b2f8fcdbc498a9cf37f6501c81 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DCamera: {instanceID: 0} 8 | - DMesh: {instanceID: 0} 9 | - DMaterial: {fileID: 2100000, guid: 37bc59882d8dcbe4185089d6ad0d827f, type: 2} 10 | - DComputeShader: {fileID: 7200000, guid: ec6cafa80de694a429f4f592c9199e8b, type: 3} 11 | executionOrder: 0 12 | icon: {instanceID: 0} 13 | userData: 14 | assetBundleName: 15 | assetBundleVariant: 16 | -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/Material4.2.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material4.2 11 | m_Shader: {fileID: 4800000, guid: 4028c6341ec3f54408f25e6c36a43eae, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/Material4.2.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 37bc59882d8dcbe4185089d6ad0d827f 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/Scene4.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2a205c10579723c44aec1aa8e5e2ecd4 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/Shader4.2.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader4.2" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | CGPROGRAM 8 | #pragma vertex vert 9 | #pragma fragment frag 10 | 11 | #include "UnityCG.cginc" 12 | 13 | struct appdata 14 | { 15 | float4 vertex : POSITION; 16 | uint instanceID : SV_InstanceID; 17 | }; 18 | 19 | struct v2f 20 | { 21 | float4 vertex : SV_POSITION; 22 | float3 color : COLOR; 23 | }; 24 | 25 | struct InstancePara 26 | { 27 | float4x4 model; 28 | float4 color; 29 | }; 30 | 31 | StructuredBuffer _VisibilityBuffer; 32 | StructuredBuffer _InstanceBuffer; 33 | 34 | v2f vert(appdata v) 35 | { 36 | uint instanceID = _VisibilityBuffer[v.instanceID]; 37 | InstancePara para = _InstanceBuffer[instanceID]; 38 | unity_ObjectToWorld = para.model; 39 | 40 | v2f o; 41 | o.vertex = UnityObjectToClipPos(v.vertex); 42 | o.color = para.color; 43 | return o; 44 | } 45 | 46 | fixed4 frag(v2f i) : SV_Target 47 | { 48 | fixed4 col = fixed4(i.color,1); 49 | return col; 50 | } 51 | ENDCG 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Assets/4.FrustumCulling/Shader4.2.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4028c6341ec3f54408f25e6c36a43eae 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 698d47cbde6148747bc9bb5d4f79a1b5 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/ClustersCulling.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ebf60393c3d54f24eaf7613b00255b57 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DCamera: {instanceID: 0} 8 | - DClusters: {instanceID: 0} 9 | - DMaterial: {fileID: 2100000, guid: e3135fc7e7242f1469ea6b8e90d4faf4, type: 2} 10 | - DComputeShader: {fileID: 7200000, guid: 41144b2d0646f4a43be8fe402bfdf55e, type: 3} 11 | executionOrder: 0 12 | icon: {instanceID: 0} 13 | userData: 14 | assetBundleName: 15 | assetBundleVariant: 16 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/ClustersData.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace MeshClusterRendering 4 | { 5 | public class ClustersData : ScriptableObject 6 | { 7 | public Mesh RawMesh; 8 | public string Name; 9 | public int QuadsPerCluster; 10 | public int ClusterCount; 11 | public Vector3[] Vertices; 12 | public Bounds[] BoundingBoxes; 13 | } 14 | } -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/ClustersData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 75ab3bc1afa0a3548b6110049bbf7633 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/ClustersRendering.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace MeshClusterRendering 4 | { 5 | public class ClustersRendering : MonoBehaviour 6 | { 7 | public ClustersData DClusters; 8 | public Material DMaterial; 9 | public int Count; 10 | 11 | private const int CLUSTER_VERTEX_COUNT = 64; 12 | private Bounds proxyBounds; 13 | private ComputeBuffer instanceBuffer; 14 | private ComputeBuffer vertexBuffer; 15 | void Start() 16 | { 17 | proxyBounds = new Bounds(Vector3.zero, 1000.0f * Vector3.one); 18 | InitClusters(); 19 | UpdateInstance(); 20 | } 21 | private void InitClusters() 22 | { 23 | var vertexData = DClusters.Vertices; 24 | vertexBuffer = new ComputeBuffer(vertexData.Length, 3 * sizeof(float)); 25 | vertexBuffer.name = nameof(vertexBuffer) + ":" + vertexBuffer.count; 26 | vertexBuffer.SetData(vertexData); 27 | DMaterial.SetBuffer("_VertexBuffer", vertexBuffer); 28 | DMaterial.SetInteger("_ClusterCount", DClusters.ClusterCount); 29 | } 30 | private void UpdateInstance() 31 | { 32 | if (Count < 1) Count = 1; 33 | var instanceParas = new InstancePara[Count]; 34 | var row = Mathf.FloorToInt(Mathf.Pow(Count - 1, 1.0f / 3.0f)) + 1; 35 | var parentPosition = transform.position; 36 | Random.InitState(0); 37 | for (int i = 0, n = 0; i < row; i++) 38 | { 39 | for (int j = 0; j < row; j++) 40 | { 41 | for (int k = 0; k < row && n < Count; k++, n++) 42 | { 43 | instanceParas[n].model = Matrix4x4.TRS(parentPosition + 2.0f * new Vector3(i, j, k), Quaternion.identity, Vector3.one * Random.Range(0.5f, 1.0f)); 44 | instanceParas[n].color = new Vector4(Random.Range(0.7f, 1.0f), Random.Range(0.1f, 0.6f), Random.value, 1); 45 | } 46 | } 47 | } 48 | instanceBuffer?.Release(); 49 | instanceBuffer = new ComputeBuffer(Count, InstancePara.SIZE); 50 | instanceBuffer.name = nameof(instanceBuffer) + ":" + instanceBuffer.count; 51 | instanceBuffer.SetData(instanceParas); 52 | DMaterial.SetBuffer("_InstanceBuffer", instanceBuffer); 53 | } 54 | void Update() 55 | { 56 | if (Input.GetKey(KeyCode.UpArrow)) 57 | { 58 | Count = Count + Mathf.Max(Count / 10, 1); 59 | UpdateInstance(); 60 | } 61 | else if (Input.GetKey(KeyCode.DownArrow) && Count > 1) 62 | { 63 | Count = Count - Mathf.Max(Count / 10, 1); 64 | UpdateInstance(); 65 | } 66 | Graphics.DrawProcedural(DMaterial, proxyBounds, MeshTopology.Quads, CLUSTER_VERTEX_COUNT, Count * DClusters.ClusterCount); 67 | } 68 | private void OnDestroy() 69 | { 70 | instanceBuffer?.Release(); 71 | vertexBuffer?.Release(); 72 | } 73 | struct InstancePara 74 | { 75 | public Matrix4x4 model; 76 | public Vector4 color; 77 | public const int SIZE = 16 * sizeof(float) + 4 * sizeof(float); 78 | } 79 | } 80 | } -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/ClustersRendering.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5f42397f409bbd5498f3a4b0fab14dcd 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DClusters: {instanceID: 0} 8 | - DMaterial: {fileID: 2100000, guid: bd114d5c9b9e53f45a3d8f8fbd628bc9, type: 2} 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/ComputeShader5.2.compute: -------------------------------------------------------------------------------- 1 | #pragma kernel FrustumCullMain 2 | #define KERNEL_SIZE_X 64 3 | #define MAX_CLUSTER_COUNT 64 4 | 5 | struct InstancePara 6 | { 7 | float4x4 model; 8 | float4 padding_for_other_para; 9 | }; 10 | struct BoundingBox 11 | { 12 | float3 center; 13 | float3 extent; 14 | }; 15 | StructuredBuffer _BoundingBoxes; 16 | StructuredBuffer _InstanceBuffer; 17 | RWStructuredBuffer _ArgsBuffer; 18 | RWStructuredBuffer _VisibilityBuffer; 19 | uint _Count; 20 | float4 _CullingPlanes[6]; 21 | uint _ClusterCount; 22 | 23 | inline bool PlaneTest(float4 planeLocal, float3 boundsCenterLocal, float3 boundsExtentLocal) 24 | { 25 | float3 normalAbs = abs(planeLocal.xyz); 26 | float radius = dot(normalAbs, boundsExtentLocal); 27 | float dist = dot(planeLocal.xyz, boundsCenterLocal) + planeLocal.w; 28 | return radius + dist > 0; 29 | } 30 | 31 | [numthreads(KERNEL_SIZE_X, 1, 1)] 32 | void FrustumCullMain(uint3 id : SV_DispatchThreadID) 33 | { 34 | if (id.x < _Count) 35 | { 36 | float4x4 modelTranspose = transpose(_InstanceBuffer[id.x].model); 37 | [unroll] for (uint i = 0; i < 6; i++) 38 | { 39 | _CullingPlanes[i] = mul(modelTranspose, _CullingPlanes[i]); 40 | } 41 | uint visibleCount = 0; 42 | uint visibleArray[MAX_CLUSTER_COUNT]; 43 | uint clusterOffset = id.x * _ClusterCount; 44 | for (uint n = 0; n < _ClusterCount; n++) 45 | { 46 | BoundingBox bounds = _BoundingBoxes[n]; 47 | bool visible = true; 48 | [unroll] for (uint i = 0; i < 6; i++) 49 | { 50 | if (!PlaneTest(_CullingPlanes[i], bounds.center, bounds.extent)) 51 | { 52 | visible = false; 53 | break; 54 | } 55 | } 56 | if (visible) 57 | { 58 | visibleArray[visibleCount] = clusterOffset + n; 59 | visibleCount++; 60 | } 61 | } 62 | if (visibleCount > 0) 63 | { 64 | uint currentIndex = 0; 65 | InterlockedAdd(_ArgsBuffer[1], visibleCount, currentIndex); 66 | for (uint i = 0; i < visibleCount; i++) 67 | { 68 | _VisibilityBuffer[currentIndex + i] = visibleArray[i]; 69 | } 70 | } 71 | } 72 | } -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/ComputeShader5.2.compute.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 41144b2d0646f4a43be8fe402bfdf55e 3 | ComputeShaderImporter: 4 | externalObjects: {} 5 | preprocessorOverride: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/ComputeShader5.3.compute: -------------------------------------------------------------------------------- 1 | #pragma kernel FrustumCullMain 2 | #define KERNEL_SIZE_X 64 3 | #define CLUSTER_VERTEX_COUNT 64 4 | 5 | struct InstancePara 6 | { 7 | float4x4 model; 8 | float4 padding_for_other_para; 9 | uint vertexOffset; 10 | uint clusterIndex; 11 | }; 12 | struct BoundingBox 13 | { 14 | float3 center; 15 | float3 extent; 16 | }; 17 | StructuredBuffer _BoundingBoxes; 18 | StructuredBuffer _InstanceBuffer; 19 | StructuredBuffer _ClusterBuffer; 20 | RWStructuredBuffer _ArgsBuffer; 21 | RWStructuredBuffer _VisibilityBuffer; 22 | uint _ClusterCount; 23 | float4 _CullingPlanes[6]; 24 | 25 | inline bool PlaneTest(float4 planeWorld, float3 boundsCenterLocal, float3 boundsExtentLocal, float4x4 modelTranspose) 26 | { 27 | float4 planeLocal = mul(modelTranspose, planeWorld); 28 | float3 normalAbs = abs(planeLocal.xyz); 29 | float radius = dot(normalAbs, boundsExtentLocal); 30 | float dist = dot(planeLocal.xyz, boundsCenterLocal) + planeLocal.w; 31 | return radius + dist > 0; 32 | } 33 | 34 | [numthreads(KERNEL_SIZE_X, 1, 1)] 35 | void FrustumCullMain(uint3 id : SV_DispatchThreadID) 36 | { 37 | if (id.x < _ClusterCount) 38 | { 39 | uint instanceID = _ClusterBuffer[id.x]; 40 | InstancePara para = _InstanceBuffer[instanceID]; 41 | float4x4 modelTranspose = transpose(para.model); 42 | BoundingBox bounds = _BoundingBoxes[para.vertexOffset / CLUSTER_VERTEX_COUNT + id.x - para.clusterIndex]; 43 | [unroll] 44 | for (uint i = 0; i < 6; i++) 45 | { 46 | if (!PlaneTest(_CullingPlanes[i], bounds.center, bounds.extent, modelTranspose)) 47 | { 48 | return; 49 | } 50 | } 51 | uint currentIndex = 0; 52 | InterlockedAdd(_ArgsBuffer[1], 1, currentIndex); 53 | _VisibilityBuffer[currentIndex] = id.x; 54 | } 55 | } -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/ComputeShader5.3.compute.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 279e3969e37dcf54688688a62a18926f 3 | ComputeShaderImporter: 4 | externalObjects: {} 5 | preprocessorOverride: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Debug.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 922681e6d5bb10a46ae66fb00c45e63d 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Debug/ClustersDebugger.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace MeshClusterRendering 4 | { 5 | public class ClustersDebugger : MonoBehaviour 6 | { 7 | public ClustersData DCluster; 8 | public Material DMaterial; 9 | public bool ShowAll = true; 10 | [Range(0.0f, 1.0f)] 11 | public float ShowIndex = 0.0f; 12 | private Mesh[] meshes; 13 | void Start() 14 | { 15 | meshes = new Mesh[DCluster.ClusterCount]; 16 | var ibo = new int[DCluster.QuadsPerCluster * 4]; 17 | for (int i = 0; i < DCluster.QuadsPerCluster * 4; i++) 18 | { 19 | ibo[i] = i; 20 | } 21 | for (int i = 0; i < DCluster.ClusterCount; i++) 22 | { 23 | meshes[i] = new Mesh(); 24 | meshes[i].name = DCluster.name; 25 | var vbo = new Vector3[DCluster.QuadsPerCluster * 4]; 26 | for (int j = 0; j < DCluster.QuadsPerCluster * 4; j++) 27 | { 28 | vbo[j] = DCluster.Vertices[i * DCluster.QuadsPerCluster * 4 + j]; 29 | } 30 | meshes[i].vertices = vbo; 31 | meshes[i].SetIndices(ibo, MeshTopology.Quads, 0); 32 | meshes[i].RecalculateNormals(); 33 | meshes[i].RecalculateTangents(); 34 | meshes[i].RecalculateBounds(); 35 | meshes[i].UploadMeshData(false); 36 | } 37 | } 38 | 39 | void LateUpdate() 40 | { 41 | if (ShowAll) 42 | { 43 | for (int i = 0; i < DCluster.ClusterCount; i++) 44 | { 45 | Graphics.DrawMesh(meshes[i], transform.localToWorldMatrix, DMaterial, 0); 46 | } 47 | } 48 | else 49 | { 50 | int i = (int)(ShowIndex * (DCluster.ClusterCount - 1)); 51 | Graphics.DrawMesh(meshes[i], transform.localToWorldMatrix, DMaterial, 0); 52 | } 53 | } 54 | private void OnDrawGizmos() 55 | { 56 | if (Application.isPlaying) 57 | { 58 | Gizmos.matrix = transform.localToWorldMatrix; 59 | Gizmos.color = Color.green; 60 | if (ShowAll) 61 | { 62 | for (int i = 0; i < DCluster.ClusterCount; i++) 63 | { 64 | Gizmos.DrawWireCube(DCluster.BoundingBoxes[i].center, DCluster.BoundingBoxes[i].size); 65 | } 66 | } 67 | else 68 | { 69 | int i = (int)(ShowIndex * (DCluster.ClusterCount - 1)); 70 | Gizmos.DrawWireCube(DCluster.BoundingBoxes[i].center, DCluster.BoundingBoxes[i].size); 71 | } 72 | } 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Debug/ClustersDebugger.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f5a898543f197a543999ff7981c04b50 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DCluster: {instanceID: 0} 8 | - DMaterial: {fileID: 2100000, guid: 19fc49eba09685943a3edf1c85ab6568, type: 2} 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Debug/MaterialDebug5.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: MaterialDebug5 11 | m_Shader: {fileID: 4800000, guid: 3288b45c943442749a70f578157a1413, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: 23 | - _MainTex: 24 | m_Texture: {fileID: 0} 25 | m_Scale: {x: 1, y: 1} 26 | m_Offset: {x: 0, y: 0} 27 | m_Ints: [] 28 | m_Floats: 29 | - _Glossiness: 0.5 30 | - _Metallic: 0 31 | m_Colors: 32 | - _BackFaceColor: {r: 1, g: 1, b: 0, a: 1} 33 | - _Color: {r: 0, g: 1, b: 1, a: 1} 34 | m_BuildTextureStacks: [] 35 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Debug/MaterialDebug5.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 19fc49eba09685943a3edf1c85ab6568 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Debug/ShaderDebug5.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/ShaderDebug5" 2 | { 3 | Properties 4 | { 5 | _Color ("Color", Color) = (0,1,1,1) 6 | _BackFaceColor ("BackFaceColor", Color) = (1,1,0,1) 7 | _Glossiness ("Smoothness", Range(0,1)) = 0.5 8 | _Metallic ("Metallic", Range(0,1)) = 0.0 9 | } 10 | SubShader 11 | { 12 | Cull Off 13 | CGPROGRAM 14 | #pragma surface surf Standard fullforwardshadows 15 | 16 | struct Input 17 | { 18 | bool facing : SV_IsFrontFace; 19 | }; 20 | half _Glossiness; 21 | half _Metallic; 22 | fixed4 _Color; 23 | fixed4 _BackFaceColor; 24 | 25 | void surf (Input IN, inout SurfaceOutputStandard o) 26 | { 27 | fixed4 c = IN.facing ? _Color : _BackFaceColor; 28 | o.Emission = 0.1 * c.rgb; 29 | o.Albedo = c.rgb; 30 | o.Metallic = _Metallic; 31 | o.Smoothness = _Glossiness; 32 | o.Alpha = c.a; 33 | } 34 | ENDCG 35 | } 36 | FallBack "Diffuse" 37 | } 38 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Debug/ShaderDebug5.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3288b45c943442749a70f578157a1413 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 794e4761bbee02a418a4eb4500495c19 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Editor/ClustersDataGenerator.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e5c4436072eb3e64a9f701fe1ae258ab 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Material5.1.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material5.1 11 | m_Shader: {fileID: 4800000, guid: a41c70a0ded105b4a96ecd896dd668db, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Material5.1.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bd114d5c9b9e53f45a3d8f8fbd628bc9 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Material5.2.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material5.2 11 | m_Shader: {fileID: 4800000, guid: 68d76a8d608278e45918edc9f89c5e33, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: 26 | - _BackFaceColor: {r: 0, g: 0, b: 0, a: 1} 27 | m_BuildTextureStacks: [] 28 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Material5.2.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e3135fc7e7242f1469ea6b8e90d4faf4 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Material5.3.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material5.3 11 | m_Shader: {fileID: 4800000, guid: 3abe1f1b5c0e73043a8e55828786924f, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: 26 | - _BackFaceColor: {r: 0, g: 0, b: 0, a: 1} 27 | m_BuildTextureStacks: [] 28 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Material5.3.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ca76409c5e11db94ca91590fdfff1306 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/MultiMeshClusters.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a1372d5215d9d434fb3fedae273db1d5 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DCamera: {instanceID: 0} 8 | - DMaterial: {fileID: 2100000, guid: ca76409c5e11db94ca91590fdfff1306, type: 2} 9 | - DComputeShader: {fileID: 7200000, guid: 279e3969e37dcf54688688a62a18926f, type: 3} 10 | executionOrder: 0 11 | icon: {instanceID: 0} 12 | userData: 13 | assetBundleName: 14 | assetBundleVariant: 15 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Res.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8d8a54c98c2de444c8b3364d7b282845 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Res/CapsuleClusters.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 682fc295d2d57eb47a3461b49401d4f8 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Res/CapsuleMesh.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ea92a6d5208ed5f47bbfbd3edf9488f3 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 4300000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Res/CubeClusters.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 75ab3bc1afa0a3548b6110049bbf7633, type: 3} 13 | m_Name: CubeClusters 14 | m_EditorClassIdentifier: 15 | RawMesh: {fileID: 4300000, guid: 10208266513e6634782a5b3a8885eeca, type: 2} 16 | Name: CubeMesh_Clusters 17 | QuadsPerCluster: 16 18 | ClusterCount: 1 19 | Vertices: 20 | - {x: 0.5, y: -0.5, z: 0.5} 21 | - {x: 0.5, y: 0.5, z: 0.5} 22 | - {x: -0.5, y: 0.5, z: 0.5} 23 | - {x: -0.5, y: -0.5, z: 0.5} 24 | - {x: 0.5, y: 0.5, z: 0.5} 25 | - {x: 0.5, y: 0.5, z: -0.5} 26 | - {x: -0.5, y: 0.5, z: -0.5} 27 | - {x: -0.5, y: 0.5, z: 0.5} 28 | - {x: 0.5, y: 0.5, z: -0.5} 29 | - {x: 0.5, y: -0.5, z: -0.5} 30 | - {x: -0.5, y: -0.5, z: -0.5} 31 | - {x: -0.5, y: 0.5, z: -0.5} 32 | - {x: 0.5, y: -0.5, z: -0.5} 33 | - {x: 0.5, y: -0.5, z: 0.5} 34 | - {x: -0.5, y: -0.5, z: 0.5} 35 | - {x: -0.5, y: -0.5, z: -0.5} 36 | - {x: -0.5, y: -0.5, z: 0.5} 37 | - {x: -0.5, y: 0.5, z: 0.5} 38 | - {x: -0.5, y: 0.5, z: -0.5} 39 | - {x: -0.5, y: -0.5, z: -0.5} 40 | - {x: 0.5, y: -0.5, z: -0.5} 41 | - {x: 0.5, y: 0.5, z: -0.5} 42 | - {x: 0.5, y: 0.5, z: 0.5} 43 | - {x: 0.5, y: -0.5, z: 0.5} 44 | - {x: 0.5, y: -0.5, z: 0.5} 45 | - {x: 0.5, y: -0.5, z: 0.5} 46 | - {x: 0.5, y: -0.5, z: 0.5} 47 | - {x: 0.5, y: -0.5, z: 0.5} 48 | - {x: 0.5, y: -0.5, z: 0.5} 49 | - {x: 0.5, y: -0.5, z: 0.5} 50 | - {x: 0.5, y: -0.5, z: 0.5} 51 | - {x: 0.5, y: -0.5, z: 0.5} 52 | - {x: 0.5, y: -0.5, z: 0.5} 53 | - {x: 0.5, y: -0.5, z: 0.5} 54 | - {x: 0.5, y: -0.5, z: 0.5} 55 | - {x: 0.5, y: -0.5, z: 0.5} 56 | - {x: 0.5, y: -0.5, z: 0.5} 57 | - {x: 0.5, y: -0.5, z: 0.5} 58 | - {x: 0.5, y: -0.5, z: 0.5} 59 | - {x: 0.5, y: -0.5, z: 0.5} 60 | - {x: 0.5, y: -0.5, z: 0.5} 61 | - {x: 0.5, y: -0.5, z: 0.5} 62 | - {x: 0.5, y: -0.5, z: 0.5} 63 | - {x: 0.5, y: -0.5, z: 0.5} 64 | - {x: 0.5, y: -0.5, z: 0.5} 65 | - {x: 0.5, y: -0.5, z: 0.5} 66 | - {x: 0.5, y: -0.5, z: 0.5} 67 | - {x: 0.5, y: -0.5, z: 0.5} 68 | - {x: 0.5, y: -0.5, z: 0.5} 69 | - {x: 0.5, y: -0.5, z: 0.5} 70 | - {x: 0.5, y: -0.5, z: 0.5} 71 | - {x: 0.5, y: -0.5, z: 0.5} 72 | - {x: 0.5, y: -0.5, z: 0.5} 73 | - {x: 0.5, y: -0.5, z: 0.5} 74 | - {x: 0.5, y: -0.5, z: 0.5} 75 | - {x: 0.5, y: -0.5, z: 0.5} 76 | - {x: 0.5, y: -0.5, z: 0.5} 77 | - {x: 0.5, y: -0.5, z: 0.5} 78 | - {x: 0.5, y: -0.5, z: 0.5} 79 | - {x: 0.5, y: -0.5, z: 0.5} 80 | - {x: 0.5, y: -0.5, z: 0.5} 81 | - {x: 0.5, y: -0.5, z: 0.5} 82 | - {x: 0.5, y: -0.5, z: 0.5} 83 | - {x: 0.5, y: -0.5, z: 0.5} 84 | BoundingBoxes: 85 | - m_Center: {x: 0, y: 0, z: 0} 86 | m_Extent: {x: 0.5, y: 0.5, z: 0.5} 87 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Res/CubeClusters.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ed8f1094a2286db44a45e76832278191 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Res/CubeMesh.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 10208266513e6634782a5b3a8885eeca 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 4300000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Res/CylinderClusters.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d97e46850bdab3042b08d58b84c766fb 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Res/CylinderMesh.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 47bf7cca35104584497d9ca8195c5aaf 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 4300000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Res/SphereClusters.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ad620528eb923b647acdc2e9b4f13ee3 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Res/SphereMesh.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 054e495dbcb24854f863805ab3978fe7 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 4300000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Scene5.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 35adf29d6dfed1f40859d73af13b9a70 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Shader5.1.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader5.1" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | CGPROGRAM 8 | #pragma vertex vert 9 | #pragma fragment frag 10 | #define CLUSTER_VERTEX_COUNT 64 11 | 12 | #include "UnityCG.cginc" 13 | 14 | struct appdata 15 | { 16 | uint vertexID : SV_VertexID; 17 | uint instanceID : SV_InstanceID; 18 | }; 19 | 20 | struct v2f 21 | { 22 | float4 vertex : SV_POSITION; 23 | float3 color : COLOR; 24 | }; 25 | 26 | struct InstancePara 27 | { 28 | float4x4 model; 29 | float4 color; 30 | }; 31 | 32 | uint _ClusterCount; 33 | StructuredBuffer _VertexBuffer; 34 | StructuredBuffer _InstanceBuffer; 35 | 36 | v2f vert(appdata v) 37 | { 38 | uint instanceID = v.instanceID / _ClusterCount; 39 | uint clusterID = v.instanceID % _ClusterCount; 40 | InstancePara para = _InstanceBuffer[instanceID]; 41 | uint index = clusterID * CLUSTER_VERTEX_COUNT + v.vertexID; 42 | float3 vertex = _VertexBuffer[index]; 43 | 44 | v2f o; 45 | unity_ObjectToWorld = para.model; 46 | o.vertex = UnityObjectToClipPos(vertex); 47 | o.color = para.color; 48 | return o; 49 | } 50 | 51 | fixed4 frag(v2f i) : SV_Target 52 | { 53 | fixed4 col = fixed4(i.color,1); 54 | return col; 55 | } 56 | ENDCG 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Shader5.1.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a41c70a0ded105b4a96ecd896dd668db 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Shader5.2.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader5.2" 2 | { 3 | Properties 4 | { 5 | _BackFaceColor("Back Face Color", Color) = (0,0,0,1) 6 | } 7 | SubShader 8 | { 9 | Pass 10 | { 11 | Cull Off 12 | CGPROGRAM 13 | #pragma vertex vert 14 | #pragma fragment frag 15 | #define CLUSTER_VERTEX_COUNT 64 16 | 17 | #include "UnityCG.cginc" 18 | 19 | struct appdata 20 | { 21 | uint vertexID : SV_VertexID; 22 | uint instanceID : SV_InstanceID; 23 | }; 24 | 25 | struct v2f 26 | { 27 | float4 vertex : SV_POSITION; 28 | float3 color : COLOR; 29 | }; 30 | 31 | struct InstancePara 32 | { 33 | float4x4 model; 34 | float4 color; 35 | }; 36 | 37 | int _ClusterCount; 38 | StructuredBuffer _VertexBuffer; 39 | StructuredBuffer _VisibilityBuffer; 40 | StructuredBuffer _InstanceBuffer; 41 | float4 _BackFaceColor; 42 | 43 | v2f vert(appdata v) 44 | { 45 | uint visibleIndex = _VisibilityBuffer[v.instanceID]; 46 | uint instanceID = visibleIndex / _ClusterCount; 47 | uint clusterID = visibleIndex % _ClusterCount; 48 | InstancePara para = _InstanceBuffer[instanceID]; 49 | uint index = clusterID * CLUSTER_VERTEX_COUNT + v.vertexID; 50 | float3 vertex = _VertexBuffer[index]; 51 | 52 | v2f o; 53 | unity_ObjectToWorld = para.model; 54 | o.vertex = UnityObjectToClipPos(vertex); 55 | o.color = para.color; 56 | return o; 57 | } 58 | 59 | fixed4 frag(v2f i, bool facing : SV_IsFrontFace) : SV_Target 60 | { 61 | fixed4 col = facing ? fixed4(i.color,1) : _BackFaceColor; 62 | return col; 63 | } 64 | ENDCG 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Shader5.2.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 68d76a8d608278e45918edc9f89c5e33 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Shader5.3.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader5.3" 2 | { 3 | Properties 4 | { 5 | _BackFaceColor("Back Face Color", Color) = (0,0,0,1) 6 | } 7 | SubShader 8 | { 9 | Pass 10 | { 11 | Cull Off 12 | CGPROGRAM 13 | #pragma vertex vert 14 | #pragma fragment frag 15 | #define CLUSTER_VERTEX_COUNT 64 16 | 17 | #include "UnityCG.cginc" 18 | 19 | struct appdata 20 | { 21 | uint vertexID : SV_VertexID; 22 | uint instanceID : SV_InstanceID; 23 | }; 24 | 25 | struct v2f 26 | { 27 | float4 vertex : SV_POSITION; 28 | float3 color : COLOR; 29 | }; 30 | 31 | struct InstancePara 32 | { 33 | float4x4 model; 34 | float4 color; 35 | uint vertexOffset; 36 | uint clusterIndex; 37 | }; 38 | 39 | StructuredBuffer _VertexBuffer; 40 | StructuredBuffer _VisibilityBuffer; 41 | StructuredBuffer _InstanceBuffer; 42 | StructuredBuffer _ClusterBuffer; 43 | float4 _BackFaceColor; 44 | 45 | v2f vert(appdata v) 46 | { 47 | uint visibleID = _VisibilityBuffer[v.instanceID]; 48 | uint instanceID = _ClusterBuffer[visibleID]; 49 | InstancePara para = _InstanceBuffer[instanceID]; 50 | uint index = para.vertexOffset + CLUSTER_VERTEX_COUNT * (visibleID - para.clusterIndex) + v.vertexID; 51 | float3 vertex = _VertexBuffer[index]; 52 | 53 | v2f o; 54 | unity_ObjectToWorld = para.model; 55 | o.vertex = UnityObjectToClipPos(vertex); 56 | o.color = para.color; 57 | return o; 58 | } 59 | 60 | fixed4 frag(v2f i, bool facing : SV_IsFrontFace) : SV_Target 61 | { 62 | fixed4 col = facing ? fixed4(i.color,1) : _BackFaceColor; 63 | return col; 64 | } 65 | ENDCG 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /Assets/5.MeshClusterRendering/Shader5.3.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3abe1f1b5c0e73043a8e55828786924f 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 85c014a8ea44a0c41aab3a49d29fcfc0 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/BackFaceCulling.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3bb46db684b67bb49a6e41913b75bfb4 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DCamera: {instanceID: 0} 8 | - DMaterial: {instanceID: 0} 9 | - DComputeShader: {fileID: 7200000, guid: 48f9a81713ac2aa469ca073b611c5bc6, type: 3} 10 | executionOrder: 0 11 | icon: {instanceID: 0} 12 | userData: 13 | assetBundleName: 14 | assetBundleVariant: 15 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/BoundingCone.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace BackFaceCulling 4 | { 5 | [System.Serializable] 6 | public struct BoundingCone 7 | { 8 | public Vector3 normal; 9 | public float cosAngle; 10 | public float sinAngle; 11 | public const int SIZE = 3 * sizeof(float) + 2 * sizeof(float); 12 | public BoundingCone(Vector3 normal, float angleRad) 13 | { 14 | this.normal = normal; 15 | this.cosAngle = Mathf.Cos(angleRad); 16 | this.sinAngle = Mathf.Sin(angleRad); 17 | } 18 | public BoundingCone(Vector3[] directions) : this(directions[0], 0.0f) 19 | { 20 | var count = directions.Length; 21 | for (int i = 0; i < count; i++) 22 | { 23 | for (int j = i + 1; j < count; j++) 24 | { 25 | var cosAngle = Vector3.Dot(directions[i], directions[j]); 26 | if (cosAngle < this.cosAngle) 27 | { 28 | this.cosAngle = cosAngle; 29 | this.sinAngle = Mathf.Sqrt(1 - cosAngle * cosAngle); 30 | this.normal = directions[i] + directions[j]; 31 | } 32 | } 33 | } 34 | if (this.normal == Vector3.zero) 35 | { 36 | this.normal = Vector3.one; 37 | } 38 | else 39 | { 40 | this.normal.Normalize(); 41 | for (int i = 0; i < count; i++) 42 | { 43 | Encapsulate(directions[i]); 44 | } 45 | } 46 | } 47 | public void Expand(float angleRad) 48 | { 49 | this.cosAngle = Mathf.Cos(Mathf.Min(Mathf.Acos(this.cosAngle) + angleRad, Mathf.PI)); 50 | } 51 | public void Encapsulate(Vector3 direction) 52 | { 53 | if (!Contains(direction)) 54 | { 55 | Vector3 y = Vector3.Cross(direction, this.normal).normalized; 56 | var beta = Vector3.Dot(this.normal, direction); 57 | var halfAngle = Mathf.Rad2Deg * 0.5f * (Mathf.Acos(this.cosAngle) + Mathf.Acos(beta)); 58 | Quaternion rotation = Quaternion.AngleAxis(halfAngle, y); 59 | var halfDirection = rotation * direction; 60 | this.normal = halfDirection.normalized; 61 | this.cosAngle = Mathf.Cos(Mathf.Deg2Rad * halfAngle); 62 | this.sinAngle = Mathf.Sin(Mathf.Deg2Rad * halfAngle); 63 | } 64 | } 65 | public bool Contains(Vector3 direction) 66 | { 67 | return Vector3.Dot(direction, this.normal) >= this.cosAngle; 68 | } 69 | } 70 | } -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/BoundingCone.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7c4761cd469b4d443b1dc3c65b82db36 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/BoundingSphere.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace BackFaceCulling 4 | { 5 | [System.Serializable] 6 | public struct BoundingSphere 7 | { 8 | public Vector3 center; 9 | public float radius; 10 | public const int SIZE = 3 * sizeof(float) + sizeof(float); 11 | public BoundingSphere(Vector3 center, float radius) 12 | { 13 | this.center = center; 14 | this.radius = radius; 15 | } 16 | public BoundingSphere(Vector3[] points) 17 | { 18 | var aabb = new Bounds(points[0], Vector3.zero); 19 | var count = points.Length; 20 | for (int i = 1; i < count; i++) 21 | { 22 | aabb.Encapsulate(points[i]); 23 | } 24 | this.center = aabb.center; 25 | this.radius = 0; 26 | for (int i = 1; i < count; i++) 27 | { 28 | var sqrLength = (points[i] - this.center).sqrMagnitude; 29 | this.radius = Mathf.Max(sqrLength, this.radius); 30 | } 31 | this.radius = Mathf.Sqrt(this.radius); 32 | } 33 | public void Expand(float amount) 34 | { 35 | this.radius += amount; 36 | } 37 | public void Encapsulate(Vector3 point) 38 | { 39 | if (!Contains(point)) 40 | { 41 | var dir = (this.center - point).normalized; 42 | var far = this.center + dir * this.radius; 43 | this.center = 0.5f * (far + point); 44 | this.radius = (far - this.center).magnitude; 45 | } 46 | } 47 | public bool Contains(Vector3 point) 48 | { 49 | var sqrLength = (point - this.center).sqrMagnitude; 50 | return sqrLength <= this.radius * this.radius; 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/BoundingSphere.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c2590e27f42395d43a50706271fe315b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/ClustersData.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace BackFaceCulling 4 | { 5 | public class ClustersData : ScriptableObject 6 | { 7 | public Mesh RawMesh; 8 | public string Name; 9 | public int QuadsPerCluster; 10 | public int ClusterCount; 11 | public Vector3[] Vertices; 12 | public ClusterBoundsData[] ClusterBounds; 13 | [System.Serializable] 14 | public struct ClusterBoundsData 15 | { 16 | public BoundingSphere BoundingSphere; 17 | public BoundingCone BoundingCone; 18 | public const int SIZE = BoundingSphere.SIZE + BoundingCone.SIZE; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/ClustersData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: db26f3044f58d3f49a7855c111aa3615 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/ComputeShader6.1.compute: -------------------------------------------------------------------------------- 1 | #pragma kernel ClusterCullMain 2 | #define KERNEL_SIZE_X 64 3 | #define CLUSTER_VERTEX_COUNT 64 4 | 5 | struct InstancePara 6 | { 7 | float4x4 model; 8 | float4 padding_for_other_para; 9 | uint vertexOffset; 10 | uint clusterIndex; 11 | }; 12 | struct BoundingSphere 13 | { 14 | float3 center; 15 | float radius; 16 | }; 17 | struct BoundingCone 18 | { 19 | float3 normal; 20 | float cosAngle; 21 | float sinAngle; 22 | }; 23 | struct ClusterBoundsData 24 | { 25 | BoundingSphere boundingSphere; 26 | BoundingCone boundingCone; 27 | }; 28 | StructuredBuffer _ClusterBounds; 29 | StructuredBuffer _InstanceBuffer; 30 | StructuredBuffer _ClusterBuffer; 31 | RWStructuredBuffer _ArgsBuffer; 32 | RWStructuredBuffer _VisibilityBuffer; 33 | uint _ClusterCount; 34 | float4 _CullingPlanes[6]; 35 | float3 _CameraPosition; 36 | 37 | inline bool PlaneTest(float4 planeWorld, BoundingSphere boundsLocal, float4x4 modelTranspose) 38 | { 39 | float4 planeLocal = mul(modelTranspose, planeWorld); 40 | float distance = dot(planeLocal.xyz, boundsLocal.center) + planeLocal.w; 41 | return distance > -boundsLocal.radius; 42 | } 43 | 44 | inline bool BackFaceTest(ClusterBoundsData boundingData, float4x4 model) 45 | { 46 | float3 worldNormal = normalize(mul((float3x3)model, boundingData.boundingCone.normal)); 47 | float3 worldCenter = mul(model, float4(boundingData.boundingSphere.center, 1)).xyz; 48 | float d = dot(worldNormal, normalize(_CameraPosition - worldCenter)); 49 | float sinA = boundingData.boundingCone.sinAngle; 50 | //return d > -sinA; //19.2 51 | float cosA = boundingData.boundingCone.cosAngle; //sqrt(1 - sinA * sinA); 52 | float sinB = boundingData.boundingSphere.radius / length(_CameraPosition - worldCenter); 53 | float cosB = sqrt(1 - sinB * sinB); 54 | float sinAB = sinA * cosB + cosA * sinB; 55 | return d > -sinAB; //19.3 56 | } 57 | 58 | [numthreads(KERNEL_SIZE_X, 1, 1)] 59 | void ClusterCullMain(uint3 id : SV_DispatchThreadID) 60 | { 61 | if (id.x < _ClusterCount) 62 | { 63 | uint instanceID = _ClusterBuffer[id.x]; 64 | InstancePara para = _InstanceBuffer[instanceID]; 65 | float4x4 modelTranspose = transpose(para.model); 66 | ClusterBoundsData boundsData = _ClusterBounds[para.vertexOffset / CLUSTER_VERTEX_COUNT + id.x - para.clusterIndex]; 67 | if (!BackFaceTest(boundsData, para.model)) 68 | { 69 | return; 70 | } 71 | [unroll] 72 | for (uint i = 0; i < 6; i++) 73 | { 74 | if (!PlaneTest(_CullingPlanes[i], boundsData.boundingSphere, modelTranspose)) 75 | { 76 | return; 77 | } 78 | } 79 | uint currentIndex = 0; 80 | InterlockedAdd(_ArgsBuffer[1], 1, currentIndex); 81 | _VisibilityBuffer[currentIndex] = id.x; 82 | } 83 | } -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/ComputeShader6.1.compute.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 48f9a81713ac2aa469ca073b611c5bc6 3 | ComputeShaderImporter: 4 | externalObjects: {} 5 | preprocessorOverride: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Debug.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 78765fe0e668a7e48b8bb7638e2f4131 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Debug/ConeDebugger.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace BackFaceCulling 4 | { 5 | public class ConeDebugger : MonoBehaviour 6 | { 7 | public ClustersData DCluster; 8 | public Camera DCamera; 9 | public Material DMaterial; 10 | public bool ShowAll = true; 11 | [Range(0.0f, 1.0f)] 12 | public float ShowIndex = 0.0f; 13 | private Mesh[] meshes; 14 | void Start() 15 | { 16 | meshes = new Mesh[DCluster.ClusterCount]; 17 | var ibo = new int[DCluster.QuadsPerCluster * 4]; 18 | for (int i = 0; i < DCluster.QuadsPerCluster * 4; i++) 19 | { 20 | ibo[i] = i; 21 | } 22 | for (int i = 0; i < DCluster.ClusterCount; i++) 23 | { 24 | meshes[i] = new Mesh(); 25 | meshes[i].name = DCluster.name; 26 | var vbo = new Vector3[DCluster.QuadsPerCluster * 4]; 27 | for (int j = 0; j < DCluster.QuadsPerCluster * 4; j++) 28 | { 29 | vbo[j] = DCluster.Vertices[i * DCluster.QuadsPerCluster * 4 + j]; 30 | } 31 | meshes[i].vertices = vbo; 32 | meshes[i].SetIndices(ibo, MeshTopology.Quads, 0); 33 | meshes[i].RecalculateNormals(); 34 | meshes[i].RecalculateTangents(); 35 | meshes[i].RecalculateBounds(); 36 | meshes[i].UploadMeshData(false); 37 | } 38 | } 39 | void LateUpdate() 40 | { 41 | if (ShowAll) 42 | { 43 | for (int i = 0; i < DCluster.ClusterCount; i++) 44 | { 45 | Graphics.DrawMesh(meshes[i], transform.localToWorldMatrix, DMaterial, 0); 46 | } 47 | } 48 | else 49 | { 50 | int i = (int)(ShowIndex * (DCluster.ClusterCount - 1)); 51 | Graphics.DrawMesh(meshes[i], transform.localToWorldMatrix, DMaterial, 0); 52 | } 53 | } 54 | private void OnDrawGizmos() 55 | { 56 | if (Application.isPlaying) 57 | { 58 | Gizmos.matrix = transform.localToWorldMatrix; 59 | if (ShowAll) 60 | { 61 | for (int i = 0; i < DCluster.ClusterCount; i++) 62 | { 63 | GizemoDrawCone(DCluster.ClusterBounds[i].BoundingSphere.center, DCluster.ClusterBounds[i].BoundingCone, Color.yellow); 64 | Gizmos.color = Color.green; 65 | Gizmos.DrawWireSphere(DCluster.ClusterBounds[i].BoundingSphere.center, DCluster.ClusterBounds[i].BoundingSphere.radius); 66 | } 67 | } 68 | else 69 | { 70 | int i = (int)(ShowIndex * (DCluster.ClusterCount - 1)); 71 | GizemoDrawCone(DCluster.ClusterBounds[i].BoundingSphere.center, DCluster.ClusterBounds[i].BoundingCone, Color.yellow); 72 | Gizmos.color = Color.green; 73 | Gizmos.DrawWireSphere(DCluster.ClusterBounds[i].BoundingSphere.center, DCluster.ClusterBounds[i].BoundingSphere.radius); 74 | } 75 | } 76 | } 77 | 78 | private void GizemoDrawCone(Vector3 position, BoundingCone cone, Color color) 79 | { 80 | Gizmos.color = Color.blue; 81 | Gizmos.DrawRay(position, cone.normal); 82 | Gizmos.color = color; 83 | for (int i = 0; i < 100; i++) 84 | { 85 | var newDir = Random.onUnitSphere; 86 | Vector3 y = Vector3.Cross(newDir, cone.normal).normalized; 87 | Quaternion rotation = Quaternion.AngleAxis(Mathf.Rad2Deg * Mathf.Acos(cone.cosAngle), y); 88 | var far = rotation * cone.normal; 89 | Gizmos.DrawRay(position, far); 90 | } 91 | } 92 | } 93 | } -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Debug/ConeDebugger.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 58216ff5553907441a50db8541fea2d4 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d03289b4aebd4564bb61fd8b79aaa0b3 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Editor/ClustersDataGenerator.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 47241b904ecfb424585862228e5fe13f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Res.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 230b8360276167a4188438a35f87f54b 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Res/CapsuleClusters.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4caa143d9b4144f4284fd0a6cb38e7be 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Res/CapsuleMesh.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 16ea569780057ae4aa37128576c3fe53 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 4300000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Res/CubeClusters.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: db26f3044f58d3f49a7855c111aa3615, type: 3} 13 | m_Name: CubeClusters 14 | m_EditorClassIdentifier: 15 | RawMesh: {fileID: 4300000, guid: 8227e7da4a38245479f51c85241afafd, type: 2} 16 | Name: CubeMesh_Clusters 17 | QuadsPerCluster: 16 18 | ClusterCount: 1 19 | Vertices: 20 | - {x: 0.5, y: -0.5, z: 0.5} 21 | - {x: 0.5, y: 0.5, z: 0.5} 22 | - {x: -0.5, y: 0.5, z: 0.5} 23 | - {x: -0.5, y: -0.5, z: 0.5} 24 | - {x: 0.5, y: 0.5, z: 0.5} 25 | - {x: 0.5, y: 0.5, z: -0.5} 26 | - {x: -0.5, y: 0.5, z: -0.5} 27 | - {x: -0.5, y: 0.5, z: 0.5} 28 | - {x: 0.5, y: 0.5, z: -0.5} 29 | - {x: 0.5, y: -0.5, z: -0.5} 30 | - {x: -0.5, y: -0.5, z: -0.5} 31 | - {x: -0.5, y: 0.5, z: -0.5} 32 | - {x: 0.5, y: -0.5, z: -0.5} 33 | - {x: 0.5, y: -0.5, z: 0.5} 34 | - {x: -0.5, y: -0.5, z: 0.5} 35 | - {x: -0.5, y: -0.5, z: -0.5} 36 | - {x: -0.5, y: -0.5, z: 0.5} 37 | - {x: -0.5, y: 0.5, z: 0.5} 38 | - {x: -0.5, y: 0.5, z: -0.5} 39 | - {x: -0.5, y: -0.5, z: -0.5} 40 | - {x: 0.5, y: -0.5, z: -0.5} 41 | - {x: 0.5, y: 0.5, z: -0.5} 42 | - {x: 0.5, y: 0.5, z: 0.5} 43 | - {x: 0.5, y: -0.5, z: 0.5} 44 | - {x: 0.5, y: -0.5, z: 0.5} 45 | - {x: 0.5, y: -0.5, z: 0.5} 46 | - {x: 0.5, y: -0.5, z: 0.5} 47 | - {x: 0.5, y: -0.5, z: 0.5} 48 | - {x: 0.5, y: -0.5, z: 0.5} 49 | - {x: 0.5, y: -0.5, z: 0.5} 50 | - {x: 0.5, y: -0.5, z: 0.5} 51 | - {x: 0.5, y: -0.5, z: 0.5} 52 | - {x: 0.5, y: -0.5, z: 0.5} 53 | - {x: 0.5, y: -0.5, z: 0.5} 54 | - {x: 0.5, y: -0.5, z: 0.5} 55 | - {x: 0.5, y: -0.5, z: 0.5} 56 | - {x: 0.5, y: -0.5, z: 0.5} 57 | - {x: 0.5, y: -0.5, z: 0.5} 58 | - {x: 0.5, y: -0.5, z: 0.5} 59 | - {x: 0.5, y: -0.5, z: 0.5} 60 | - {x: 0.5, y: -0.5, z: 0.5} 61 | - {x: 0.5, y: -0.5, z: 0.5} 62 | - {x: 0.5, y: -0.5, z: 0.5} 63 | - {x: 0.5, y: -0.5, z: 0.5} 64 | - {x: 0.5, y: -0.5, z: 0.5} 65 | - {x: 0.5, y: -0.5, z: 0.5} 66 | - {x: 0.5, y: -0.5, z: 0.5} 67 | - {x: 0.5, y: -0.5, z: 0.5} 68 | - {x: 0.5, y: -0.5, z: 0.5} 69 | - {x: 0.5, y: -0.5, z: 0.5} 70 | - {x: 0.5, y: -0.5, z: 0.5} 71 | - {x: 0.5, y: -0.5, z: 0.5} 72 | - {x: 0.5, y: -0.5, z: 0.5} 73 | - {x: 0.5, y: -0.5, z: 0.5} 74 | - {x: 0.5, y: -0.5, z: 0.5} 75 | - {x: 0.5, y: -0.5, z: 0.5} 76 | - {x: 0.5, y: -0.5, z: 0.5} 77 | - {x: 0.5, y: -0.5, z: 0.5} 78 | - {x: 0.5, y: -0.5, z: 0.5} 79 | - {x: 0.5, y: -0.5, z: 0.5} 80 | - {x: 0.5, y: -0.5, z: 0.5} 81 | - {x: 0.5, y: -0.5, z: 0.5} 82 | - {x: 0.5, y: -0.5, z: 0.5} 83 | - {x: 0.5, y: -0.5, z: 0.5} 84 | ClusterBounds: 85 | - BoundingSphere: 86 | center: {x: 0, y: 0, z: 0} 87 | radius: 0.8660254 88 | BoundingCone: 89 | normal: {x: 1, y: 1, z: 1} 90 | cosAngle: 0 91 | sinAngle: 1 92 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Res/CubeClusters.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: db54fc4b2db1e2e49849ca36f0b6e957 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Res/CubeMesh.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8227e7da4a38245479f51c85241afafd 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 4300000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Res/CylinderClusters.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 062fd1b6a5eb18949817a57243a271aa 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Res/CylinderMesh.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 90d9f9b8d30458346b63901c01f34112 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 4300000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Res/SphereClusters.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 22b5f817671c62d45b5140d081ae3206 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Res/SphereMesh.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9675652ad86344c4486e81e9b8002ce7 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 4300000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/6.BackFaceCulling/Scene6.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 619da701e60b93f40b25a198bc64eb21 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a9a1038d126a9f643b6b85031026fed2 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/AdvancedPreZWriteUAV.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b99169de56750ee4c855e6a6bdc35b36 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Debug.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6082187e50ca67d4db137698d6d54c18 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Debug/MaterialDebug7.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: MaterialDebug7 11 | m_Shader: {fileID: 4800000, guid: 3ef76d98cf286bb4a91d10d0c2b73fd3, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Debug/MaterialDebug7.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3e893e5e5214b05468ddb082e5a599b1 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Debug/PreZDebugger.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace OcclusionCulling 4 | { 5 | public class PreZDebugger : MonoBehaviour 6 | { 7 | public Camera DCamera; 8 | public Material DMaterial; 9 | 10 | private int initHash; 11 | private Bounds proxyBounds; 12 | private ComputeBuffer debugBuffer; 13 | void Start() 14 | { 15 | proxyBounds = new Bounds(Vector3.zero, 1000.0f * Vector3.one); 16 | debugBuffer = new ComputeBuffer(1, sizeof(uint)); 17 | debugBuffer.name = nameof(debugBuffer); 18 | Graphics.SetRandomWriteTarget(1, debugBuffer); 19 | initHash = Random.Range(0x12341234, 0x67896789); 20 | debugBuffer.SetData(new uint[1] { (uint)initHash }); 21 | } 22 | void LateUpdate() 23 | { 24 | uint[] debugData = new uint[1]; 25 | debugBuffer.GetData(debugData); 26 | if (debugData[0] == initHash) 27 | { 28 | Debug.Log("EarlyZ is vaild"); 29 | } 30 | else 31 | { 32 | Debug.LogError("EarlyZ is invaild"); 33 | } 34 | int randomHash = Random.Range(0x12341234, 0x67896789); 35 | if (randomHash == initHash) 36 | { 37 | randomHash = initHash + 0x00120012; 38 | } 39 | DMaterial.SetInt("_Hash", randomHash); 40 | Graphics.DrawProcedural(DMaterial, proxyBounds, MeshTopology.Triangles, 3, 1, DCamera); 41 | } 42 | private void OnDestroy() 43 | { 44 | debugBuffer?.Release(); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Debug/PreZDebugger.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5546df1c9b837da4484040ffc35ec0da 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DCamera: {instanceID: 0} 8 | - DMaterial: {fileID: 2100000, guid: 3e893e5e5214b05468ddb082e5a599b1, type: 2} 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Debug/ShaderDebug7.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/ShaderDebug7" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | ZWrite Off 8 | ZTest Never 9 | ColorMask 0 10 | Cull Off 11 | CGPROGRAM 12 | #pragma target 5.0 13 | #pragma vertex vert 14 | #pragma fragment frag 15 | 16 | #include "UnityCG.cginc" 17 | 18 | struct appdata 19 | { 20 | uint vertexID : SV_VertexID; 21 | }; 22 | 23 | struct v2f 24 | { 25 | float4 vertex : SV_POSITION; 26 | }; 27 | 28 | RWStructuredBuffer _DebugBuffer : register(u1); 29 | uint _Hash; 30 | 31 | v2f vert(appdata v) 32 | { 33 | static float4 fullScreenTriangle[3] = 34 | { 35 | float4(-1, +3, +1, +1), 36 | float4(-1, -1, +1, +1), 37 | float4(+3, -1, +1, +1), 38 | }; 39 | v2f o; 40 | o.vertex = fullScreenTriangle[min(v.vertexID, 2u)]; 41 | return o; 42 | } 43 | 44 | [earlydepthstencil] 45 | void frag(v2f i) 46 | { 47 | _DebugBuffer[0] = _Hash; 48 | } 49 | ENDCG 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Debug/ShaderDebug7.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3ef76d98cf286bb4a91d10d0c2b73fd3 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Material7.1.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material7.1 11 | m_Shader: {fileID: 4800000, guid: 4028c6341ec3f54408f25e6c36a43eae, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: 2999 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Material7.1.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e942b3067ce17604e9dd840eccc402d7 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Material7.1.preZ.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material7.1.preZ 11 | m_Shader: {fileID: 4800000, guid: 4209f38da05cca14983ab967ab1efb12, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Material7.1.preZ.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4baf1299176f5ca4b93ff051bd72fe96 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Material7.2.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material7.2 11 | m_Shader: {fileID: 4800000, guid: 4028c6341ec3f54408f25e6c36a43eae, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: 2999 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Material7.2.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3fd7e63a3e3f08c43aed578d230f1cbf 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Material7.2.preZ.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material7.2.preZ 11 | m_Shader: {fileID: 4800000, guid: eaa59c0bc2726fc469458b4d16f60354, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Material7.2.preZ.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cda8430b17f05bc43bd98733230e833f 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Material7.3.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material7.3 11 | m_Shader: {fileID: 4800000, guid: 4028c6341ec3f54408f25e6c36a43eae, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: 2001 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Material7.3.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 03e1ee26538d1cd4496bc8dd25cfe7f2 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Material7.3.preZ.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material7.3.preZ 11 | m_Shader: {fileID: 4800000, guid: eaa59c0bc2726fc469458b4d16f60354, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: [] 26 | m_BuildTextureStacks: [] 27 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Material7.3.preZ.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a467c457f1f89854e9f99484ca5ceac6 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/PreZWriteUAV.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e8cc296afa878594598d11864b97b3c5 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DMesh: {instanceID: 0} 8 | - DCamera: {instanceID: 0} 9 | - DMaterial: {fileID: 2100000, guid: e942b3067ce17604e9dd840eccc402d7, type: 2} 10 | - DMaterialPreZ: {fileID: 2100000, guid: 4baf1299176f5ca4b93ff051bd72fe96, type: 2} 11 | executionOrder: 0 12 | icon: {instanceID: 0} 13 | userData: 14 | assetBundleName: 15 | assetBundleVariant: 16 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Scene7.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e0e872875397c254ebaaf45c26b6cb57 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Shader7.1.preZ.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader7.1.preZ" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | ZWrite Off 8 | ColorMask 0 9 | CGPROGRAM 10 | #pragma target 5.0 11 | #pragma vertex vert 12 | #pragma fragment frag 13 | 14 | #include "UnityCG.cginc" 15 | 16 | struct appdata 17 | { 18 | uint instanceID : SV_InstanceID; 19 | uint vertexID : SV_VertexID; 20 | }; 21 | 22 | struct v2f 23 | { 24 | float4 vertex : SV_POSITION; 25 | uint instanceID : SV_InstanceID; 26 | }; 27 | 28 | struct InstancePara 29 | { 30 | float4x4 model; 31 | float4 color; 32 | }; 33 | 34 | RWStructuredBuffer _VisibilityFrameIndexBuffer : register(u1); 35 | StructuredBuffer _InstanceBuffer; 36 | float3 _BoundsExtent; 37 | float3 _BoundsCenter; 38 | uint _CurrentFrameIndex; 39 | 40 | v2f vert(appdata v) 41 | { 42 | static float3 cubeCorner[8] = 43 | { 44 | float3(+1, +1, -1), 45 | float3(-1, +1, -1), 46 | float3(-1, -1, -1), 47 | float3(+1, -1, -1), 48 | float3(+1, +1, +1), 49 | float3(-1, +1, +1), 50 | float3(-1, -1, +1), 51 | float3(+1, -1, +1), 52 | }; 53 | InstancePara para = _InstanceBuffer[v.instanceID]; 54 | unity_ObjectToWorld = para.model; 55 | v2f o; 56 | 57 | float3 vertex = cubeCorner[v.vertexID] * _BoundsExtent + _BoundsCenter; 58 | o.vertex = UnityObjectToClipPos(vertex); 59 | o.instanceID = v.instanceID; 60 | return o; 61 | } 62 | 63 | [earlydepthstencil] 64 | void frag(v2f i) 65 | { 66 | _VisibilityFrameIndexBuffer[i.instanceID] = _CurrentFrameIndex; 67 | } 68 | ENDCG 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Shader7.1.preZ.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4209f38da05cca14983ab967ab1efb12 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Shader7.2.preZ.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader7.2.preZ" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | ZWrite Off 8 | ColorMask 0 9 | CGPROGRAM 10 | #pragma target 5.0 11 | #pragma vertex vert 12 | #pragma fragment frag 13 | 14 | #include "UnityCG.cginc" 15 | 16 | struct appdata 17 | { 18 | uint instanceID : SV_InstanceID; 19 | uint vertexID : SV_VertexID; 20 | }; 21 | 22 | struct v2f 23 | { 24 | float4 vertex : SV_POSITION; 25 | uint instanceID : SV_InstanceID; 26 | }; 27 | 28 | struct InstancePara 29 | { 30 | float4x4 model; 31 | float4 color; 32 | }; 33 | 34 | RWStructuredBuffer _VisibilityFrameIndexBuffer : register(u1); 35 | RWStructuredBuffer _VisibilityBuffer: register(u2); 36 | RWStructuredBuffer _ArgsBuffer: register(u3); 37 | StructuredBuffer _InstanceBuffer; 38 | float3 _BoundsExtent; 39 | float3 _BoundsCenter; 40 | uint _CurrentFrameIndex; 41 | 42 | v2f vert(appdata v) 43 | { 44 | static float3 cubeCorner[8] = 45 | { 46 | float3(+1, +1, -1), 47 | float3(-1, +1, -1), 48 | float3(-1, -1, -1), 49 | float3(+1, -1, -1), 50 | float3(+1, +1, +1), 51 | float3(-1, +1, +1), 52 | float3(-1, -1, +1), 53 | float3(+1, -1, +1), 54 | }; 55 | InstancePara para = _InstanceBuffer[v.instanceID]; 56 | unity_ObjectToWorld = para.model; 57 | v2f o; 58 | 59 | float3 vertex = cubeCorner[v.vertexID] * _BoundsExtent + _BoundsCenter; 60 | o.vertex = UnityObjectToClipPos(vertex); 61 | o.instanceID = v.instanceID; 62 | return o; 63 | } 64 | 65 | [earlydepthstencil] 66 | void frag(v2f i) 67 | { 68 | uint frameIndex; 69 | InterlockedMax(_VisibilityFrameIndexBuffer[i.instanceID], _CurrentFrameIndex, frameIndex); 70 | if (frameIndex < _CurrentFrameIndex) 71 | { 72 | uint currentIndex; 73 | InterlockedAdd(_ArgsBuffer[1], 1, currentIndex); 74 | _VisibilityBuffer[currentIndex] = i.instanceID; 75 | } 76 | } 77 | ENDCG 78 | } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /Assets/7.OcclusionCulling/Shader7.2.preZ.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eaa59c0bc2726fc469458b4d16f60354 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2f7dc36dfc1a6a840a7d13db587ea665 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Debug.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4ba92832a1bc3d34dbfeec96c3165a3b 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Debug/CullingDebugger.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace HZBOcclusionCulling 4 | { 5 | public class CullingDebugger : MonoBehaviour 6 | { 7 | public HZBOcclusionCulling DHZBOcclusionCulling; 8 | public Material DMaterial; 9 | 10 | private int count = 0; 11 | private Bounds proxyBounds; 12 | private ComputeBuffer argsBuffer; 13 | private ComputeBuffer instanceBuffer; 14 | void Start() 15 | { 16 | proxyBounds = new Bounds(Vector3.zero, 1000.0f * Vector3.one); 17 | argsBuffer = new ComputeBuffer(1, 5 * sizeof(uint), ComputeBufferType.IndirectArguments); 18 | argsBuffer.name = "ArgsBuffer"; 19 | UpdateInstance(); 20 | } 21 | private void UpdateInstance() 22 | { 23 | if (count == DHZBOcclusionCulling.Count) return; 24 | count = DHZBOcclusionCulling.Count; 25 | var instanceParas = new InstancePara[count]; 26 | var row = Mathf.FloorToInt(Mathf.Pow(count - 1, 1.0f / 3.0f)) + 1; 27 | var parentPosition = DHZBOcclusionCulling.transform.position; 28 | Random.InitState(0); 29 | for (int i = 0, n = 0; i < row; i++) 30 | { 31 | for (int j = 0; j < row; j++) 32 | { 33 | for (int k = 0; k < row && n < count; k++, n++) 34 | { 35 | instanceParas[n].model = Matrix4x4.TRS(parentPosition + 2.0f * new Vector3(i, j, k), Random.rotationUniform, Vector3.one * Random.Range(0.5f, 1.0f)); 36 | instanceParas[n].color = new Vector4(Random.Range(0.7f, 1.0f), Random.Range(0.1f, 0.6f), Random.value, 1); 37 | } 38 | } 39 | } 40 | instanceBuffer?.Release(); 41 | instanceBuffer = new ComputeBuffer(count, InstancePara.SIZE); 42 | instanceBuffer.name = nameof(instanceBuffer) + ":" + instanceBuffer.count; 43 | instanceBuffer.SetData(instanceParas); 44 | argsBuffer.SetData(new uint[5] { DHZBOcclusionCulling.DMesh.GetIndexCount(0), (uint)count, 0, 0, 0 }); 45 | DMaterial.SetBuffer("_InstanceBuffer", instanceBuffer); 46 | } 47 | void LateUpdate() 48 | { 49 | UpdateInstance(); 50 | Graphics.DrawMeshInstancedIndirect(DHZBOcclusionCulling.DMesh, 0, DMaterial, proxyBounds, argsBuffer); 51 | } 52 | private void OnDestroy() 53 | { 54 | instanceBuffer?.Release(); 55 | argsBuffer?.Release(); 56 | } 57 | struct InstancePara 58 | { 59 | public Matrix4x4 model; 60 | public Vector4 color; 61 | public const int SIZE = 16 * sizeof(float) + 4 * sizeof(float); 62 | } 63 | } 64 | } -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Debug/CullingDebugger.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 105b700d3f3fbd948ac4a290c4e9d909 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DHZBOcclusionCulling: {instanceID: 0} 8 | - DMaterial: {fileID: 2100000, guid: 68abbdc873a6a2849ae73359682ef54a, type: 2} 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Debug/MaterialDebug8.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: MaterialDebug8 11 | m_Shader: {fileID: 4800000, guid: 472ca2aba60780543bc9294b4f71c521, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: -1 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: [] 23 | m_Ints: [] 24 | m_Floats: [] 25 | m_Colors: 26 | - _Color: {r: 0, g: 0, b: 0, a: 1} 27 | m_BuildTextureStacks: [] 28 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Debug/MaterialDebug8.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 68abbdc873a6a2849ae73359682ef54a 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Debug/ShaderDebug8.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/ShaderDebug8" 2 | { 3 | Properties 4 | { 5 | _Color("Color", Color) = (0,0,0,1) 6 | } 7 | SubShader 8 | { 9 | Tags { "Queue" = "Transparent" } 10 | Pass 11 | { 12 | ZTest Less 13 | ZWrite Off 14 | CGPROGRAM 15 | #pragma vertex vert 16 | #pragma fragment frag 17 | 18 | #include "UnityCG.cginc" 19 | 20 | struct appdata 21 | { 22 | float4 vertex : POSITION; 23 | uint instanceID : SV_InstanceID; 24 | }; 25 | 26 | struct v2f 27 | { 28 | float4 vertex : SV_POSITION; 29 | }; 30 | 31 | struct InstancePara 32 | { 33 | float4x4 model; 34 | float4 color; 35 | }; 36 | 37 | StructuredBuffer _InstanceBuffer; 38 | fixed4 _Color; 39 | 40 | v2f vert(appdata v) 41 | { 42 | InstancePara para = _InstanceBuffer[v.instanceID]; 43 | unity_ObjectToWorld = para.model; 44 | 45 | v2f o; 46 | o.vertex = UnityObjectToClipPos(v.vertex); 47 | return o; 48 | } 49 | 50 | fixed4 frag(v2f i) : SV_Target 51 | { 52 | fixed4 col = _Color; 53 | return col; 54 | } 55 | ENDCG 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Debug/ShaderDebug8.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 472ca2aba60780543bc9294b4f71c521 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/HZBOcclusionCulling.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: be9cb7e8a22b6a2479192a4a0d90ba7f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DMesh: {instanceID: 0} 8 | - DCamera: {instanceID: 0} 9 | - DHiZGenerator: {instanceID: 0} 10 | - DMaterial: {fileID: 2100000, guid: 06183fdaa3a163b45bebfd831bc68ceb, type: 2} 11 | - DMaterialHZBOcclusion: {fileID: 2100000, guid: 97e1243cc4c5a2943848a01d4db2ebf8, type: 2} 12 | executionOrder: 0 13 | icon: {instanceID: 0} 14 | userData: 15 | assetBundleName: 16 | assetBundleVariant: 17 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/HiZGenerator.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | using UnityEngine.Experimental.Rendering; 4 | 5 | [RequireComponent(typeof(Camera))] 6 | public class HiZGenerator : MonoBehaviour 7 | { 8 | public Material DMaterialHiZ; 9 | [NonSerialized] 10 | public Action HiZBufferUpdated; 11 | private RenderTexture hiZBuffer; 12 | private bool hiZBufferReady = false; 13 | private Camera cameraComponent; 14 | private RenderTexture renderTexture; 15 | private int maxMips; 16 | private Vector2Int hzbSize = new Vector2Int(-1, -1); 17 | private Vector2Int screenSize = new Vector2Int(-1, -1); 18 | private RenderTexture[] hiZBufferIntermediates; 19 | private Material[] hiZMaterialIntermediates; 20 | void Start() 21 | { 22 | cameraComponent = GetComponent(); 23 | } 24 | void OnPreRender() 25 | { 26 | var currentSize = new Vector2Int(Screen.width, Screen.height); 27 | if (screenSize != currentSize) 28 | { 29 | cameraComponent.targetTexture?.Release(); 30 | cameraComponent.targetTexture = null; 31 | renderTexture?.Release(); 32 | screenSize = currentSize; 33 | renderTexture = new RenderTexture(Screen.width, Screen.height, 32, RenderTextureFormat.Default) 34 | { 35 | name = "Scene RenderTexture", 36 | }; 37 | 38 | var currentHZBSize = new Vector2Int(Mathf.NextPowerOfTwo(currentSize.x) / 2, Mathf.NextPowerOfTwo(currentSize.y) / 2); 39 | if (hzbSize != currentHZBSize) 40 | { 41 | hzbSize = currentHZBSize; 42 | var max = Mathf.Max(hzbSize.x, hzbSize.y); 43 | maxMips = 0; 44 | while (max > 2) 45 | { 46 | max /= 2; 47 | maxMips++; 48 | } 49 | hiZBuffer?.Release(); 50 | HiZBufferUpdated?.Invoke(null); 51 | hiZBuffer = new RenderTexture(hzbSize.x, hzbSize.y, 0, GraphicsFormat.R32_UInt, maxMips + 1) 52 | { 53 | name = "HiZBuffer", 54 | useMipMap = true, 55 | autoGenerateMips = false, 56 | filterMode = FilterMode.Point, 57 | }; 58 | hiZBufferReady = false; 59 | if (hiZBufferIntermediates != null) 60 | { 61 | for (int i = 0; i < hiZBufferIntermediates.Length; i++) 62 | { 63 | RenderTexture.ReleaseTemporary(hiZBufferIntermediates[i]); 64 | } 65 | } 66 | hiZBufferIntermediates = new RenderTexture[maxMips]; 67 | hiZMaterialIntermediates = new Material[maxMips]; 68 | for (int i = 0, w = hzbSize.x, h = hzbSize.y; i < maxMips; i++) 69 | { 70 | w = Mathf.Max(w / 2, 1); 71 | h = Mathf.Max(h / 2, 1); 72 | hiZBufferIntermediates[i] = RenderTexture.GetTemporary(w, h, 0, GraphicsFormat.R32_UInt); 73 | hiZBufferIntermediates[i].name = "HiZBufferIntermediate(mip" + (i + 1) + ")"; 74 | hiZBufferIntermediates[i].filterMode = FilterMode.Point; 75 | hiZMaterialIntermediates[i] = new Material(DMaterialHiZ); 76 | hiZMaterialIntermediates[i].SetTexture("_DepthTex", i == 0 ? hiZBuffer : hiZBufferIntermediates[i - 1]); 77 | } 78 | } 79 | } 80 | cameraComponent.targetTexture = renderTexture; 81 | DMaterialHiZ.SetTexture("_DepthTex", renderTexture, UnityEngine.Rendering.RenderTextureSubElement.Depth); 82 | } 83 | void OnPostRender() 84 | { 85 | Graphics.Blit(null, hiZBuffer, DMaterialHiZ); 86 | for (int i = 0; i < maxMips; i++) 87 | { 88 | RenderTexture dst = hiZBufferIntermediates[i]; 89 | Graphics.Blit(null, dst, hiZMaterialIntermediates[i]); 90 | Graphics.CopyTexture(dst, 0, 0, hiZBuffer, 0, i + 1); 91 | } 92 | if(!hiZBufferReady) 93 | { 94 | hiZBufferReady = true; 95 | HiZBufferUpdated?.Invoke(hiZBuffer); 96 | } 97 | Graphics.Blit(renderTexture, (RenderTexture)null); 98 | cameraComponent.targetTexture = null; 99 | } 100 | private void OnDestroy() 101 | { 102 | if (hiZBufferIntermediates != null) 103 | { 104 | for (int i = 0; i < hiZBufferIntermediates.Length; i++) 105 | { 106 | RenderTexture.ReleaseTemporary(hiZBufferIntermediates[i]); 107 | } 108 | } 109 | renderTexture?.Release(); 110 | hiZBuffer?.Release(); 111 | HiZBufferUpdated?.Invoke(null); 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/HiZGenerator.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 44a72bac7f2a8534ebef67ac79152d7d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: 7 | - DMaterialHiZ: {fileID: 2100000, guid: 1144baaa50497c24ab9b995bd0ab12d8, type: 2} 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Material8.1.hiZ.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material8.1.hiZ 11 | m_Shader: {fileID: 4800000, guid: 9f503b21e47673b4d882810894c17e5d, type: 3} 12 | m_Parent: {fileID: 0} 13 | m_ModifiedSerializedProperties: 0 14 | m_ValidKeywords: [] 15 | m_InvalidKeywords: [] 16 | m_LightmapFlags: 4 17 | m_EnableInstancingVariants: 0 18 | m_DoubleSidedGI: 0 19 | m_CustomRenderQueue: -1 20 | stringTagMap: {} 21 | disabledShaderPasses: [] 22 | m_LockedProperties: 23 | m_SavedProperties: 24 | serializedVersion: 3 25 | m_TexEnvs: [] 26 | m_Ints: [] 27 | m_Floats: [] 28 | m_Colors: [] 29 | m_BuildTextureStacks: [] 30 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Material8.1.hiZ.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1144baaa50497c24ab9b995bd0ab12d8 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Material8.1.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material8.1 11 | m_Shader: {fileID: 4800000, guid: 4028c6341ec3f54408f25e6c36a43eae, type: 3} 12 | m_ValidKeywords: [] 13 | m_InvalidKeywords: [] 14 | m_LightmapFlags: 4 15 | m_EnableInstancingVariants: 0 16 | m_DoubleSidedGI: 0 17 | m_CustomRenderQueue: 2001 18 | stringTagMap: {} 19 | disabledShaderPasses: [] 20 | m_SavedProperties: 21 | serializedVersion: 3 22 | m_TexEnvs: 23 | - _BumpMap: 24 | m_Texture: {fileID: 0} 25 | m_Scale: {x: 1, y: 1} 26 | m_Offset: {x: 0, y: 0} 27 | - _DetailAlbedoMap: 28 | m_Texture: {fileID: 0} 29 | m_Scale: {x: 1, y: 1} 30 | m_Offset: {x: 0, y: 0} 31 | - _DetailMask: 32 | m_Texture: {fileID: 0} 33 | m_Scale: {x: 1, y: 1} 34 | m_Offset: {x: 0, y: 0} 35 | - _DetailNormalMap: 36 | m_Texture: {fileID: 0} 37 | m_Scale: {x: 1, y: 1} 38 | m_Offset: {x: 0, y: 0} 39 | - _EmissionMap: 40 | m_Texture: {fileID: 0} 41 | m_Scale: {x: 1, y: 1} 42 | m_Offset: {x: 0, y: 0} 43 | - _MainTex: 44 | m_Texture: {fileID: 0} 45 | m_Scale: {x: 1, y: 1} 46 | m_Offset: {x: 0, y: 0} 47 | - _MetallicGlossMap: 48 | m_Texture: {fileID: 0} 49 | m_Scale: {x: 1, y: 1} 50 | m_Offset: {x: 0, y: 0} 51 | - _OcclusionMap: 52 | m_Texture: {fileID: 0} 53 | m_Scale: {x: 1, y: 1} 54 | m_Offset: {x: 0, y: 0} 55 | - _ParallaxMap: 56 | m_Texture: {fileID: 0} 57 | m_Scale: {x: 1, y: 1} 58 | m_Offset: {x: 0, y: 0} 59 | m_Ints: [] 60 | m_Floats: 61 | - _BumpScale: 1 62 | - _Cutoff: 0.5 63 | - _DetailNormalMapScale: 1 64 | - _DstBlend: 0 65 | - _GlossMapScale: 1 66 | - _Glossiness: 0.5 67 | - _GlossyReflections: 1 68 | - _Metallic: 0 69 | - _Mode: 0 70 | - _OcclusionStrength: 1 71 | - _Parallax: 0.02 72 | - _SmoothnessTextureChannel: 0 73 | - _SpecularHighlights: 1 74 | - _SrcBlend: 1 75 | - _UVSec: 0 76 | - _ZWrite: 1 77 | m_Colors: 78 | - _Color: {r: 1, g: 1, b: 1, a: 1} 79 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} 80 | m_BuildTextureStacks: [] 81 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Material8.1.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 06183fdaa3a163b45bebfd831bc68ceb 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Material8.1.oC.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Material8.1.oC 11 | m_Shader: {fileID: 4800000, guid: 813354cfce247d04c8ca5e61336cb8f3, type: 3} 12 | m_Parent: {fileID: 0} 13 | m_ModifiedSerializedProperties: 0 14 | m_ValidKeywords: [] 15 | m_InvalidKeywords: [] 16 | m_LightmapFlags: 4 17 | m_EnableInstancingVariants: 0 18 | m_DoubleSidedGI: 0 19 | m_CustomRenderQueue: -1 20 | stringTagMap: {} 21 | disabledShaderPasses: [] 22 | m_LockedProperties: 23 | m_SavedProperties: 24 | serializedVersion: 3 25 | m_TexEnvs: [] 26 | m_Ints: [] 27 | m_Floats: 28 | - _Float: 0.8 29 | m_Colors: [] 30 | m_BuildTextureStacks: [] 31 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Material8.1.oC.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 97e1243cc4c5a2943848a01d4db2ebf8 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Scene8.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0e1a716587f22d0439f5901d879ca980 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Shader8.1.hiZ.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader8.1.hiZ" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | CGPROGRAM 8 | #pragma target 4.5 9 | #pragma vertex vert 10 | #pragma fragment frag 11 | 12 | #include "UnityCG.cginc" 13 | 14 | struct appdata 15 | { 16 | float4 vertex : POSITION; 17 | float2 uv : TEXCOORD0; 18 | }; 19 | 20 | struct v2f 21 | { 22 | float4 vertex : SV_POSITION; 23 | float2 uv : TEXCOORD0; 24 | }; 25 | 26 | Texture2D _DepthTex; 27 | SamplerState sampler_DepthTex; 28 | 29 | v2f vert(appdata v) 30 | { 31 | v2f o; 32 | o.vertex = UnityObjectToClipPos(v.vertex); 33 | o.uv = v.uv; 34 | return o; 35 | } 36 | 37 | float frag(v2f i) : SV_Target 38 | { 39 | float4 depthSample4 = _DepthTex.Gather(sampler_DepthTex, i.uv); 40 | float2 depthSample2 = min(depthSample4.xy, depthSample4.zw); 41 | float depthSample = min(depthSample2.x, depthSample2.y); 42 | return depthSample; 43 | } 44 | ENDCG 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Shader8.1.hiZ.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9f503b21e47673b4d882810894c17e5d 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Shader8.1.oC.shader: -------------------------------------------------------------------------------- 1 | Shader "LearnGPUDriven/Shader8.1.oC" 2 | { 3 | SubShader 4 | { 5 | Pass 6 | { 7 | ZWrite Off 8 | ZTest Never 9 | ColorMask 0 10 | CGPROGRAM 11 | #pragma target 4.5 12 | #pragma vertex vert 13 | #pragma fragment frag 14 | #define FRUSTUM_CULLING_EDGE 1.1 15 | #define OCCLUSION_CULLING_SCALE 1.1 16 | #pragma multi_compile _ ENABLE_OCCLUSION_CULLING 17 | 18 | #include "UnityCG.cginc" 19 | 20 | struct InstancePara 21 | { 22 | float4x4 model; 23 | float4 color; 24 | }; 25 | RWStructuredBuffer _VisibilityBuffer: register(u1); 26 | RWStructuredBuffer _ArgsBuffer: register(u2); 27 | StructuredBuffer _InstanceBuffer; 28 | float3 _BoundsExtent; 29 | float3 _BoundsCenter; 30 | #ifdef ENABLE_OCCLUSION_CULLING 31 | Texture2D _HiZBuffer; 32 | SamplerState sampler_HiZBuffer; 33 | float4 _HiZBuffer_TexelSize; 34 | #endif 35 | void vert(uint vertexID : SV_VertexID) 36 | { 37 | static float3 cubeCorner[8] = 38 | { 39 | float3(+1, +1, -1), 40 | float3(-1, +1, -1), 41 | float3(-1, -1, -1), 42 | float3(+1, -1, -1), 43 | float3(+1, +1, +1), 44 | float3(-1, +1, +1), 45 | float3(-1, -1, +1), 46 | float3(+1, -1, +1), 47 | }; 48 | InstancePara para = _InstanceBuffer[vertexID]; 49 | float4x4 localToClip = mul(UNITY_MATRIX_VP, para.model); 50 | float3 boundsMinClip = float3(10, 10, 10); 51 | float3 boundsMaxClip = float3(-10, -10, -10); 52 | [unroll(8)] 53 | for (int i = 0; i < 8; i++) 54 | { 55 | float3 cornerLocal = _BoundsCenter + _BoundsExtent * cubeCorner[i]; 56 | float4 cornerClip = mul(localToClip, float4(cornerLocal, 1)); 57 | if (cornerClip.w > 0.0001) 58 | { 59 | cornerClip.xyz = cornerClip.xyz / cornerClip.w; 60 | boundsMinClip = min(boundsMinClip, cornerClip.xyz); 61 | boundsMaxClip = max(boundsMaxClip, cornerClip.xyz); 62 | } 63 | } 64 | boundsMinClip = max(boundsMinClip, float3(-FRUSTUM_CULLING_EDGE, -FRUSTUM_CULLING_EDGE, 0)); 65 | boundsMaxClip = min(boundsMaxClip, float3(FRUSTUM_CULLING_EDGE, FRUSTUM_CULLING_EDGE, 1)); 66 | if (all(boundsMaxClip > boundsMinClip)) 67 | { 68 | #ifdef ENABLE_OCCLUSION_CULLING 69 | float4 boundsTexCoord = float4(0.5, -0.5, 0.5, -0.5) * float4(boundsMinClip.xy, boundsMaxClip.xy) + 0.5; 70 | float2 boundsSizeTexCoord = boundsTexCoord.zy - boundsTexCoord.xw; 71 | float2 boundsSizeScreen = boundsSizeTexCoord * _HiZBuffer_TexelSize.zw; 72 | int boundsLevel = ceil(log2(max(boundsSizeScreen.x, boundsSizeScreen.y))); 73 | 74 | float4 depthSample4; 75 | depthSample4.x = _HiZBuffer.SampleLevel(sampler_HiZBuffer, boundsTexCoord.xy, boundsLevel).r; 76 | depthSample4.y = _HiZBuffer.SampleLevel(sampler_HiZBuffer, boundsTexCoord.xw, boundsLevel).r; 77 | depthSample4.z = _HiZBuffer.SampleLevel(sampler_HiZBuffer, boundsTexCoord.zy, boundsLevel).r; 78 | depthSample4.w = _HiZBuffer.SampleLevel(sampler_HiZBuffer, boundsTexCoord.zw, boundsLevel).r; 79 | float2 depthSample2 = min(depthSample4.xy, depthSample4.zw); 80 | float depthSample = min(depthSample2.x, depthSample2.y); 81 | if (boundsMaxClip.z * OCCLUSION_CULLING_SCALE >= depthSample) 82 | #endif 83 | { 84 | uint currentIndex; 85 | InterlockedAdd(_ArgsBuffer[1], 1, currentIndex); 86 | _VisibilityBuffer[currentIndex] = vertexID; 87 | } 88 | } 89 | } 90 | 91 | void frag() { } 92 | ENDCG 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /Assets/8.HZBOcclusionCulling/Shader8.1.oC.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 813354cfce247d04c8ca5e61336cb8f3 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.ide.rider": "3.0.28", 4 | "com.unity.ide.visualstudio": "2.0.22", 5 | "com.unity.modules.imgui": "1.0.0", 6 | "com.unity.modules.jsonserialize": "1.0.0" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Packages/packages-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.ext.nunit": { 4 | "version": "2.0.5", 5 | "depth": 1, 6 | "source": "registry", 7 | "dependencies": {}, 8 | "url": "https://packages.unity.com" 9 | }, 10 | "com.unity.ide.rider": { 11 | "version": "3.0.28", 12 | "depth": 0, 13 | "source": "registry", 14 | "dependencies": { 15 | "com.unity.ext.nunit": "1.0.6" 16 | }, 17 | "url": "https://packages.unity.com" 18 | }, 19 | "com.unity.ide.visualstudio": { 20 | "version": "2.0.22", 21 | "depth": 0, 22 | "source": "registry", 23 | "dependencies": { 24 | "com.unity.test-framework": "1.1.9" 25 | }, 26 | "url": "https://packages.unity.com" 27 | }, 28 | "com.unity.test-framework": { 29 | "version": "1.3.9", 30 | "depth": 1, 31 | "source": "registry", 32 | "dependencies": { 33 | "com.unity.ext.nunit": "2.0.3", 34 | "com.unity.modules.imgui": "1.0.0", 35 | "com.unity.modules.jsonserialize": "1.0.0" 36 | }, 37 | "url": "https://packages.unity.com" 38 | }, 39 | "com.unity.modules.imgui": { 40 | "version": "1.0.0", 41 | "depth": 0, 42 | "source": "builtin", 43 | "dependencies": {} 44 | }, 45 | "com.unity.modules.jsonserialize": { 46 | "version": "1.0.0", 47 | "depth": 0, 48 | "source": "builtin", 49 | "dependencies": {} 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Volume: 1 8 | Rolloff Scale: 1 9 | Doppler Factor: 1 10 | Default Speaker Mode: 2 11 | m_SampleRate: 0 12 | m_DSPBufferSize: 1024 13 | m_VirtualVoiceCount: 512 14 | m_RealVoiceCount: 32 15 | m_SpatializerPlugin: 16 | m_AmbisonicDecoderPlugin: 17 | m_DisableAudio: 0 18 | m_VirtualizeEffects: 1 19 | m_RequestedDSPBufferSize: 1024 20 | -------------------------------------------------------------------------------- /ProjectSettings/AutoStreamingSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1200 &1 4 | AutoStreamingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | mSearchMode: 15 8 | mCustomSearchFile: 9 | mTextureSearchString: 10 | mMeshSearchString: 11 | mTextures: [] 12 | mAudios: [] 13 | mMeshes: [] 14 | mScenes: [] 15 | mConfigCCD: 16 | useCCD: 0 17 | cosKey: 18 | projectGuid: 19 | bucketUuid: 20 | bucketName: 21 | badgeName: 22 | -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_ClothInterCollisionDistance: 0 18 | m_ClothInterCollisionStiffness: 0 19 | m_ContactsGeneration: 1 20 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 | m_AutoSimulation: 1 22 | m_AutoSyncTransforms: 0 23 | m_ReuseCollisionCallbacks: 1 24 | m_ClothInterCollisionSettingsToggle: 0 25 | m_ContactPairsMode: 0 26 | m_BroadphaseType: 0 27 | m_WorldBounds: 28 | m_Center: {x: 0, y: 0, z: 0} 29 | m_Extent: {x: 250, y: 250, z: 250} 30 | m_WorldSubdivisions: 8 31 | m_FrictionType: 0 32 | m_EnableEnhancedDeterminism: 0 33 | m_EnableUnifiedHeightmaps: 1 34 | m_DefaultMaxAngluarSpeed: 7 35 | -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: [] 8 | m_configObjects: {} 9 | -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_ExternalVersionControlSupport: Visible Meta Files 8 | m_SerializationMode: 2 9 | m_LineEndingsForNewScripts: 0 10 | m_DefaultBehaviorMode: 0 11 | m_PrefabRegularEnvironment: {fileID: 0} 12 | m_PrefabUIEnvironment: {fileID: 0} 13 | m_SpritePackerMode: 0 14 | m_SpritePackerPaddingPower: 1 15 | m_EtcTextureCompressorBehavior: 1 16 | m_EtcTextureFastCompressor: 1 17 | m_EtcTextureNormalCompressor: 2 18 | m_EtcTextureBestCompressor: 4 19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref 20 | m_ProjectGenerationRootNamespace: 21 | m_CollabEditorSettings: 22 | inProgressEnabled: 1 23 | m_EnableTextureStreamingInEditMode: 1 24 | m_EnableTextureStreamingInPlayMode: 1 25 | m_AsyncShaderCompilation: 1 26 | m_EnterPlayModeOptionsEnabled: 0 27 | m_EnterPlayModeOptions: 3 28 | m_ShowLightmapResolutionOverlay: 1 29 | m_UseLegacyProbeSampleCount: 0 30 | m_SerializeInlineMappingsOnOneLine: 1 31 | -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 14 7 | m_Deferred: 8 | m_Mode: 0 9 | m_Shader: {fileID: 0} 10 | m_DeferredReflections: 11 | m_Mode: 0 12 | m_Shader: {fileID: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 0 15 | m_Shader: {fileID: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 0 18 | m_Shader: {fileID: 0} 19 | m_DepthNormals: 20 | m_Mode: 0 21 | m_Shader: {fileID: 0} 22 | m_MotionVectors: 23 | m_Mode: 0 24 | m_Shader: {fileID: 0} 25 | m_LightHalo: 26 | m_Mode: 0 27 | m_Shader: {fileID: 0} 28 | m_LensFlare: 29 | m_Mode: 0 30 | m_Shader: {fileID: 0} 31 | m_VideoShadersIncludeMode: 0 32 | m_AlwaysIncludedShaders: 33 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 38 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 39 | m_PreloadedShaders: [] 40 | m_PreloadShadersBatchTimeLimit: -1 41 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} 42 | m_CustomRenderPipeline: {fileID: 0} 43 | m_TransparencySortMode: 0 44 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 45 | m_DefaultRenderingPath: 1 46 | m_DefaultMobileRenderingPath: 1 47 | m_TierSettings: [] 48 | m_LightmapStripping: 1 49 | m_FogStripping: 1 50 | m_InstancingStripping: 0 51 | m_LightmapKeepPlain: 0 52 | m_LightmapKeepDirCombined: 0 53 | m_LightmapKeepDynamicPlain: 0 54 | m_LightmapKeepDynamicDirCombined: 0 55 | m_LightmapKeepShadowMask: 0 56 | m_LightmapKeepSubtractive: 0 57 | m_FogKeepLinear: 0 58 | m_FogKeepExp: 0 59 | m_FogKeepExp2: 0 60 | m_AlbedoSwatchInfos: [] 61 | m_LightsUseLinearIntensity: 0 62 | m_LightsUseColorTemperature: 0 63 | m_DefaultRenderingLayerMask: 1 64 | m_LogWhenShaderIsCompiled: 0 65 | m_SRPDefaultSettings: {} 66 | -------------------------------------------------------------------------------- /ProjectSettings/MemorySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!387306366 &1 4 | MemorySettings: 5 | m_ObjectHideFlags: 0 6 | m_EditorMemorySettings: 7 | m_MainAllocatorBlockSize: -1 8 | m_ThreadAllocatorBlockSize: -1 9 | m_MainGfxBlockSize: -1 10 | m_ThreadGfxBlockSize: -1 11 | m_CacheBlockSize: -1 12 | m_TypetreeBlockSize: -1 13 | m_ProfilerBlockSize: -1 14 | m_ProfilerEditorBlockSize: -1 15 | m_BucketAllocatorGranularity: -1 16 | m_BucketAllocatorBucketsCount: -1 17 | m_BucketAllocatorBlockSize: -1 18 | m_BucketAllocatorBlockCount: -1 19 | m_ProfilerBucketAllocatorGranularity: -1 20 | m_ProfilerBucketAllocatorBucketsCount: -1 21 | m_ProfilerBucketAllocatorBlockSize: -1 22 | m_ProfilerBucketAllocatorBlockCount: -1 23 | m_TempAllocatorSizeMain: -1 24 | m_JobTempAllocatorBlockSize: -1 25 | m_BackgroundJobTempAllocatorBlockSize: -1 26 | m_JobTempAllocatorReducedBlockSize: -1 27 | m_TempAllocatorSizeGIBakingWorker: -1 28 | m_TempAllocatorSizeNavMeshWorker: -1 29 | m_TempAllocatorSizeAudioWorker: -1 30 | m_TempAllocatorSizeCloudWorker: -1 31 | m_TempAllocatorSizeGfx: -1 32 | m_TempAllocatorSizeJobWorker: -1 33 | m_TempAllocatorSizeBackgroundWorker: -1 34 | m_TempAllocatorSizePreloadManager: -1 35 | m_PlatformMemorySettings: {} 36 | -------------------------------------------------------------------------------- /ProjectSettings/MultiplayerManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!655991488 &1 4 | MultiplayerManager: 5 | m_ObjectHideFlags: 0 6 | m_EnableMultiplayerRoles: 0 7 | m_ActiveMultiplayerRole: 0 8 | -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | debug: 89 | m_Flags: 0 90 | m_SettingNames: 91 | - Humanoid 92 | -------------------------------------------------------------------------------- /ProjectSettings/PackageManagerSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 61 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | m_EnablePreReleasePackages: 0 16 | m_AdvancedSettingsExpanded: 1 17 | m_ScopedRegistriesSettingsExpanded: 1 18 | m_SeeAllPackageVersions: 0 19 | m_DismissPreviewPackagesInUse: 0 20 | oneTimeWarningShown: 0 21 | m_Registries: 22 | - m_Id: main 23 | m_Name: 24 | m_Url: https://packages.unity.com 25 | m_Scopes: [] 26 | m_IsDefault: 1 27 | m_Capabilities: 7 28 | m_ConfigSource: 0 29 | m_UserSelectedRegistryName: 30 | m_UserAddingNewScopedRegistry: 0 31 | m_RegistryInfoDraft: 32 | m_Modified: 0 33 | m_ErrorMessage: 34 | m_UserModificationsInstanceId: -854 35 | m_OriginalInstanceId: -856 36 | m_LoadAssets: 0 37 | -------------------------------------------------------------------------------- /ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "m_Name": "Settings", 3 | "m_Path": "ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json", 4 | "m_Dictionary": { 5 | "m_DictionaryValues": [] 6 | } 7 | } -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 4 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_JobOptions: 23 | serializedVersion: 2 24 | useMultithreading: 0 25 | useConsistencySorting: 0 26 | m_InterpolationPosesPerJob: 100 27 | m_NewContactsPerJob: 30 28 | m_CollideContactsPerJob: 100 29 | m_ClearFlagsPerJob: 200 30 | m_ClearBodyForcesPerJob: 200 31 | m_SyncDiscreteFixturesPerJob: 50 32 | m_SyncContinuousFixturesPerJob: 50 33 | m_FindNearestContactsPerJob: 100 34 | m_UpdateTriggerContactsPerJob: 100 35 | m_IslandSolverCostThreshold: 100 36 | m_IslandSolverBodyCostScale: 1 37 | m_IslandSolverContactCostScale: 10 38 | m_IslandSolverJointCostScale: 10 39 | m_IslandSolverBodiesPerJob: 50 40 | m_IslandSolverContactsPerJob: 50 41 | m_AutoSimulation: 1 42 | m_QueriesHitTriggers: 1 43 | m_QueriesStartInColliders: 1 44 | m_CallbacksOnDisable: 1 45 | m_ReuseCollisionCallbacks: 1 46 | m_AutoSyncTransforms: 0 47 | m_AlwaysShowColliders: 0 48 | m_ShowColliderSleep: 1 49 | m_ShowColliderContacts: 0 50 | m_ShowColliderAABB: 0 51 | m_ContactArrowScale: 0.2 52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 57 | -------------------------------------------------------------------------------- /ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_DefaultPresets: {} 8 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2023.2.20f1 2 | m_EditorVersionWithRevision: 2023.2.20f1 (0e25a174756c) 3 | -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 0 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Ultra 11 | pixelLightCount: 4 12 | shadows: 2 13 | shadowResolution: 2 14 | shadowProjection: 1 15 | shadowCascades: 4 16 | shadowDistance: 150 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 1 21 | skinWeights: 4 22 | textureQuality: 0 23 | anisotropicTextures: 2 24 | antiAliasing: 2 25 | softParticles: 0 26 | softVegetation: 1 27 | realtimeReflectionProbes: 1 28 | billboardsFaceCameraPosition: 1 29 | vSyncCount: 1 30 | lodBias: 2 31 | maximumLODLevel: 0 32 | streamingMipmapsActive: 0 33 | streamingMipmapsAddAllCameras: 1 34 | streamingMipmapsMemoryBudget: 512 35 | streamingMipmapsRenderersPerFrame: 512 36 | streamingMipmapsMaxLevelReduction: 2 37 | streamingMipmapsMaxFileIORequests: 1024 38 | particleRaycastBudget: 4096 39 | asyncUploadTimeSlice: 2 40 | asyncUploadBufferSize: 16 41 | asyncUploadPersistentBuffer: 1 42 | resolutionScalingFixedDPIFactor: 1 43 | customRenderPipeline: {fileID: 0} 44 | excludedTargetPlatforms: 45 | - Server 46 | m_PerPlatformDefaultQuality: 47 | Android: 0 48 | Lumin: 0 49 | Nintendo 3DS: 0 50 | Nintendo Switch: 0 51 | PS4: 0 52 | PSP2: 0 53 | Server: 0 54 | Stadia: 0 55 | Standalone: 0 56 | WebGL: 0 57 | Windows Store Apps: 0 58 | XboxOne: 0 59 | iPhone: 0 60 | tvOS: 0 61 | -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_DashboardUrl: https://dashboard.unity3d.com 13 | m_CNEventUrl: https://cdp.cloud.unity.cn/v1/events 14 | m_CNConfigUrl: https://cdp.cloud.unity.cn/config 15 | m_TestInitMode: 0 16 | CrashReportingSettings: 17 | m_EventUrl: https://perf-events.cloud.unity.cn 18 | m_Enabled: 0 19 | m_LogBufferSize: 10 20 | m_CaptureEditorExceptions: 1 21 | UnityPurchasingSettings: 22 | m_Enabled: 0 23 | m_TestMode: 0 24 | UnityAnalyticsSettings: 25 | m_Enabled: 0 26 | m_TestMode: 0 27 | m_InitializeOnStartup: 1 28 | UnityAdsSettings: 29 | m_Enabled: 0 30 | m_InitializeOnStartup: 1 31 | m_TestMode: 0 32 | m_IosGameId: 33 | m_AndroidGameId: 34 | m_GameIds: {} 35 | m_GameId: 36 | PerformanceReportingSettings: 37 | m_Enabled: 0 38 | -------------------------------------------------------------------------------- /ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_StripUpdateShader: {fileID: 0} 10 | m_RenderPipeSettingsPath: 11 | m_FixedTimeStep: 0.016666668 12 | m_MaxDeltaTime: 0.05 13 | -------------------------------------------------------------------------------- /ProjectSettings/VersionControlSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!890905787 &1 4 | VersionControlSettings: 5 | m_ObjectHideFlags: 0 6 | m_Mode: Visible Meta Files 7 | m_CollabEditorSettings: 8 | inProgressEnabled: 1 9 | -------------------------------------------------------------------------------- /ProjectSettings/XRSettings.asset: -------------------------------------------------------------------------------- 1 | { 2 | "m_SettingKeys": [ 3 | "VR Device Disabled", 4 | "VR Device User Alert" 5 | ], 6 | "m_SettingValues": [ 7 | "False", 8 | "False" 9 | ] 10 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LearnGPUDriven --------------------------------------------------------------------------------