├── images ├── prefab.png ├── shader_01.png ├── shader_02.png ├── shader_03.png ├── shader_04.png ├── shader_05.png ├── shader_06.png ├── shader_07.png ├── test-object.png ├── sphere-of-cubes.png ├── enable-instancing.png ├── sphere-instancing.png ├── sphere-of-spheres.png ├── sphere-no-instancing.png └── shader-enable-instancing.png ├── UnityGPUInstancing ├── Assets │ ├── Scenes │ │ ├── SampleScene.unity.meta │ │ └── SampleScene.unity │ ├── Prefabs.meta │ ├── Scenes.meta │ ├── Scripts.meta │ ├── Shaders.meta │ ├── Materials.meta │ ├── Prefabs │ │ ├── Sphere.prefab.meta │ │ └── Sphere.prefab │ ├── Materials │ │ ├── DefaultLighting.mat.meta │ │ └── DefaultLighting.mat │ ├── Shaders │ │ ├── LightingShader.shader.meta │ │ └── LightingShader.shader │ └── Scripts │ │ ├── GPUInstancing.cs.meta │ │ └── GPUInstancing.cs └── Assembly-CSharp.csproj └── README.md /images/prefab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/prefab.png -------------------------------------------------------------------------------- /images/shader_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/shader_01.png -------------------------------------------------------------------------------- /images/shader_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/shader_02.png -------------------------------------------------------------------------------- /images/shader_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/shader_03.png -------------------------------------------------------------------------------- /images/shader_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/shader_04.png -------------------------------------------------------------------------------- /images/shader_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/shader_05.png -------------------------------------------------------------------------------- /images/shader_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/shader_06.png -------------------------------------------------------------------------------- /images/shader_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/shader_07.png -------------------------------------------------------------------------------- /images/test-object.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/test-object.png -------------------------------------------------------------------------------- /images/sphere-of-cubes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/sphere-of-cubes.png -------------------------------------------------------------------------------- /images/enable-instancing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/enable-instancing.png -------------------------------------------------------------------------------- /images/sphere-instancing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/sphere-instancing.png -------------------------------------------------------------------------------- /images/sphere-of-spheres.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/sphere-of-spheres.png -------------------------------------------------------------------------------- /images/sphere-no-instancing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/sphere-no-instancing.png -------------------------------------------------------------------------------- /images/shader-enable-instancing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vanCopper/Unity-GPU-Instancing/HEAD/images/shader-enable-instancing.png -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Scenes/SampleScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 99c9720ab356a0642a771bea13969a05 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Prefabs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5f498c7e2308640fc8ac8bd8194306e7 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4f704ae4b4f98ae41a0bce26658850c1 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dc1d1df669d92427680553c603392c8d 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Shaders.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1d5439fc3dfde4e4280b329a447a2847 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Materials.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0d9f73318f5c44cffbb0366f9a0292f3 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Prefabs/Sphere.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b33e710067eb94fafb5341df157f716f 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 100100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Materials/DefaultLighting.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dc22beb250d454fd3961d72e3d122c6e 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Shaders/LightingShader.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d5217477f838f4b7ab01c45b10bab45d 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Scripts/GPUInstancing.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cccbc83e675454056916e1925dc81281 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Scripts/GPUInstancing.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class GPUInstancing : MonoBehaviour 6 | { 7 | 8 | public Transform prefab; 9 | 10 | public int instances = 5000; 11 | 12 | public float radius = 50f; 13 | 14 | void Start() 15 | { 16 | MaterialPropertyBlock properties = new MaterialPropertyBlock(); 17 | for (int i = 0; i < instances; i++) 18 | { 19 | Transform t = Instantiate(prefab); 20 | t.localPosition = Random.insideUnitSphere * radius; 21 | t.SetParent(transform); 22 | 23 | properties.SetColor("_Color", new Color(Random.value, Random.value, Random.value)); 24 | t.GetComponent().SetPropertyBlock(properties); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Shaders/LightingShader.shader: -------------------------------------------------------------------------------- 1 | // Upgrade NOTE: replaced 'UNITY_INSTANCE_ID' with 'UNITY_VERTEX_INPUT_INSTANCE_ID' 2 | 3 | Shader "Copper/LightingShader" 4 | { 5 | Properties 6 | { 7 | _MainTex ("Texture", 2D) = "white" {} 8 | _Color ("Main Color", Color) = (1,1,1,1) 9 | } 10 | SubShader 11 | { 12 | Tags { "RenderType"="Opaque" } 13 | LOD 100 14 | 15 | Pass 16 | { 17 | CGPROGRAM 18 | #pragma vertex vert 19 | #pragma fragment frag 20 | // make fog work 21 | #pragma multi_compile_fog 22 | #pragma multi_compile_instancing 23 | //#pragma instancing_options forcemaxcount:456 24 | 25 | #include "UnityCG.cginc" 26 | 27 | //fixed4 _Color; 28 | 29 | struct appdata 30 | { 31 | UNITY_VERTEX_INPUT_INSTANCE_ID 32 | float4 vertex : POSITION; 33 | float2 uv : TEXCOORD0; 34 | }; 35 | 36 | struct v2f 37 | { 38 | float2 uv : TEXCOORD0; 39 | UNITY_FOG_COORDS(1) 40 | float4 vertex : SV_POSITION; 41 | }; 42 | 43 | sampler2D _MainTex; 44 | float4 _MainTex_ST; 45 | 46 | UNITY_INSTANCING_BUFFER_START(Props) 47 | UNITY_DEFINE_INSTANCED_PROP(float4, _Color) 48 | UNITY_DEFINE_INSTANCED_PROP(float4x4, _Te) 49 | UNITY_DEFINE_INSTANCED_PROP(float4x4, _Te1) 50 | UNITY_INSTANCING_BUFFER_END(Props) 51 | 52 | v2f vert (appdata v) 53 | { 54 | v2f o; 55 | UNITY_SETUP_INSTANCE_ID(v) 56 | o.vertex = UnityObjectToClipPos(v.vertex); 57 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 58 | UNITY_TRANSFER_FOG(o,o.vertex); 59 | return o; 60 | } 61 | 62 | fixed4 frag (v2f i) : SV_Target 63 | { 64 | // sample the texture 65 | fixed4 col = tex2D(_MainTex, i.uv); 66 | fixed4x4 Te = UNITY_ACCESS_INSTANCED_PROP(Props, _Te); 67 | fixed4x4 Te1 = UNITY_ACCESS_INSTANCED_PROP(Props, _Te1); 68 | // apply fog 69 | UNITY_APPLY_FOG(i.fogCoord, col); 70 | //return col*_Color; 71 | return col * UNITY_ACCESS_INSTANCED_PROP(Props, _Color); 72 | } 73 | ENDCG 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Materials/DefaultLighting.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInternal: {fileID: 0} 9 | m_Name: DefaultLighting 10 | m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} 11 | m_ShaderKeywords: 12 | m_LightmapFlags: 4 13 | m_EnableInstancingVariants: 0 14 | m_DoubleSidedGI: 0 15 | m_CustomRenderQueue: -1 16 | stringTagMap: {} 17 | disabledShaderPasses: [] 18 | m_SavedProperties: 19 | serializedVersion: 3 20 | m_TexEnvs: 21 | - _BumpMap: 22 | m_Texture: {fileID: 0} 23 | m_Scale: {x: 1, y: 1} 24 | m_Offset: {x: 0, y: 0} 25 | - _DetailAlbedoMap: 26 | m_Texture: {fileID: 0} 27 | m_Scale: {x: 1, y: 1} 28 | m_Offset: {x: 0, y: 0} 29 | - _DetailMask: 30 | m_Texture: {fileID: 0} 31 | m_Scale: {x: 1, y: 1} 32 | m_Offset: {x: 0, y: 0} 33 | - _DetailNormalMap: 34 | m_Texture: {fileID: 0} 35 | m_Scale: {x: 1, y: 1} 36 | m_Offset: {x: 0, y: 0} 37 | - _EmissionMap: 38 | m_Texture: {fileID: 0} 39 | m_Scale: {x: 1, y: 1} 40 | m_Offset: {x: 0, y: 0} 41 | - _MainTex: 42 | m_Texture: {fileID: 0} 43 | m_Scale: {x: 1, y: 1} 44 | m_Offset: {x: 0, y: 0} 45 | - _MetallicGlossMap: 46 | m_Texture: {fileID: 0} 47 | m_Scale: {x: 1, y: 1} 48 | m_Offset: {x: 0, y: 0} 49 | - _OcclusionMap: 50 | m_Texture: {fileID: 0} 51 | m_Scale: {x: 1, y: 1} 52 | m_Offset: {x: 0, y: 0} 53 | - _ParallaxMap: 54 | m_Texture: {fileID: 0} 55 | m_Scale: {x: 1, y: 1} 56 | m_Offset: {x: 0, y: 0} 57 | m_Floats: 58 | - _BumpScale: 1 59 | - _Cutoff: 0.5 60 | - _DetailNormalMapScale: 1 61 | - _DstBlend: 0 62 | - _GlossMapScale: 1 63 | - _Glossiness: 0.5 64 | - _GlossyReflections: 1 65 | - _Metallic: 0 66 | - _Mode: 0 67 | - _OcclusionStrength: 1 68 | - _Parallax: 0.02 69 | - _SmoothnessTextureChannel: 0 70 | - _SpecularHighlights: 1 71 | - _SrcBlend: 1 72 | - _UVSec: 0 73 | - _ZWrite: 1 74 | m_Colors: 75 | - _Color: {r: 1, g: 1, b: 1, a: 1} 76 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} 77 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Prefabs/Sphere.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &1698711233419594 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 4532375524393136} 12 | - component: {fileID: 33918390995410292} 13 | - component: {fileID: 23313242755824744} 14 | - component: {fileID: 135685135531540028} 15 | m_Layer: 0 16 | m_Name: Sphere 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!4 &4532375524393136 23 | Transform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 1698711233419594} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: [] 33 | m_Father: {fileID: 0} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | --- !u!33 &33918390995410292 37 | MeshFilter: 38 | m_ObjectHideFlags: 0 39 | m_CorrespondingSourceObject: {fileID: 0} 40 | m_PrefabInstance: {fileID: 0} 41 | m_PrefabAsset: {fileID: 0} 42 | m_GameObject: {fileID: 1698711233419594} 43 | m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} 44 | --- !u!23 &23313242755824744 45 | MeshRenderer: 46 | m_ObjectHideFlags: 0 47 | m_CorrespondingSourceObject: {fileID: 0} 48 | m_PrefabInstance: {fileID: 0} 49 | m_PrefabAsset: {fileID: 0} 50 | m_GameObject: {fileID: 1698711233419594} 51 | m_Enabled: 1 52 | m_CastShadows: 1 53 | m_ReceiveShadows: 1 54 | m_DynamicOccludee: 1 55 | m_MotionVectors: 1 56 | m_LightProbeUsage: 1 57 | m_ReflectionProbeUsage: 1 58 | m_RenderingLayerMask: 4294967295 59 | m_RendererPriority: 0 60 | m_Materials: 61 | - {fileID: 2100000, guid: dc22beb250d454fd3961d72e3d122c6e, type: 2} 62 | m_StaticBatchInfo: 63 | firstSubMesh: 0 64 | subMeshCount: 0 65 | m_StaticBatchRoot: {fileID: 0} 66 | m_ProbeAnchor: {fileID: 0} 67 | m_LightProbeVolumeOverride: {fileID: 0} 68 | m_ScaleInLightmap: 1 69 | m_PreserveUVs: 0 70 | m_IgnoreNormalsForChartDetection: 0 71 | m_ImportantGI: 0 72 | m_StitchLightmapSeams: 0 73 | m_SelectedEditorRenderState: 3 74 | m_MinimumChartSize: 4 75 | m_AutoUVMaxDistance: 0.5 76 | m_AutoUVMaxAngle: 89 77 | m_LightmapParameters: {fileID: 0} 78 | m_SortingLayerID: 0 79 | m_SortingLayer: 0 80 | m_SortingOrder: 0 81 | --- !u!135 &135685135531540028 82 | SphereCollider: 83 | m_ObjectHideFlags: 0 84 | m_CorrespondingSourceObject: {fileID: 0} 85 | m_PrefabInstance: {fileID: 0} 86 | m_PrefabAsset: {fileID: 0} 87 | m_GameObject: {fileID: 1698711233419594} 88 | m_Material: {fileID: 0} 89 | m_IsTrigger: 0 90 | m_Enabled: 1 91 | serializedVersion: 2 92 | m_Radius: 0.5 93 | m_Center: {x: 0, y: 0, z: 0} 94 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assets/Scenes/SampleScene.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 9 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} 24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} 25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 0 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 0} 41 | m_IndirectSpecularColor: {r: 0.44657856, g: 0.49641234, b: 0.57481724, a: 1} 42 | m_UseRadianceAmbientProbe: 0 43 | --- !u!157 &3 44 | LightmapSettings: 45 | m_ObjectHideFlags: 0 46 | serializedVersion: 11 47 | m_GIWorkflowMode: 0 48 | m_GISettings: 49 | serializedVersion: 2 50 | m_BounceScale: 1 51 | m_IndirectOutputScale: 1 52 | m_AlbedoBoost: 1 53 | m_TemporalCoherenceThreshold: 1 54 | m_EnvironmentLightingMode: 0 55 | m_EnableBakedLightmaps: 1 56 | m_EnableRealtimeLightmaps: 0 57 | m_LightmapEditorSettings: 58 | serializedVersion: 10 59 | m_Resolution: 2 60 | m_BakeResolution: 10 61 | m_AtlasSize: 512 62 | m_AO: 0 63 | m_AOMaxDistance: 1 64 | m_CompAOExponent: 1 65 | m_CompAOExponentDirect: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 1 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 256 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 2 75 | m_BakeBackend: 1 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 256 79 | m_PVRBounces: 2 80 | m_PVRFilterTypeDirect: 0 81 | m_PVRFilterTypeIndirect: 0 82 | m_PVRFilterTypeAO: 0 83 | m_PVRFilteringMode: 1 84 | m_PVRCulling: 1 85 | m_PVRFilteringGaussRadiusDirect: 1 86 | m_PVRFilteringGaussRadiusIndirect: 5 87 | m_PVRFilteringGaussRadiusAO: 2 88 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 89 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 90 | m_PVRFilteringAtrousPositionSigmaAO: 1 91 | m_ShowResolutionOverlay: 1 92 | m_LightingDataAsset: {fileID: 0} 93 | m_UseShadowmask: 1 94 | --- !u!196 &4 95 | NavMeshSettings: 96 | serializedVersion: 2 97 | m_ObjectHideFlags: 0 98 | m_BuildSettings: 99 | serializedVersion: 2 100 | agentTypeID: 0 101 | agentRadius: 0.5 102 | agentHeight: 2 103 | agentSlope: 45 104 | agentClimb: 0.4 105 | ledgeDropHeight: 0 106 | maxJumpAcrossDistance: 0 107 | minRegionArea: 2 108 | manualCellSize: 0 109 | cellSize: 0.16666667 110 | manualTileSize: 0 111 | tileSize: 256 112 | accuratePlacement: 0 113 | debug: 114 | m_Flags: 0 115 | m_NavMeshData: {fileID: 0} 116 | --- !u!1 &170076733 117 | GameObject: 118 | m_ObjectHideFlags: 0 119 | m_CorrespondingSourceObject: {fileID: 0} 120 | m_PrefabInternal: {fileID: 0} 121 | serializedVersion: 6 122 | m_Component: 123 | - component: {fileID: 170076735} 124 | - component: {fileID: 170076734} 125 | m_Layer: 0 126 | m_Name: Directional Light 127 | m_TagString: Untagged 128 | m_Icon: {fileID: 0} 129 | m_NavMeshLayer: 0 130 | m_StaticEditorFlags: 0 131 | m_IsActive: 1 132 | --- !u!108 &170076734 133 | Light: 134 | m_ObjectHideFlags: 0 135 | m_CorrespondingSourceObject: {fileID: 0} 136 | m_PrefabInternal: {fileID: 0} 137 | m_GameObject: {fileID: 170076733} 138 | m_Enabled: 1 139 | serializedVersion: 8 140 | m_Type: 1 141 | m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} 142 | m_Intensity: 1 143 | m_Range: 10 144 | m_SpotAngle: 30 145 | m_CookieSize: 10 146 | m_Shadows: 147 | m_Type: 0 148 | m_Resolution: -1 149 | m_CustomResolution: -1 150 | m_Strength: 1 151 | m_Bias: 0.05 152 | m_NormalBias: 0.4 153 | m_NearPlane: 0.2 154 | m_Cookie: {fileID: 0} 155 | m_DrawHalo: 0 156 | m_Flare: {fileID: 0} 157 | m_RenderMode: 0 158 | m_CullingMask: 159 | serializedVersion: 2 160 | m_Bits: 4294967295 161 | m_Lightmapping: 1 162 | m_LightShadowCasterMode: 0 163 | m_AreaSize: {x: 1, y: 1} 164 | m_BounceIntensity: 1 165 | m_ColorTemperature: 6570 166 | m_UseColorTemperature: 0 167 | m_ShadowRadius: 0 168 | m_ShadowAngle: 0 169 | --- !u!4 &170076735 170 | Transform: 171 | m_ObjectHideFlags: 0 172 | m_CorrespondingSourceObject: {fileID: 0} 173 | m_PrefabInternal: {fileID: 0} 174 | m_GameObject: {fileID: 170076733} 175 | m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} 176 | m_LocalPosition: {x: 0, y: 3, z: 0} 177 | m_LocalScale: {x: 1, y: 1, z: 1} 178 | m_Children: [] 179 | m_Father: {fileID: 0} 180 | m_RootOrder: 1 181 | m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} 182 | --- !u!1 &534669902 183 | GameObject: 184 | m_ObjectHideFlags: 0 185 | m_CorrespondingSourceObject: {fileID: 0} 186 | m_PrefabInternal: {fileID: 0} 187 | serializedVersion: 6 188 | m_Component: 189 | - component: {fileID: 534669905} 190 | - component: {fileID: 534669904} 191 | - component: {fileID: 534669903} 192 | m_Layer: 0 193 | m_Name: Main Camera 194 | m_TagString: Untagged 195 | m_Icon: {fileID: 0} 196 | m_NavMeshLayer: 0 197 | m_StaticEditorFlags: 0 198 | m_IsActive: 1 199 | --- !u!81 &534669903 200 | AudioListener: 201 | m_ObjectHideFlags: 0 202 | m_CorrespondingSourceObject: {fileID: 0} 203 | m_PrefabInternal: {fileID: 0} 204 | m_GameObject: {fileID: 534669902} 205 | m_Enabled: 1 206 | --- !u!20 &534669904 207 | Camera: 208 | m_ObjectHideFlags: 0 209 | m_CorrespondingSourceObject: {fileID: 0} 210 | m_PrefabInternal: {fileID: 0} 211 | m_GameObject: {fileID: 534669902} 212 | m_Enabled: 1 213 | serializedVersion: 2 214 | m_ClearFlags: 1 215 | m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} 216 | m_projectionMatrixMode: 1 217 | m_SensorSize: {x: 36, y: 24} 218 | m_LensShift: {x: 0, y: 0} 219 | m_FocalLength: 50 220 | m_NormalizedViewPortRect: 221 | serializedVersion: 2 222 | x: 0 223 | y: 0 224 | width: 1 225 | height: 1 226 | near clip plane: 0.3 227 | far clip plane: 1000 228 | field of view: 60 229 | orthographic: 0 230 | orthographic size: 5 231 | m_Depth: -1 232 | m_CullingMask: 233 | serializedVersion: 2 234 | m_Bits: 4294967295 235 | m_RenderingPath: -1 236 | m_TargetTexture: {fileID: 0} 237 | m_TargetDisplay: 0 238 | m_TargetEye: 3 239 | m_HDR: 1 240 | m_AllowMSAA: 1 241 | m_AllowDynamicResolution: 0 242 | m_ForceIntoRT: 0 243 | m_OcclusionCulling: 1 244 | m_StereoConvergence: 10 245 | m_StereoSeparation: 0.022 246 | --- !u!4 &534669905 247 | Transform: 248 | m_ObjectHideFlags: 0 249 | m_CorrespondingSourceObject: {fileID: 0} 250 | m_PrefabInternal: {fileID: 0} 251 | m_GameObject: {fileID: 534669902} 252 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 253 | m_LocalPosition: {x: 0, y: 1, z: -100} 254 | m_LocalScale: {x: 1, y: 1, z: 1} 255 | m_Children: [] 256 | m_Father: {fileID: 0} 257 | m_RootOrder: 0 258 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 259 | --- !u!1 &1436225041 260 | GameObject: 261 | m_ObjectHideFlags: 0 262 | m_CorrespondingSourceObject: {fileID: 0} 263 | m_PrefabInternal: {fileID: 0} 264 | serializedVersion: 6 265 | m_Component: 266 | - component: {fileID: 1436225043} 267 | - component: {fileID: 1436225042} 268 | m_Layer: 0 269 | m_Name: GPUInstancing 270 | m_TagString: Untagged 271 | m_Icon: {fileID: 0} 272 | m_NavMeshLayer: 0 273 | m_StaticEditorFlags: 0 274 | m_IsActive: 1 275 | --- !u!114 &1436225042 276 | MonoBehaviour: 277 | m_ObjectHideFlags: 0 278 | m_CorrespondingSourceObject: {fileID: 0} 279 | m_PrefabInternal: {fileID: 0} 280 | m_GameObject: {fileID: 1436225041} 281 | m_Enabled: 1 282 | m_EditorHideFlags: 0 283 | m_Script: {fileID: 11500000, guid: cccbc83e675454056916e1925dc81281, type: 3} 284 | m_Name: 285 | m_EditorClassIdentifier: 286 | prefab: {fileID: 4532375524393136, guid: b33e710067eb94fafb5341df157f716f, type: 2} 287 | instances: 5000 288 | radius: 50 289 | --- !u!4 &1436225043 290 | Transform: 291 | m_ObjectHideFlags: 0 292 | m_CorrespondingSourceObject: {fileID: 0} 293 | m_PrefabInternal: {fileID: 0} 294 | m_GameObject: {fileID: 1436225041} 295 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 296 | m_LocalPosition: {x: 0, y: 0, z: 0} 297 | m_LocalScale: {x: 1, y: 1, z: 1} 298 | m_Children: [] 299 | m_Father: {fileID: 0} 300 | m_RootOrder: 2 301 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 302 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unity GPU Instancing 2 | 运行环境:Unity 2018.3.2f1 3 | 4 | 5 | 6 | Unity 提供了**Static Batching**和**Dynamic Batching**两种方式来优化渲染性能。 7 | 8 | * **Static Batching** 9 | 10 | **Static Batching**会在Build阶段提取多个使用相同材质的,且不会移动,旋转和缩放模型的**Vertex buffer**和**Index buffer**。然后将顶点数据变换到世界空间下,存储到最终**Static Batching**所使用的**Vertex buffer**中,并记录每个子模型的**Index buffer**在**Static Batching**所使用的**Index buffer**中的位置。在绘制阶段,会一次性提交合并后的模型顶点数据,最终引擎会根据子模型的可见性确定需要绘制的子模型,设置一次渲染状态,再调用多次**Draw Call**分别绘制子模型。 11 | 12 | 所以**Static Batching**并没有减少**Draw Call**的数量,但在绘制阶段避免了多次数据提交和渲染状态的切换。 13 | 14 | * **Dynamic Batching** 15 | 16 | **Dynamic Batching**会在运行时将使用同一材质的模型进行合并渲染,也就是将符合条件的GameObject放在一个**Draw Call**中绘制。使用**Dynamic Batching**有一些限制: 17 | 18 | 1. 模型最高900个顶点属性,300个顶点。假如我们的Shader中每个顶点使用了Position, Normal, UV,那么模型只能有300个顶点。如果在Shader中使用了Position, Normal, UV0, UV1, Tangent,那么顶点数就要减少到180个(5*180=900)。 19 | 2. GameObject之间有镜像变换的不能进行合批 20 | 3. 使用Multi-pass Shader的GameObject禁止合批 21 | 4. 拥有lightmap的对象,无法合批 22 | 5. GameObject接收实时阴影无法合批 23 | 24 | **Dynamic Batching**在降低Draw Call的同时会导致额外的CPU性能消耗,所以仅在合批操作的性能消耗小于不合批,**Dynamic Batching**才有意义。 25 | 26 | #### 1.1 动态合批 27 | 28 | 1. 新建一个球体的Prefab用于测试 29 | 30 | ![](./images/prefab.png) 31 | 32 | 2. 新建**GPUInstancing**脚本,用于生成Sphere实例 33 | 34 | ```c# 35 | using System.Collections; 36 | using System.Collections.Generic; 37 | using UnityEngine; 38 | 39 | public class GPUInstancing : MonoBehaviour 40 | { 41 | 42 | public Transform prefab; 43 | 44 | public int instances = 5000; 45 | 46 | public float radius = 50f; 47 | 48 | void Start() 49 | { 50 | for (int i = 0; i < instances; i++) 51 | { 52 | Transform t = Instantiate(prefab); 53 | t.localPosition = Random.insideUnitSphere * radius; 54 | t.SetParent(transform); 55 | } 56 | } 57 | } 58 | 59 | ``` 60 | 61 | 3. 新建**GameObject**并添加脚本**GPUInstancing**,生成半径50,实例数5000。 62 | 63 | ![](./images/test-object.png) 64 | 65 | 4. 将相机位置设置在(0,0,-100)以保证所有物体均在视野范围内。关掉光源的**Shadow**,设置相机的渲染路径为**Forward Rendering**。 66 | 67 | ![](./images/sphere-of-spheres.png) 68 | 69 | 可以看到总共有5002次DrawCall(Batches),其中5000次是场景中的球体的绘制。尽管开启了动态合批,但由于Sphere的模型过大,导致无法动态合批。而且FPS只有0.6 70 | 71 | 5. 将Sphere替换为Cube,观察合批结果 72 | 73 | ![](./images/sphere-of-cubes.png) 74 | 75 | 可以看到这时只有8次DrawCall(Batches),4994个Cube被动态合批了。FPS也从0.6fps上升到了75fps。 76 | 77 | #### 1.2 GPU Instancing 测试 78 | 79 | ​ GPU Instancing 并不是默认开启的。Shader需要特殊处理才能支持GPU Instancing。Unity的standard shader中是有开启GPU Instancing选项的,如果是自定义Shader,就需要自己去处理。我们先来用Sphere的渲染来测试下,5000个Sphere不开启GUP Instancing的情况: 80 | 81 | ![](./images/sphere-no-instancing.png) 82 | 83 | 因Sphere无法动态合批,5000个Sphere就5000次DrawCall。 84 | 85 | 现在把材质中的**Enable GPU Instancing**选项开启: 86 | 87 | ![](./images/enable-instancing.png) 88 | 89 | 再次运行程序: 90 | 91 | ![](./images/sphere-instancing.png) 92 | 93 | 5000个Sphere被合批至10个DrawCall中处理了。被Instancing的Draw Call都被标记为了Draw Mesh(instanced)了。 94 | 95 | #### 1.3 什么是GPU Instancing 96 | 97 | GPU Instancing是指由GPU和图形API支持的,用一个DrawCall同时绘制多个具有相同网格物体的技术。假如现在有一个包含大量模型的场景,而这些模型的网格数据都一样,不同的仅仅是世界空间下坐标不同。如果按照正常的渲染流程,DrawCall次数是和物件数量相同的,随着物件数量的上升CPU往GPU上传的数据就会越来越多,很快就会遇到性能的瓶颈。 98 | 99 | 使用GPU Instancing技术时,数据的上传是一次性打包上传至GPU的,紧接着调用GPU和图形的API利用这些数据绘制多个物件。Unity中的具体实现步骤如下: 100 | 101 | * 将Per-Instance Data(世界矩阵,颜色等自定义变量)打包成Uniform Array,存储在Instance Constant Buffers中 102 | * 对于可以使用Instancing的Batch,调用各平台图形API的Instancing DrawCall,为每个Instance生成一个不同的SV_InstanceID 103 | * 在Shader中使用SV_InstanceID作为Uniform Array的索引来获取当前Instance的Per-Instance Data 104 | 105 | GPU Instancing技术并不是总能提高性能的,如果场景中有大量使用相同材质和相同网格的物体并性能问题是由DrawCall次数过多导致的,这时使用GPU Instancing可以得到不错的性能提升。在实际的游戏项目中植被和树木是最适合使用的。这里要注意的是GPU Instancing是通过减少DrawCall来降低CPU开销的,但这同事也会为GPU带来额外的开销。**适合的才是最好的,切勿沉迷性能优化无法自拔**。 106 | 107 | 目前GPU Instancing支持的平台: 108 | 109 | * DirectX11 and DirectX12 on Windows 110 | * OpenGL Core 4.1+/ES3.0+ on Windows, macOS, Linux, iOS and Android 111 | * Metal on macOS and iOS 112 | * Vulkan on Windows, Linux and Android 113 | * PlayStation 4 and Xbox One 114 | * WebGL(requires WebGL 2.0 API) 115 | 116 | 使用GPU Instancing 技术注意事项: 117 | 118 | * 使用Lightmap的物体无法使用Instancing 119 | * 受不同Light Probe / Reflection Probe影响的物体无法使用Instancing 120 | * 使用包含多个Pass的Shader物体,只有第一个Pass可以Instancing 121 | * 前向渲染时,受多个光源影响的物体只有Base Pass可以Instancing, Add Passes不行 122 | * Instancing 适用于MeshRenderer组件和Graphics.DrawMesh() 123 | * 需要物件使用相同的Material和Mesh 124 | * 需要把Shader改成Instanced的版本 125 | * 当所有条件均满足的情况下,Instancing是自动进行的,并且优先级高于 Static/Dynamic Batching 126 | 127 | #### 2.1 让自定义Shader支持Instancing 128 | 129 | 首先我们新建一个简单的Shader: 130 | 131 | ```c# 132 | Shader "Copper/LightingShader" 133 | { 134 | Properties 135 | { 136 | _MainTex ("Texture", 2D) = "white" {} 137 | } 138 | SubShader 139 | { 140 | Tags { "RenderType"="Opaque" } 141 | LOD 100 142 | 143 | Pass 144 | { 145 | CGPROGRAM 146 | #pragma vertex vert 147 | #pragma fragment frag 148 | // make fog work 149 | #pragma multi_compile_fog 150 | 151 | #include "UnityCG.cginc" 152 | 153 | struct appdata 154 | { 155 | float4 vertex : POSITION; 156 | float2 uv : TEXCOORD0; 157 | }; 158 | 159 | struct v2f 160 | { 161 | float2 uv : TEXCOORD0; 162 | UNITY_FOG_COORDS(1) 163 | float4 vertex : SV_POSITION; 164 | }; 165 | 166 | sampler2D _MainTex; 167 | float4 _MainTex_ST; 168 | 169 | v2f vert (appdata v) 170 | { 171 | v2f o; 172 | o.vertex = UnityObjectToClipPos(v.vertex); 173 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 174 | UNITY_TRANSFER_FOG(o,o.vertex); 175 | return o; 176 | } 177 | 178 | fixed4 frag (v2f i) : SV_Target 179 | { 180 | // sample the texture 181 | fixed4 col = tex2D(_MainTex, i.uv); 182 | // apply fog 183 | UNITY_APPLY_FOG(i.fogCoord, col); 184 | return col; 185 | } 186 | ENDCG 187 | } 188 | } 189 | } 190 | ``` 191 | 192 | 接下来我们需要添加Instancing开启的编译指令: 193 | 194 | ```c# 195 | #pragma vertex vert 196 | #pragma fragment frag 197 | // make fog work 198 | #pragma multi_compile_fog 199 | // 开启 Instancing支持 200 | #pragma multi_compile_instancing 201 | ``` 202 | 203 | 然后在Shader的Inspector中就会出现 **Enable GPU Instancing** 的选项: 204 | 205 | ![](./images/shader-enable-instancing.png) 206 | 207 | 勾选开启GPU Instancing后,运行程序后会得到一下结果: 208 | 209 | ![](./images/shader_01.png) 210 | 211 | 观察Stats发现渲染处理了5000个Sphere,最终合批为10次DrawCall。但我们却只在场景中观察到了10个Sphere。为什么5000个Sphere在渲染,而场景中只有10个Sphere? 212 | 213 | #### 2.2 UNITY_VERTEX_INPUT_INSTANCE_ID 214 | 215 | 上面的例子中5000个Sphere渲染,而只在场景中看到10个Sphere是因为GPU在处理Instancing的时候如果没有为每个Instancing指定唯一的**Instance_id**,那么GPU就会默认使用第一个。所以同一批次的Sphere都会出现在同一位置。我们修改一下Shader再来测试: 216 | 217 | ```C# 218 | struct appdata 219 | { 220 | UNITY_VERTEX_INPUT_INSTANCE_ID 221 | float4 vertex : POSITION; 222 | float2 uv : TEXCOORD0; 223 | }; 224 | 225 | v2f vert (appdata v) 226 | { 227 | v2f o; 228 | UNITY_SETUP_INSTANCE_ID(v) 229 | o.vertex = UnityObjectToClipPos(v.vertex); 230 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 231 | UNITY_TRANSFER_FOG(o,o.vertex); 232 | return o; 233 | } 234 | ``` 235 | 236 | ![](./images/shader_02.png) 237 | 238 | 修改Shader后渲染结果恢复正常。下面我们来理解一下`UNITY_VERTEX_INPUT_INSTANCE_ID`和`UNITY_SETUP_INSTANCE_ID`。 239 | 240 | Unity中Instancing相关的指令都定义在`Unity安装目录\Editor\Data\CGIncludes\UnityInstancing.cgine`文件中。 241 | 242 | ```c# 243 | //////////////////////////////////////////////////////// 244 | // basic instancing setups 245 | - UNITY_VERTEX_INPUT_INSTANCE_ID //Declare instance ID field in vertex shader input / output struct. 246 | 247 | - UNITY_SETUP_INSTANCE_ID //Should be used at the very beginning of the vertex shader / fragment shader, so that succeeding code can have access to the global unity_InstanceID.Also procedural function is called to setup instance data. 248 | ``` 249 | 250 | **UNITY_VERTEX_INPUT_INSTANCE_ID**:在Shader输入/输出结构体中 声明一个Instance ID。 251 | 252 | **UNITY_SETUP_INSTANCE_ID**:这个宏必须在Vertex Shader或Fragment Shader的一开始就调用,只有调用了这个宏以后,才可以在Shader中通过全局的InstanceID来访问到结构体数据。 253 | 254 | #### 2.3 GPU Instancing Batch Size 255 | 256 | ![](./images/shader_03.png) 257 | 258 | 可以看到单次DrawCall的批次大小是**511**。这里Instancing Batch Size是通过**UNITY_MAX_INSTANCE_COUNT** 来定义的,Unity默认的大小是500。根据运行平台不同,这个最大批次数是变化的。也可以通过下面的指令进行修改: 259 | 260 | ```c# 261 | #pragma instancing_options forcemaxcount:512 262 | ``` 263 | 264 | 把最大批次数改为512,再次运行程序: 265 | 266 | ![](./images/shader_04.png) 267 | 268 | 最大批次已经是512了,那么我们把最大批次修改为513会怎么样? 269 | 270 | ``` 271 | #pragma instancing_options forcemaxcount:513 272 | ``` 273 | 274 | 运行后得到一个报错信息: 275 | 276 | ![](./images/shader_05.png) 277 | 278 | `常量缓冲区UnityInstancing_PerDraw0的大小为 4104个16字节的条目,超过了最大4096个条目。` 279 | 280 | 回到上面Instancing技术实现的说明: 281 | 282 | > 将Per-Instance Data(世界矩阵,颜色等自定义变量)打包成Uniform Array,存储在Instance Constant Buffers中 283 | 284 | Instance Data是存储在 **ConstantBuffers(D3D )/Uniform Buffer Object(OpenGL)**中的,那么也就是说一个批次能处理的Instance数量,取决于 **ConstantBuffers/UBO**的大小和**Instancing 属性**的多少。Windows下D3D的ConstantBuffer大小为**64KB**,那么基于上面的例子我们来算一下: 285 | 286 | ``` 287 | //上面的例子中在shader中将输入的结构体分配了Instance ID,之后Unity会在ConstantBuffers中存储两个矩阵: 288 | // object-to-world : 世界坐标系下的矩阵 world-to-object:用于法线计算的矩阵 289 | // 一个矩阵大小为 64byte 290 | pSize = 64byte x 2 = 128byte 291 | 64KB = 64 x 1024 = 65536byte 292 | max_count = 65536byte / 128byte = 512 293 | 所以批次最大Instance数为 512 294 | ``` 295 | 296 | OpenGl平台中UBO的大小通常只有ConstantBuffer大小的四分之一。 297 | 298 | **这里需要注意的是 UNITY_VERTEX_INPUT_INSTANCE_ID 使用的ConstantBuffer/UBO是单独的`UnityInstancing_PerDraw0`** 299 | 300 | #### 2.4 UNITY_DEFINE_INSTANCED_PROP 301 | 302 | 修改一下Shader和脚本,为Shader添加一个颜色属性,在脚本中动态改变这个颜色值。 303 | 304 | `LightingShader.shader:` 305 | 306 | ```c# 307 | Shader "Copper/LightingShader" 308 | { 309 | Properties 310 | { 311 | _MainTex ("Texture", 2D) = "white" {} 312 | _Color ("Main Color", Color) = (1,1,1,1) 313 | } 314 | SubShader 315 | { 316 | Tags { "RenderType"="Opaque" } 317 | LOD 100 318 | 319 | Pass 320 | { 321 | CGPROGRAM 322 | #pragma vertex vert 323 | #pragma fragment frag 324 | // make fog work 325 | #pragma multi_compile_fog 326 | #pragma multi_compile_instancing 327 | //#pragma instancing_options forcemaxcount:512 328 | 329 | #include "UnityCG.cginc" 330 | 331 | fixed4 _Color; 332 | 333 | struct appdata 334 | { 335 | UNITY_VERTEX_INPUT_INSTANCE_ID 336 | float4 vertex : POSITION; 337 | float2 uv : TEXCOORD0; 338 | }; 339 | 340 | struct v2f 341 | { 342 | float2 uv : TEXCOORD0; 343 | UNITY_FOG_COORDS(1) 344 | float4 vertex : SV_POSITION; 345 | }; 346 | 347 | sampler2D _MainTex; 348 | float4 _MainTex_ST; 349 | 350 | v2f vert (appdata v) 351 | { 352 | v2f o; 353 | UNITY_SETUP_INSTANCE_ID(v) 354 | o.vertex = UnityObjectToClipPos(v.vertex); 355 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 356 | UNITY_TRANSFER_FOG(o,o.vertex); 357 | return o; 358 | } 359 | 360 | fixed4 frag (v2f i) : SV_Target 361 | { 362 | // sample the texture 363 | fixed4 col = tex2D(_MainTex, i.uv); 364 | // apply fog 365 | UNITY_APPLY_FOG(i.fogCoord, col); 366 | return col*_Color; 367 | } 368 | ENDCG 369 | } 370 | } 371 | } 372 | 373 | ``` 374 | 375 | `GPUInstancing.cs:` 376 | 377 | ```c# 378 | using System.Collections; 379 | using System.Collections.Generic; 380 | using UnityEngine; 381 | 382 | public class GPUInstancing : MonoBehaviour 383 | { 384 | 385 | public Transform prefab; 386 | 387 | public int instances = 5000; 388 | 389 | public float radius = 50f; 390 | 391 | void Start() 392 | { 393 | MaterialPropertyBlock properties = new MaterialPropertyBlock(); 394 | for (int i = 0; i < instances; i++) 395 | { 396 | Transform t = Instantiate(prefab); 397 | t.localPosition = Random.insideUnitSphere * radius; 398 | t.SetParent(transform); 399 | 400 | properties.SetColor("_Color", new Color(Random.value, Random.value, Random.value)); 401 | t.GetComponent().SetPropertyBlock(properties); 402 | } 403 | } 404 | } 405 | ``` 406 | 407 | 运行程序,观察GPUInstancing是否还有作用: 408 | 409 | ![](./images/shader_06.png) 410 | 411 | GPUInstancing无效了,很多时候我们是需要在Shader中定义一些属性供游戏运行时动态改变的。但在GPUInstancing阶段,如果没有给这些属性创建InstanceID的话,那么就无法成功合批。 412 | 413 | 修改`LightingShader.shader:` 414 | 415 | ```c# 416 | Shader "Copper/LightingShader" 417 | { 418 | Properties 419 | { 420 | _MainTex ("Texture", 2D) = "white" {} 421 | _Color ("Main Color", Color) = (1,1,1,1) 422 | } 423 | SubShader 424 | { 425 | Tags { "RenderType"="Opaque" } 426 | LOD 100 427 | 428 | Pass 429 | { 430 | CGPROGRAM 431 | #pragma vertex vert 432 | #pragma fragment frag 433 | // make fog work 434 | #pragma multi_compile_fog 435 | #pragma multi_compile_instancing 436 | //#pragma instancing_options forcemaxcount:512 437 | 438 | #include "UnityCG.cginc" 439 | 440 | //fixed4 _Color; 441 | 442 | struct appdata 443 | { 444 | UNITY_VERTEX_INPUT_INSTANCE_ID 445 | float4 vertex : POSITION; 446 | float2 uv : TEXCOORD0; 447 | }; 448 | 449 | struct v2f 450 | { 451 | float2 uv : TEXCOORD0; 452 | UNITY_FOG_COORDS(1) 453 | float4 vertex : SV_POSITION; 454 | }; 455 | 456 | sampler2D _MainTex; 457 | float4 _MainTex_ST; 458 | 459 | UNITY_INSTANCING_BUFFER_START(Props) 460 | UNITY_DEFINE_INSTANCED_PROP(float4, _Color) 461 | UNITY_INSTANCING_BUFFER_END(Props) 462 | 463 | v2f vert (appdata v) 464 | { 465 | v2f o; 466 | UNITY_SETUP_INSTANCE_ID(v) 467 | o.vertex = UnityObjectToClipPos(v.vertex); 468 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 469 | UNITY_TRANSFER_FOG(o,o.vertex); 470 | return o; 471 | } 472 | 473 | fixed4 frag (v2f i) : SV_Target 474 | { 475 | // sample the texture 476 | fixed4 col = tex2D(_MainTex, i.uv); 477 | // apply fog 478 | UNITY_APPLY_FOG(i.fogCoord, col); 479 | //return col*_Color; 480 | return col * UNITY_ACCESS_INSTANCED_PROP(Props, _Color); 481 | } 482 | ENDCG 483 | } 484 | } 485 | } 486 | ``` 487 | 488 | ![](./images/shader_07.png) 489 | 490 | 结果成功合批。 491 | 492 | **UNITY_INSTANCING_CBUFFER_START(name) / UNITY_INSTANCING_CBUFFER_END** 493 | 494 | 每个Instance独有的属性必须定义在一个遵循特殊命名规则的Constant Buffer中。使用这对宏来定义这些Constant Buffer。“name”参数可以是任意字符串。 495 | 496 | **UNITY_DEFINE_INSTANCED_PROP(float4, _Color)** 497 | 498 | 定义一个具有特定类型和名字的每个Instance独有的Shader属性。这个宏实际会定义一个Uniform数组。 499 | 500 | **UNITY_ACCESS_INSTANCED_PROP(_Color)** 501 | 502 | 访问每个Instance独有的属性。这个宏会使用Instance ID作为索引到Uniform数组中去取当前Instance对应的数据。 503 | 504 | **这里需要注意的是 UNITY_DEFINE_INSTANCED_PROP使用的ConstantBuffer/UBO是单独的`UnityInstancing_Props`。** 505 | 506 | 所以合批上限是由**UnityInstancing_PerDraw0**和**UnityInstancing_Props**两个常量缓冲区同时决定的。 507 | 508 | 509 | 510 | 参考: 511 | 512 | > https://docs.unity3d.com/Manual/GPUInstancing.html 513 | > 514 | > https://catlikecoding.com/unity/tutorials/rendering/part-19/ 515 | > 516 | > https://learnopengl.com/Advanced-OpenGL/Instancing 517 | 518 | -------------------------------------------------------------------------------- /UnityGPUInstancing/Assembly-CSharp.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | latest 5 | 6 | 7 | Debug 8 | AnyCPU 9 | 10.0.20506 10 | 2.0 11 | 12 | {8B507BCE-C1DF-0802-BD3E-1F3724F79110} 13 | Library 14 | Properties 15 | Assembly-CSharp 16 | v4.7.1 17 | 512 18 | . 19 | 20 | 21 | true 22 | full 23 | false 24 | Temp\bin\Debug\ 25 | DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_3_2;UNITY_2018_3;UNITY_2018;PLATFORM_ARCH_64;UNITY_64;UNITY_INCLUDE_TESTS;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_STANDALONE_WIN;PLATFORM_STANDALONE;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_EVENT_QUEUE;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_VR;ENABLE_AR;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_STANDARD_2_0;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER 26 | prompt 27 | 4 28 | 0169 29 | False 30 | 31 | 32 | pdbonly 33 | true 34 | Temp\bin\Release\ 35 | prompt 36 | 4 37 | 0169 38 | False 39 | 40 | 41 | true 42 | true 43 | false 44 | false 45 | false 46 | 47 | 48 | {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 49 | Unity/VSTU 50 | Game:1 51 | StandaloneWindows64:19 52 | 2018.3.2f1 53 | 54 | 55 | 56 | F:\Program Files\Unity\Editor\Data\Managed/UnityEngine/UnityEngine.dll 57 | 58 | 59 | F:\Program Files\Unity\Editor\Data\Managed/UnityEditor.dll 60 | 61 | 62 | 63 | 64 | 65 | 66 | I:/Code/GPUInstancing/Unity-GPU-Instancing/UnityGPUInstancing/Library/ScriptAssemblies/Unity.TextMeshPro.Editor.dll 67 | 68 | 69 | I:/Code/GPUInstancing/Unity-GPU-Instancing/UnityGPUInstancing/Library/ScriptAssemblies/Unity.PackageManagerUI.Editor.dll 70 | 71 | 72 | I:/Code/GPUInstancing/Unity-GPU-Instancing/UnityGPUInstancing/Library/ScriptAssemblies/Unity.CollabProxy.Editor.dll 73 | 74 | 75 | I:/Code/GPUInstancing/Unity-GPU-Instancing/UnityGPUInstancing/Library/ScriptAssemblies/Unity.TextMeshPro.dll 76 | 77 | 78 | I:/Code/GPUInstancing/Unity-GPU-Instancing/UnityGPUInstancing/Library/ScriptAssemblies/Unity.Analytics.DataPrivacy.dll 79 | 80 | 81 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.AIModule.dll 82 | 83 | 84 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.ARModule.dll 85 | 86 | 87 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.AccessibilityModule.dll 88 | 89 | 90 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.AnimationModule.dll 91 | 92 | 93 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.AssetBundleModule.dll 94 | 95 | 96 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.AudioModule.dll 97 | 98 | 99 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.BaselibModule.dll 100 | 101 | 102 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.ClothModule.dll 103 | 104 | 105 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterInputModule.dll 106 | 107 | 108 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll 109 | 110 | 111 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.CoreModule.dll 112 | 113 | 114 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.CrashReportingModule.dll 115 | 116 | 117 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.DirectorModule.dll 118 | 119 | 120 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll 121 | 122 | 123 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.GameCenterModule.dll 124 | 125 | 126 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.GridModule.dll 127 | 128 | 129 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.HotReloadModule.dll 130 | 131 | 132 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.IMGUIModule.dll 133 | 134 | 135 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.ImageConversionModule.dll 136 | 137 | 138 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.InputModule.dll 139 | 140 | 141 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll 142 | 143 | 144 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.LocalizationModule.dll 145 | 146 | 147 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll 148 | 149 | 150 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll 151 | 152 | 153 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.PhysicsModule.dll 154 | 155 | 156 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.Physics2DModule.dll 157 | 158 | 159 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.ProfilerModule.dll 160 | 161 | 162 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll 163 | 164 | 165 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll 166 | 167 | 168 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll 169 | 170 | 171 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll 172 | 173 | 174 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.StreamingModule.dll 175 | 176 | 177 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll 178 | 179 | 180 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.SubstanceModule.dll 181 | 182 | 183 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.TLSModule.dll 184 | 185 | 186 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainModule.dll 187 | 188 | 189 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll 190 | 191 | 192 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.TextCoreModule.dll 193 | 194 | 195 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.TextRenderingModule.dll 196 | 197 | 198 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.TilemapModule.dll 199 | 200 | 201 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.TimelineModule.dll 202 | 203 | 204 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.UIModule.dll 205 | 206 | 207 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.UIElementsModule.dll 208 | 209 | 210 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.UNETModule.dll 211 | 212 | 213 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.UmbraModule.dll 214 | 215 | 216 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll 217 | 218 | 219 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.UnityConnectModule.dll 220 | 221 | 222 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.UnityTestProtocolModule.dll 223 | 224 | 225 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll 226 | 227 | 228 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll 229 | 230 | 231 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll 232 | 233 | 234 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll 235 | 236 | 237 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll 238 | 239 | 240 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.VFXModule.dll 241 | 242 | 243 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.VRModule.dll 244 | 245 | 246 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.VehiclesModule.dll 247 | 248 | 249 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.VideoModule.dll 250 | 251 | 252 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.WindModule.dll 253 | 254 | 255 | F:/Program Files/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.XRModule.dll 256 | 257 | 258 | F:/Program Files/Unity/Editor/Data/Managed/Unity.Locator.dll 259 | 260 | 261 | F:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll 262 | 263 | 264 | F:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TestRunner/UnityEngine.TestRunner.dll 265 | 266 | 267 | F:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/TestRunner/net35/unity-custom/nunit.framework.dll 268 | 269 | 270 | F:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll 271 | 272 | 273 | F:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll 274 | 275 | 276 | F:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll 277 | 278 | 279 | F:/Program Files/Unity/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll 280 | 281 | 282 | I:/Code/GPUInstancing/Unity-GPU-Instancing/UnityGPUInstancing/Library/PackageCache/com.unity.analytics@3.2.2/Unity.Analytics.Editor.dll 283 | 284 | 285 | I:/Code/GPUInstancing/Unity-GPU-Instancing/UnityGPUInstancing/Library/PackageCache/com.unity.analytics@3.2.2/Unity.Analytics.StandardEvents.dll 286 | 287 | 288 | I:/Code/GPUInstancing/Unity-GPU-Instancing/UnityGPUInstancing/Library/PackageCache/com.unity.analytics@3.2.2/Unity.Analytics.Tracker.dll 289 | 290 | 291 | F:/Program Files/Unity/Editor/Data/NetStandard/ref/2.0.0/netstandard.dll 292 | 293 | 294 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/Microsoft.Win32.Primitives.dll 295 | 296 | 297 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.AppContext.dll 298 | 299 | 300 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Collections.Concurrent.dll 301 | 302 | 303 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Collections.dll 304 | 305 | 306 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Collections.NonGeneric.dll 307 | 308 | 309 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Collections.Specialized.dll 310 | 311 | 312 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.ComponentModel.dll 313 | 314 | 315 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.ComponentModel.EventBasedAsync.dll 316 | 317 | 318 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.ComponentModel.Primitives.dll 319 | 320 | 321 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.ComponentModel.TypeConverter.dll 322 | 323 | 324 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Console.dll 325 | 326 | 327 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Data.Common.dll 328 | 329 | 330 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.Contracts.dll 331 | 332 | 333 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.Debug.dll 334 | 335 | 336 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.FileVersionInfo.dll 337 | 338 | 339 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.Process.dll 340 | 341 | 342 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.StackTrace.dll 343 | 344 | 345 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.TextWriterTraceListener.dll 346 | 347 | 348 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.Tools.dll 349 | 350 | 351 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.TraceSource.dll 352 | 353 | 354 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.Tracing.dll 355 | 356 | 357 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Drawing.Primitives.dll 358 | 359 | 360 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Dynamic.Runtime.dll 361 | 362 | 363 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Globalization.Calendars.dll 364 | 365 | 366 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Globalization.dll 367 | 368 | 369 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Globalization.Extensions.dll 370 | 371 | 372 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.Compression.dll 373 | 374 | 375 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.Compression.ZipFile.dll 376 | 377 | 378 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.dll 379 | 380 | 381 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.FileSystem.dll 382 | 383 | 384 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.FileSystem.DriveInfo.dll 385 | 386 | 387 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.FileSystem.Primitives.dll 388 | 389 | 390 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.FileSystem.Watcher.dll 391 | 392 | 393 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.IsolatedStorage.dll 394 | 395 | 396 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.MemoryMappedFiles.dll 397 | 398 | 399 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.Pipes.dll 400 | 401 | 402 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.UnmanagedMemoryStream.dll 403 | 404 | 405 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Linq.dll 406 | 407 | 408 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Linq.Expressions.dll 409 | 410 | 411 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Linq.Parallel.dll 412 | 413 | 414 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Linq.Queryable.dll 415 | 416 | 417 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.Http.dll 418 | 419 | 420 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.NameResolution.dll 421 | 422 | 423 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.NetworkInformation.dll 424 | 425 | 426 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.Ping.dll 427 | 428 | 429 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.Primitives.dll 430 | 431 | 432 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.Requests.dll 433 | 434 | 435 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.Security.dll 436 | 437 | 438 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.Sockets.dll 439 | 440 | 441 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.WebHeaderCollection.dll 442 | 443 | 444 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.WebSockets.Client.dll 445 | 446 | 447 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.WebSockets.dll 448 | 449 | 450 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.ObjectModel.dll 451 | 452 | 453 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Reflection.dll 454 | 455 | 456 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Reflection.Extensions.dll 457 | 458 | 459 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Reflection.Primitives.dll 460 | 461 | 462 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Resources.Reader.dll 463 | 464 | 465 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Resources.ResourceManager.dll 466 | 467 | 468 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Resources.Writer.dll 469 | 470 | 471 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.CompilerServices.VisualC.dll 472 | 473 | 474 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.dll 475 | 476 | 477 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Extensions.dll 478 | 479 | 480 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Handles.dll 481 | 482 | 483 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.InteropServices.dll 484 | 485 | 486 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.InteropServices.RuntimeInformation.dll 487 | 488 | 489 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Numerics.dll 490 | 491 | 492 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Serialization.Formatters.dll 493 | 494 | 495 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Serialization.Json.dll 496 | 497 | 498 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Serialization.Primitives.dll 499 | 500 | 501 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Serialization.Xml.dll 502 | 503 | 504 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Claims.dll 505 | 506 | 507 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Cryptography.Algorithms.dll 508 | 509 | 510 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Cryptography.Csp.dll 511 | 512 | 513 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Cryptography.Encoding.dll 514 | 515 | 516 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Cryptography.Primitives.dll 517 | 518 | 519 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Cryptography.X509Certificates.dll 520 | 521 | 522 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Principal.dll 523 | 524 | 525 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.SecureString.dll 526 | 527 | 528 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Text.Encoding.dll 529 | 530 | 531 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Text.Encoding.Extensions.dll 532 | 533 | 534 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Text.RegularExpressions.dll 535 | 536 | 537 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.dll 538 | 539 | 540 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.Overlapped.dll 541 | 542 | 543 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.Tasks.dll 544 | 545 | 546 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.Tasks.Parallel.dll 547 | 548 | 549 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.Thread.dll 550 | 551 | 552 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.ThreadPool.dll 553 | 554 | 555 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.Timer.dll 556 | 557 | 558 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.ValueTuple.dll 559 | 560 | 561 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Xml.ReaderWriter.dll 562 | 563 | 564 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Xml.XDocument.dll 565 | 566 | 567 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Xml.XmlDocument.dll 568 | 569 | 570 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Xml.XmlSerializer.dll 571 | 572 | 573 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Xml.XPath.dll 574 | 575 | 576 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Xml.XPath.XDocument.dll 577 | 578 | 579 | F:/Program Files/Unity/Editor/Data/NetStandard/Extensions/2.0.0/System.Numerics.Vectors.dll 580 | 581 | 582 | F:/Program Files/Unity/Editor/Data/NetStandard/Extensions/2.0.0/System.Runtime.InteropServices.WindowsRuntime.dll 583 | 584 | 585 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/mscorlib.dll 586 | 587 | 588 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.ComponentModel.Composition.dll 589 | 590 | 591 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Core.dll 592 | 593 | 594 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Data.dll 595 | 596 | 597 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.dll 598 | 599 | 600 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Drawing.dll 601 | 602 | 603 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.IO.Compression.FileSystem.dll 604 | 605 | 606 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Net.dll 607 | 608 | 609 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Numerics.dll 610 | 611 | 612 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Runtime.Serialization.dll 613 | 614 | 615 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.ServiceModel.Web.dll 616 | 617 | 618 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Transactions.dll 619 | 620 | 621 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Web.dll 622 | 623 | 624 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Windows.dll 625 | 626 | 627 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Xml.dll 628 | 629 | 630 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Xml.Linq.dll 631 | 632 | 633 | F:/Program Files/Unity/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Xml.Serialization.dll 634 | 635 | 636 | 637 | 638 | 645 | --------------------------------------------------------------------------------