From 5eb961ae8ab454a194aa3a65c55349661f4b0132 Mon Sep 17 00:00:00 2001 From: Jo Date: Wed, 7 Aug 2024 01:40:32 +0200 Subject: [PATCH] chore: add MarrowSDK plugin Signed-off-by: Jo --- Assets/AddressableAssetsData.meta | 8 + .../AddressableAssetSettings.asset | 182 + .../AddressableAssetSettings.asset.meta | 8 + .../AddressableAssetsData/DefaultObject.asset | 15 + .../DefaultObject.asset.meta | 8 + Assets/SLZShaders.meta | 8 + Assets/SLZShaders/.GUIDList.txt | 39 + Assets/SLZShaders/.sample.json | 5 + Assets/SLZShaders/BonelabSky.meta | 8 + Assets/SLZShaders/BonelabSky/README.txt | 13 + Assets/SLZShaders/BonelabSky/README.txt.meta | 7 + Assets/SLZShaders/BonelabSky/materials.meta | 8 + .../BonelabSky/materials/Sky_Example.mat | 94 + .../BonelabSky/materials/Sky_Example.mat.meta | 8 + Assets/SLZShaders/BonelabSky/meshes.meta | 8 + .../BonelabSky/meshes/Sky_Mesh.asset | 167 + .../BonelabSky/meshes/Sky_Mesh.asset.meta | 8 + Assets/SLZShaders/BonelabSky/prefabs.meta | 8 + .../BonelabSky/prefabs/Sky_Prefab.prefab | 85 + .../BonelabSky/prefabs/Sky_Prefab.prefab.meta | 7 + Assets/SLZShaders/BonelabSky/shaders.meta | 8 + .../BonelabSky/shaders/Sky_Far.shader | 122 + .../BonelabSky/shaders/Sky_Far.shader.meta | 10 + Assets/SLZShaders/BonelabSky/textures.meta | 8 + .../BonelabSky/textures/ProtoSky.png | Bin 0 -> 74918 bytes .../BonelabSky/textures/ProtoSky.png.meta | 138 + Assets/SLZShaders/Fluorescence.shader | 3325 ++++++++++++++ Assets/SLZShaders/Fluorescence.shader.meta | 10 + Assets/SLZShaders/ForceField.shader | 2397 ++++++++++ Assets/SLZShaders/ForceField.shader.meta | 10 + Assets/SLZShaders/Include.meta | 8 + Assets/SLZShaders/Include/Particle.meta | 8 + .../Include/Particle/ShaderInjector.meta | 8 + .../Include/Particle/ShaderInjector/Base.meta | 8 + .../ShaderInjector/Base/Base_Particle.hlsl | 152 + .../Base/Base_Particle.hlsl.meta | 7 + .../Particle/ShaderInjector/Injections.meta | 8 + .../Injection_Particle_SoftBlend.hlsl | 42 + .../Injection_Particle_SoftBlend.hlsl.meta | 7 + .../Injection_Particle_screenspaceUVs.hlsl | 4 + ...njection_Particle_screenspaceUVs.hlsl.meta | 7 + .../Injections/Injection_Torch.hlsl | 39 + .../Injections/Injection_Torch.hlsl.meta | 7 + .../ShaderInjector/ParticleBasic.asset | 17 + .../ShaderInjector/ParticleBasic.asset.meta | 8 + .../ShaderInjector/ParticleBasic.hlsl | 128 + .../ShaderInjector/ParticleBasic.hlsl.meta | 7 + .../ShaderInjector/ParticleSoft.asset | 19 + .../ShaderInjector/ParticleSoft.asset.meta | 8 + .../Particle/ShaderInjector/ParticleSoft.hlsl | 175 + .../ShaderInjector/ParticleSoft.hlsl.meta | 7 + .../ShaderInjector/ParticleTorch.asset | 20 + .../ShaderInjector/ParticleTorch.asset.meta | 8 + .../ShaderInjector/ParticleTorch.hlsl | 200 + .../ShaderInjector/ParticleTorch.hlsl.meta | 7 + .../Particle/amplify_billboard_injector.hlsl | 1 + .../amplify_billboard_injector.hlsl.meta | 7 + .../amplify_billboard_injector_flare.hlsl | 1 + ...amplify_billboard_injector_flare.hlsl.meta | 7 + .../Include/Particle/billboard.hlsl | 94 + .../Include/Particle/billboard.hlsl.meta | 7 + .../SLZShaders/Include/PlatformSamplers.hlsl | 16 + .../Include/PlatformSamplers.hlsl.meta | 7 + Assets/SLZShaders/Include/Triplanar.hlsl | 95 + Assets/SLZShaders/Include/Triplanar.hlsl.meta | 7 + Assets/SLZShaders/Mod2x.shader | 225 + Assets/SLZShaders/Mod2x.shader.meta | 10 + Assets/SLZShaders/NullShader.shader | 3426 ++++++++++++++ Assets/SLZShaders/NullShader.shader.meta | 12 + Assets/SLZShaders/OpaqueHologram.shader | 3321 ++++++++++++++ Assets/SLZShaders/OpaqueHologram.shader.meta | 10 + Assets/SLZShaders/ParallaxCubeMap.shader | 3515 ++++++++++++++ Assets/SLZShaders/ParallaxCubeMap.shader.meta | 10 + Assets/SLZShaders/SLZ-Laser.shader | 2104 +++++++++ Assets/SLZShaders/SLZ-Laser.shader.meta | 10 + Assets/SLZShaders/SLZAnime.shader | 2573 +++++++++++ Assets/SLZShaders/SLZAnime.shader.meta | 18 + Assets/SLZShaders/Scanline.shader | 3315 ++++++++++++++ Assets/SLZShaders/Scanline.shader.meta | 10 + Assets/SLZShaders/SimpleSkybox.shader | 1786 ++++++++ Assets/SLZShaders/SimpleSkybox.shader.meta | 10 + .../SLZShaders/TMP_SDF-URP Lit Baked.shader | 4027 +++++++++++++++++ .../TMP_SDF-URP Lit Baked.shader.meta | 10 + Assets/SLZShaders/Textures.meta | 8 + Assets/SLZShaders/Textures/BloodyHitRamp.png | Bin 0 -> 47324 bytes .../Textures/BloodyHitRamp.png.meta | 138 + Assets/SLZShaders/Textures/Pixels_crt-01.png | Bin 0 -> 35801 bytes .../Textures/Pixels_crt-01.png.meta | 126 + .../Textures/ToonRamp_SSS_strokes_Cleaned.psd | Bin 0 -> 1372860 bytes .../ToonRamp_SSS_strokes_Cleaned.psd.meta | 138 + Assets/SLZShaders/Textures/metalHitRamp.png | Bin 0 -> 137897 bytes .../SLZShaders/Textures/metalHitRamp.png.meta | 126 + Assets/SLZShaders/VR_MotionVectorLit.shader | 3465 ++++++++++++++ .../SLZShaders/VR_MotionVectorLit.shader.meta | 10 + .../SLZShaders/VR_MotionVectorOpaque.shader | 3334 ++++++++++++++ .../VR_MotionVectorOpaque.shader.meta | 10 + .../VR_particleMotionVector_nonAmp.shader | 819 ++++ ...VR_particleMotionVector_nonAmp.shader.meta | 10 + ...niversalRenderPipelineGlobalSettings.asset | 27 + ...salRenderPipelineGlobalSettings.asset.meta | 8 + Assets/XR.meta | 8 + Assets/XR/Loaders.meta | 8 + Assets/XR/Loaders/Mock HMD Loader.asset | 14 + Assets/XR/Loaders/Mock HMD Loader.asset.meta | 8 + Assets/XR/Loaders/Oculus Loader.asset | 14 + Assets/XR/Loaders/Oculus Loader.asset.meta | 8 + Assets/XR/Settings.meta | 8 + .../XR/Settings/Mock HMD Build Settings.asset | 15 + .../Mock HMD Build Settings.asset.meta | 8 + Assets/XR/Settings/Oculus Settings.asset | 32 + Assets/XR/Settings/Oculus Settings.asset.meta | 8 + Assets/_MarrowAssets.meta | 8 + Assets/_MarrowAssets/Settings.meta | 8 + .../Settings/TextureStreamSettings.asset | 15 + .../Settings/TextureStreamSettings.asset.meta | 8 + ProjectSettings/ShaderGraphSettings.asset | 16 + ProjectSettings/TimelineSettings.asset | 16 + ProjectSettings/URPProjectSettings.asset | 15 + ProjectSettings/XRPackageSettings.asset | 5 + 119 files changed, 40706 insertions(+) create mode 100644 Assets/AddressableAssetsData.meta create mode 100644 Assets/AddressableAssetsData/AddressableAssetSettings.asset create mode 100644 Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta create mode 100644 Assets/AddressableAssetsData/DefaultObject.asset create mode 100644 Assets/AddressableAssetsData/DefaultObject.asset.meta create mode 100644 Assets/SLZShaders.meta create mode 100644 Assets/SLZShaders/.GUIDList.txt create mode 100644 Assets/SLZShaders/.sample.json create mode 100644 Assets/SLZShaders/BonelabSky.meta create mode 100644 Assets/SLZShaders/BonelabSky/README.txt create mode 100644 Assets/SLZShaders/BonelabSky/README.txt.meta create mode 100644 Assets/SLZShaders/BonelabSky/materials.meta create mode 100644 Assets/SLZShaders/BonelabSky/materials/Sky_Example.mat create mode 100644 Assets/SLZShaders/BonelabSky/materials/Sky_Example.mat.meta create mode 100644 Assets/SLZShaders/BonelabSky/meshes.meta create mode 100644 Assets/SLZShaders/BonelabSky/meshes/Sky_Mesh.asset create mode 100644 Assets/SLZShaders/BonelabSky/meshes/Sky_Mesh.asset.meta create mode 100644 Assets/SLZShaders/BonelabSky/prefabs.meta create mode 100644 Assets/SLZShaders/BonelabSky/prefabs/Sky_Prefab.prefab create mode 100644 Assets/SLZShaders/BonelabSky/prefabs/Sky_Prefab.prefab.meta create mode 100644 Assets/SLZShaders/BonelabSky/shaders.meta create mode 100644 Assets/SLZShaders/BonelabSky/shaders/Sky_Far.shader create mode 100644 Assets/SLZShaders/BonelabSky/shaders/Sky_Far.shader.meta create mode 100644 Assets/SLZShaders/BonelabSky/textures.meta create mode 100644 Assets/SLZShaders/BonelabSky/textures/ProtoSky.png create mode 100644 Assets/SLZShaders/BonelabSky/textures/ProtoSky.png.meta create mode 100644 Assets/SLZShaders/Fluorescence.shader create mode 100644 Assets/SLZShaders/Fluorescence.shader.meta create mode 100644 Assets/SLZShaders/ForceField.shader create mode 100644 Assets/SLZShaders/ForceField.shader.meta create mode 100644 Assets/SLZShaders/Include.meta create mode 100644 Assets/SLZShaders/Include/Particle.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/Base.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/Base/Base_Particle.hlsl create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/Base/Base_Particle.hlsl.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/Injections.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_SoftBlend.hlsl create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_SoftBlend.hlsl.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_screenspaceUVs.hlsl create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_screenspaceUVs.hlsl.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Torch.hlsl create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Torch.hlsl.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.asset create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.asset.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.hlsl create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.hlsl.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.asset create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.asset.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.hlsl create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.hlsl.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.asset create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.asset.meta create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.hlsl create mode 100644 Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.hlsl.meta create mode 100644 Assets/SLZShaders/Include/Particle/amplify_billboard_injector.hlsl create mode 100644 Assets/SLZShaders/Include/Particle/amplify_billboard_injector.hlsl.meta create mode 100644 Assets/SLZShaders/Include/Particle/amplify_billboard_injector_flare.hlsl create mode 100644 Assets/SLZShaders/Include/Particle/amplify_billboard_injector_flare.hlsl.meta create mode 100644 Assets/SLZShaders/Include/Particle/billboard.hlsl create mode 100644 Assets/SLZShaders/Include/Particle/billboard.hlsl.meta create mode 100644 Assets/SLZShaders/Include/PlatformSamplers.hlsl create mode 100644 Assets/SLZShaders/Include/PlatformSamplers.hlsl.meta create mode 100644 Assets/SLZShaders/Include/Triplanar.hlsl create mode 100644 Assets/SLZShaders/Include/Triplanar.hlsl.meta create mode 100644 Assets/SLZShaders/Mod2x.shader create mode 100644 Assets/SLZShaders/Mod2x.shader.meta create mode 100644 Assets/SLZShaders/NullShader.shader create mode 100644 Assets/SLZShaders/NullShader.shader.meta create mode 100644 Assets/SLZShaders/OpaqueHologram.shader create mode 100644 Assets/SLZShaders/OpaqueHologram.shader.meta create mode 100644 Assets/SLZShaders/ParallaxCubeMap.shader create mode 100644 Assets/SLZShaders/ParallaxCubeMap.shader.meta create mode 100644 Assets/SLZShaders/SLZ-Laser.shader create mode 100644 Assets/SLZShaders/SLZ-Laser.shader.meta create mode 100644 Assets/SLZShaders/SLZAnime.shader create mode 100644 Assets/SLZShaders/SLZAnime.shader.meta create mode 100644 Assets/SLZShaders/Scanline.shader create mode 100644 Assets/SLZShaders/Scanline.shader.meta create mode 100644 Assets/SLZShaders/SimpleSkybox.shader create mode 100644 Assets/SLZShaders/SimpleSkybox.shader.meta create mode 100644 Assets/SLZShaders/TMP_SDF-URP Lit Baked.shader create mode 100644 Assets/SLZShaders/TMP_SDF-URP Lit Baked.shader.meta create mode 100644 Assets/SLZShaders/Textures.meta create mode 100644 Assets/SLZShaders/Textures/BloodyHitRamp.png create mode 100644 Assets/SLZShaders/Textures/BloodyHitRamp.png.meta create mode 100644 Assets/SLZShaders/Textures/Pixels_crt-01.png create mode 100644 Assets/SLZShaders/Textures/Pixels_crt-01.png.meta create mode 100644 Assets/SLZShaders/Textures/ToonRamp_SSS_strokes_Cleaned.psd create mode 100644 Assets/SLZShaders/Textures/ToonRamp_SSS_strokes_Cleaned.psd.meta create mode 100644 Assets/SLZShaders/Textures/metalHitRamp.png create mode 100644 Assets/SLZShaders/Textures/metalHitRamp.png.meta create mode 100644 Assets/SLZShaders/VR_MotionVectorLit.shader create mode 100644 Assets/SLZShaders/VR_MotionVectorLit.shader.meta create mode 100644 Assets/SLZShaders/VR_MotionVectorOpaque.shader create mode 100644 Assets/SLZShaders/VR_MotionVectorOpaque.shader.meta create mode 100644 Assets/SLZShaders/VR_particleMotionVector_nonAmp.shader create mode 100644 Assets/SLZShaders/VR_particleMotionVector_nonAmp.shader.meta create mode 100644 Assets/UniversalRenderPipelineGlobalSettings.asset create mode 100644 Assets/UniversalRenderPipelineGlobalSettings.asset.meta create mode 100644 Assets/XR.meta create mode 100644 Assets/XR/Loaders.meta create mode 100644 Assets/XR/Loaders/Mock HMD Loader.asset create mode 100644 Assets/XR/Loaders/Mock HMD Loader.asset.meta create mode 100644 Assets/XR/Loaders/Oculus Loader.asset create mode 100644 Assets/XR/Loaders/Oculus Loader.asset.meta create mode 100644 Assets/XR/Settings.meta create mode 100644 Assets/XR/Settings/Mock HMD Build Settings.asset create mode 100644 Assets/XR/Settings/Mock HMD Build Settings.asset.meta create mode 100644 Assets/XR/Settings/Oculus Settings.asset create mode 100644 Assets/XR/Settings/Oculus Settings.asset.meta create mode 100644 Assets/_MarrowAssets.meta create mode 100644 Assets/_MarrowAssets/Settings.meta create mode 100644 Assets/_MarrowAssets/Settings/TextureStreamSettings.asset create mode 100644 Assets/_MarrowAssets/Settings/TextureStreamSettings.asset.meta create mode 100644 ProjectSettings/ShaderGraphSettings.asset create mode 100644 ProjectSettings/TimelineSettings.asset create mode 100644 ProjectSettings/URPProjectSettings.asset create mode 100644 ProjectSettings/XRPackageSettings.asset diff --git a/Assets/AddressableAssetsData.meta b/Assets/AddressableAssetsData.meta new file mode 100644 index 0000000..fee1aca --- /dev/null +++ b/Assets/AddressableAssetsData.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ddd48b4097b0b2b4a9e2624e21715d1a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/AddressableAssetSettings.asset b/Assets/AddressableAssetsData/AddressableAssetSettings.asset new file mode 100644 index 0000000..90600f7 --- /dev/null +++ b/Assets/AddressableAssetsData/AddressableAssetSettings.asset @@ -0,0 +1,182 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 468a46d0ae32c3544b7d98094e6448a9, type: 3} + m_Name: AddressableAssetSettings + m_EditorClassIdentifier: + m_DefaultGroup: 4d882dacb0cf54c449d94345cde2d533 + m_currentHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_OptimizeCatalogSize: 0 + m_BuildRemoteCatalog: 0 + m_BundleLocalCatalog: 0 + m_CatalogRequestsTimeout: 0 + m_DisableCatalogUpdateOnStart: 0 + m_IgnoreUnsupportedFilesInBuild: 1 + m_UniqueBundleIds: 0 + m_NonRecursiveBuilding: 1 + m_CCDEnabled: 0 + m_maxConcurrentWebRequests: 3 + m_ContiguousBundles: 1 + m_StripUnityVersionFromBundleBuild: 0 + m_DisableVisibleSubAssetRepresentations: 0 + m_ShaderBundleNaming: 2 + m_ShaderBundleCustomNaming: PALLET_NAME_HERE + m_MonoScriptBundleNaming: 3 + m_CheckForContentUpdateRestrictionsOption: 0 + m_MonoScriptBundleCustomNaming: MARROW + m_RemoteCatalogBuildPath: + m_Id: f03d2a55457fa6e4f8d499c42217628e + m_RemoteCatalogLoadPath: + m_Id: c379e54b5a3413b4e95ede99b7df5856 + m_ContentStateBuildPathProfileVariableName: + m_CustomContentStateBuildPath: + m_ContentStateBuildPath: + m_BuildAddressablesWithPlayerBuild: 2 + m_overridePlayerVersion: + m_GroupAssets: + - {fileID: 11400000, guid: 8b5ee8ae1bae6794692e05c65f209650, type: 2} + m_BuildSettings: + m_CompileScriptsInVirtualMode: 0 + m_CleanupStreamingAssetsAfterBuilds: 1 + m_LogResourceManagerExceptions: 1 + m_BundleBuildPath: Temp/com.unity.addressables/AssetBundles + m_ProfileSettings: + m_Profiles: + - m_InheritedParent: + m_Id: 2056c22079b11ce478d338f3f85afa99 + m_ProfileName: Default + m_Values: + - m_Id: 4b5be2a9894728a48b3be114e9cab1d3 + m_Value: '[UnityEditor.EditorUserBuildSettings.activeBuildTarget]' + - m_Id: cd46b6cc1cd9bb3468de6ffa0c95ecc0 + m_Value: '[UnityEngine.AddressableAssets.Addressables.BuildPath]/[BuildTarget]' + - m_Id: f61512461f3fbb64bb882a6af52b8090 + m_Value: '{UnityEngine.AddressableAssets.Addressables.RuntimePath}/[BuildTarget]' + - m_Id: f03d2a55457fa6e4f8d499c42217628e + m_Value: ServerData/[BuildTarget] + - m_Id: c379e54b5a3413b4e95ede99b7df5856 + m_Value: http://[PrivateIpAddress]:[HostingServicePort] + - m_Id: a55fd1d1cc0e2c54f8fc99fd45a015b6 + m_Value: ~PALLETBARCODE~ + - m_Id: ba16486fe6f55fd4fbf595bcaa8301dc + m_Value: 'PALLET_BARCODE:[PalletBarcode]:' + - m_Id: 8f6c7444a8c35a84aa1f5afd15b7b68c + m_Value: '[UnityEngine.AddressableAssets.Addressables.BuildPath]/[BuildTarget]' + - m_Id: f8725ba8ca4660e4a9c94c64ccb97536 + m_Value: '[SLZ.Marrow.MarrowSDK.BUILT_PALLETS_NAME]' + - m_Id: f97bbac1d358e3b47a31bd05dd60fd33 + m_Value: '[PalletBuildPath]/[UnityEditor.EditorUserBuildSettings.activeBuildTarget]/[PalletBarcode]' + - m_Id: d936b3f7b661e3b4eac88aca85467faa + m_Value: '[PalletLoadPath]' + - m_Id: 2023158ce820b5e46b6902e85fc5ddda + m_Value: '[GameBuildPath]' + - m_Id: 641fa520f0cf9104eb3a4973a1e9aea2 + m_Value: '[PalletLoadPath]' + - m_InheritedParent: + m_Id: fbad295727b3dec49ba750485b9465e7 + m_ProfileName: Pallets + m_Values: + - m_Id: 4b5be2a9894728a48b3be114e9cab1d3 + m_Value: '[UnityEditor.EditorUserBuildSettings.activeBuildTarget]' + - m_Id: cd46b6cc1cd9bb3468de6ffa0c95ecc0 + m_Value: '[UnityEngine.AddressableAssets.Addressables.BuildPath]/[BuildTarget]' + - m_Id: f61512461f3fbb64bb882a6af52b8090 + m_Value: '{UnityEngine.AddressableAssets.Addressables.RuntimePath}/[BuildTarget]' + - m_Id: f03d2a55457fa6e4f8d499c42217628e + m_Value: ServerData/[BuildTarget] + - m_Id: c379e54b5a3413b4e95ede99b7df5856 + m_Value: http://[PrivateIpAddress]:[HostingServicePort] + - m_Id: a55fd1d1cc0e2c54f8fc99fd45a015b6 + m_Value: ~PALLETBARCODE~ + - m_Id: ba16486fe6f55fd4fbf595bcaa8301dc + m_Value: 'PALLET_BARCODE:[PalletBarcode]:' + - m_Id: 8f6c7444a8c35a84aa1f5afd15b7b68c + m_Value: '[UnityEngine.AddressableAssets.Addressables.BuildPath]/[BuildTarget]' + - m_Id: f8725ba8ca4660e4a9c94c64ccb97536 + m_Value: '[SLZ.Marrow.MarrowSDK.BUILT_PALLETS_NAME]' + - m_Id: f97bbac1d358e3b47a31bd05dd60fd33 + m_Value: '[PalletBuildPath]/[UnityEditor.EditorUserBuildSettings.activeBuildTarget]/[PalletBarcode]' + - m_Id: d936b3f7b661e3b4eac88aca85467faa + m_Value: '[PalletLoadPath]' + - m_Id: 2023158ce820b5e46b6902e85fc5ddda + m_Value: '[GameBuildPath]' + - m_Id: 641fa520f0cf9104eb3a4973a1e9aea2 + m_Value: '[PalletLoadPath]' + m_ProfileEntryNames: + - m_Id: 4b5be2a9894728a48b3be114e9cab1d3 + m_Name: BuildTarget + m_InlineUsage: 0 + - m_Id: cd46b6cc1cd9bb3468de6ffa0c95ecc0 + m_Name: Local.BuildPath + m_InlineUsage: 0 + - m_Id: f61512461f3fbb64bb882a6af52b8090 + m_Name: Local.LoadPath + m_InlineUsage: 0 + - m_Id: f03d2a55457fa6e4f8d499c42217628e + m_Name: Remote.BuildPath + m_InlineUsage: 0 + - m_Id: c379e54b5a3413b4e95ede99b7df5856 + m_Name: Remote.LoadPath + m_InlineUsage: 0 + - m_Id: a55fd1d1cc0e2c54f8fc99fd45a015b6 + m_Name: PalletBarcode + m_InlineUsage: 0 + - m_Id: ba16486fe6f55fd4fbf595bcaa8301dc + m_Name: PalletLoadPath + m_InlineUsage: 0 + - m_Id: 8f6c7444a8c35a84aa1f5afd15b7b68c + m_Name: GameBuildPath + m_InlineUsage: 0 + - m_Id: f8725ba8ca4660e4a9c94c64ccb97536 + m_Name: PalletBuildPath + m_InlineUsage: 0 + - m_Id: f97bbac1d358e3b47a31bd05dd60fd33 + m_Name: Pallet.BuildPath + m_InlineUsage: 0 + - m_Id: d936b3f7b661e3b4eac88aca85467faa + m_Name: Pallet.LoadPath + m_InlineUsage: 0 + - m_Id: 2023158ce820b5e46b6902e85fc5ddda + m_Name: Game Pallet.BuildPath + m_InlineUsage: 0 + - m_Id: 641fa520f0cf9104eb3a4973a1e9aea2 + m_Name: Game Pallet.LoadPath + m_InlineUsage: 0 + m_ProfileVersion: 1 + m_LabelTable: + m_LabelNames: + - default + m_SchemaTemplates: [] + m_GroupTemplateObjects: + - {fileID: 11400000, guid: 63c989be4f767464bbd2d29f27316786, type: 2} + - {fileID: 11400000, guid: 76efe2a1ad2f9f24fb9b02f794fd974d, type: 2} + - {fileID: 11400000, guid: af5933cee8a8f9140889c4a0a669a67d, type: 2} + m_InitializationObjects: [] + m_CertificateHandlerType: + m_AssemblyName: + m_ClassName: + m_ActivePlayerDataBuilderIndex: 4 + m_DataBuilders: + - {fileID: 11400000, guid: 3aaba9eb0090cbd43bda0b87dae007ad, type: 2} + - {fileID: 11400000, guid: 2cf32c6dca5c3814aa682f35cb5afdb1, type: 2} + - {fileID: 11400000, guid: 70bd1540f4e4b0f4fa920d3ba706e290, type: 2} + - {fileID: 11400000, guid: 529af1d9b97831944b46774fd6d973d0, type: 2} + - {fileID: 11400000, guid: d2953db3a3b7d444b88a0af7383ae15b, type: 2} + - {fileID: 11400000, guid: 53d1aec21bc407e46951276825cdb752, type: 2} + m_ActiveProfileId: fbad295727b3dec49ba750485b9465e7 + m_HostingServicesManager: + m_HostingServiceInfos: [] + m_Settings: {fileID: 0} + m_NextInstanceId: 0 + m_RegisteredServiceTypeRefs: [] + m_PingTimeoutInMilliseconds: 5000 diff --git a/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta b/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta new file mode 100644 index 0000000..ea2fbe5 --- /dev/null +++ b/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c71f1176531903748ae728e24f577c88 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AddressableAssetsData/DefaultObject.asset b/Assets/AddressableAssetsData/DefaultObject.asset new file mode 100644 index 0000000..17432c2 --- /dev/null +++ b/Assets/AddressableAssetsData/DefaultObject.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3a189bb168d8d90478a09ea08c2f3d72, type: 3} + m_Name: DefaultObject + m_EditorClassIdentifier: + m_AddressableAssetSettingsGuid: c71f1176531903748ae728e24f577c88 diff --git a/Assets/AddressableAssetsData/DefaultObject.asset.meta b/Assets/AddressableAssetsData/DefaultObject.asset.meta new file mode 100644 index 0000000..a05c095 --- /dev/null +++ b/Assets/AddressableAssetsData/DefaultObject.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5d3b04119e4ec0946b0ce1ca71f2e9b7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders.meta b/Assets/SLZShaders.meta new file mode 100644 index 0000000..6a4cc47 --- /dev/null +++ b/Assets/SLZShaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 074f63f6bee531747b8047d59069bad1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/.GUIDList.txt b/Assets/SLZShaders/.GUIDList.txt new file mode 100644 index 0000000..ebb6fbc --- /dev/null +++ b/Assets/SLZShaders/.GUIDList.txt @@ -0,0 +1,39 @@ +e95b31b7241745c479b6b9574209d1f9 +6bf3d81d08a4ff343b22619a187bb249 +4c21875978f9ed04d9edcf6d97e9ed54 +b2e867ce46fe95046aaceb0155a651ad +f71cd8ed99405284ab09d18bf11d03ab +44cd4284ecfc46c4c97f571b3681e0c6 +ae467daa42d17ee45b6947a14ec8ec96 +7276a03ae0651b1419b50e2c76272732 +f05a5c6a2a705054d8547ebd87b58073 +97791a0150e87a14bbe1a5d46267be8a +93a4eb99edd7b9c42bfb913f0ee52b3e +4a1250fb7f0da2e4e96bd2e34ce4a8ea +24617ef4b8ecbe74984e0955867cffd4 +a0cae63ef60b7da4f9cb90b8cdb4ce4e +86c42a8335fb06241a674530f1fa24c5 +6aab105c75192124887c893201ce93e0 +225aec2e7a259b642a9fa1a4d10d7aac +c96b15076e0088349a95505e52f5a12a +93c33570d60341c439e50150832c5173 +81cc8fbe3bd52d149b2b91936b92bfb8 +6dc78741d54741a4c90a0fb74bd75f20 +3190a336b6bd4484d911017dd0fc15ba +ebf91ac3a3d63fe42ace3e3a75c5153a +57dc2f6a8812542439eb1e60c355d9a2 +75ebf02c7324c2944904e47c12cb421b +e48b7c1f5379ceb4687833196130a9dd +0e6e0041457dfeb47936aa37f7c4bfdf +75872890b046c074fac20ab6d18e52b1 +40dd6881c3760054cacc50fdba7554dc +36686d6671a56b04f9401216e0ff9ae5 +c156fe6f1c50d864f8ceb85b935236f7 +390d76c4ec3c32e4e8ecc2b49aa78a1c +005850956c06e3c4d9126500376c9a40 +88f1b8e9d502e19419d88bca2cab94da +2313d59684d119840a78fee73c48959a +2df13d630bf74324fbefa9003b6544b3 +03859193eb793184ca8cc47738d7109d +f42ab72a6a8465649be290d03a8f1981 +2a6fc1acbba5a6045a0692bfb9a7a8f2 diff --git a/Assets/SLZShaders/.sample.json b/Assets/SLZShaders/.sample.json new file mode 100644 index 0000000..de340c3 --- /dev/null +++ b/Assets/SLZShaders/.sample.json @@ -0,0 +1,5 @@ +{ + "displayName":"SLZ Bonelab Shaders", + "description": "A collection of shaders that are found in Bonelab", + "createSeparatePackage": false +} \ No newline at end of file diff --git a/Assets/SLZShaders/BonelabSky.meta b/Assets/SLZShaders/BonelabSky.meta new file mode 100644 index 0000000..d3e071c --- /dev/null +++ b/Assets/SLZShaders/BonelabSky.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 788eda7870482d742ab84d912eeaef30 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/BonelabSky/README.txt b/Assets/SLZShaders/BonelabSky/README.txt new file mode 100644 index 0000000..95ff5b8 --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/README.txt @@ -0,0 +1,13 @@ +# Sky Prefab For Bonelab + +This package contains a prefab for rendering sky in Bonelab. Unity's default +sky rendering is turned off due to it being incompatible with the fog and vol- +umetric systems we use. The included prefab can be used as a replacement for +the default sky. The prefab is simply an enormous mesh with no occlusion and +a special shader. Note that the included shader (SLZ/Sky With Fog) must only be +used with the included mesh (Sky_Mesh) as the shader expects a single triangle +mesh. Additionally, Sky_Mesh has a 65x65x65 kilometer bounding box to ensure it +is always rendered. The included prefab further has dynamic occlusion disabled +to ensure it never gets culled, as well as all unnecessary lighting information +disabled. Do not enable the Occluder or Occludee Static flags on the prefab to +ensure the mesh is never occluded. diff --git a/Assets/SLZShaders/BonelabSky/README.txt.meta b/Assets/SLZShaders/BonelabSky/README.txt.meta new file mode 100644 index 0000000..acebe2e --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/README.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 86c42a8335fb06241a674530f1fa24c5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/BonelabSky/materials.meta b/Assets/SLZShaders/BonelabSky/materials.meta new file mode 100644 index 0000000..d447e23 --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d52f8debff15ed04b89c365c5b348eb0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/BonelabSky/materials/Sky_Example.mat b/Assets/SLZShaders/BonelabSky/materials/Sky_Example.mat new file mode 100644 index 0000000..beedf14 --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/materials/Sky_Example.mat @@ -0,0 +1,94 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Sky_Example + m_Shader: {fileID: 4800000, guid: 75ebf02c7324c2944904e47c12cb421b, type: 3} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SkyTex: + m_Texture: {fileID: 8900000, guid: e48b7c1f5379ceb4687833196130a9dd, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DetailSmoothnessMapScale: 1 + - _DstBlend: 0 + - _FogDist: 0.1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OffsetFactor: 0 + - _OffsetUnits: 0 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SkyColor: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/SLZShaders/BonelabSky/materials/Sky_Example.mat.meta b/Assets/SLZShaders/BonelabSky/materials/Sky_Example.mat.meta new file mode 100644 index 0000000..1e071d1 --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/materials/Sky_Example.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3190a336b6bd4484d911017dd0fc15ba +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/BonelabSky/meshes.meta b/Assets/SLZShaders/BonelabSky/meshes.meta new file mode 100644 index 0000000..8faec6e --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/meshes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3c33eff4ea614ba4285462f29506cf94 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/BonelabSky/meshes/Sky_Mesh.asset b/Assets/SLZShaders/BonelabSky/meshes/Sky_Mesh.asset new file mode 100644 index 0000000..05c0224 --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/meshes/Sky_Mesh.asset @@ -0,0 +1,167 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!43 &4300000 +Mesh: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Sky_Mesh + serializedVersion: 11 + m_SubMeshes: + - serializedVersion: 2 + firstByte: 0 + indexCount: 3 + topology: 0 + baseVertex: 0 + firstVertex: 0 + vertexCount: 3 + localAABB: + m_Center: {x: 1, y: 1, z: 0} + m_Extent: {x: 2, y: 2, z: 0} + m_Shapes: + vertices: [] + shapes: [] + channels: [] + fullWeights: [] + m_BindPose: [] + m_BoneNameHashes: + m_RootBoneNameHash: 0 + m_BonesAABB: [] + m_VariableBoneCountWeights: + m_Data: + m_MeshCompression: 0 + m_IsReadable: 1 + m_KeepVertices: 1 + m_KeepIndices: 1 + m_IndexFormat: 0 + m_IndexBuffer: 000001000200 + m_VertexData: + serializedVersion: 3 + m_VertexCount: 3 + m_Channels: + - stream: 0 + offset: 0 + format: 0 + dimension: 3 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 12 + format: 0 + dimension: 2 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + m_DataSize: 60 + _typelessdata: 000080bf0000404000000000000000000000803f000080bf000080bf00000000000000000000000000004040000080bf000000000000803f00000000 + m_CompressedMesh: + m_Vertices: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_UV: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Normals: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Tangents: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Weights: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_NormalSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_TangentSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_FloatColors: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_BoneIndices: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_Triangles: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_UVInfo: 0 + m_LocalAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 32768, y: 32768, z: 32768} + m_MeshUsageFlags: 0 + m_CookingOptions: 30 + m_BakedConvexCollisionMesh: + m_BakedTriangleCollisionMesh: + m_MeshMetrics[0]: 1 + m_MeshMetrics[1]: 1 + m_MeshOptimizationFlags: 1 + m_StreamData: + serializedVersion: 2 + offset: 0 + size: 0 + path: diff --git a/Assets/SLZShaders/BonelabSky/meshes/Sky_Mesh.asset.meta b/Assets/SLZShaders/BonelabSky/meshes/Sky_Mesh.asset.meta new file mode 100644 index 0000000..3717f5c --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/meshes/Sky_Mesh.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ebf91ac3a3d63fe42ace3e3a75c5153a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/BonelabSky/prefabs.meta b/Assets/SLZShaders/BonelabSky/prefabs.meta new file mode 100644 index 0000000..c1350f4 --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dfda820ea5fa26a4fad111042abd4a98 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/BonelabSky/prefabs/Sky_Prefab.prefab b/Assets/SLZShaders/BonelabSky/prefabs/Sky_Prefab.prefab new file mode 100644 index 0000000..9dd83a8 --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/prefabs/Sky_Prefab.prefab @@ -0,0 +1,85 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &531086027732950538 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1713422862066233390} + - component: {fileID: 2453626235171082250} + - component: {fileID: 3742906364795765522} + m_Layer: 0 + m_Name: Sky_Prefab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 64 + m_IsActive: 1 +--- !u!4 &1713422862066233390 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 531086027732950538} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2453626235171082250 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 531086027732950538} + m_Mesh: {fileID: 4300000, guid: ebf91ac3a3d63fe42ace3e3a75c5153a, type: 2} +--- !u!23 &3742906364795765522 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 531086027732950538} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 1 + m_DynamicOccludee: 0 + m_StaticShadowCaster: 0 + m_MotionVectors: 2 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 3190a336b6bd4484d911017dd0fc15ba, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} diff --git a/Assets/SLZShaders/BonelabSky/prefabs/Sky_Prefab.prefab.meta b/Assets/SLZShaders/BonelabSky/prefabs/Sky_Prefab.prefab.meta new file mode 100644 index 0000000..bcd4a2a --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/prefabs/Sky_Prefab.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 57dc2f6a8812542439eb1e60c355d9a2 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/BonelabSky/shaders.meta b/Assets/SLZShaders/BonelabSky/shaders.meta new file mode 100644 index 0000000..72c6e7b --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ca716302fae88144cb8018d9ea2dd61c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/BonelabSky/shaders/Sky_Far.shader b/Assets/SLZShaders/BonelabSky/shaders/Sky_Far.shader new file mode 100644 index 0000000..3b051af --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/shaders/Sky_Far.shader @@ -0,0 +1,122 @@ +Shader "SLZ/Sky With Fog" +{ + Properties + { + _SkyTex ("Sky Texture", CUBE) = "black" {} + [HDR] _SkyColor ("Sky Color", Color) = (1,1,1,1) + _FogDist ("Fog Max Distance (0 to camera far clip)", Range(0,1)) = 1.0 + } + SubShader + { + Tags {"RenderPipeline" = "UniversalPipeline" "RenderType" = "Opaque" "Queue" = "AlphaTest+51" "IgnoreProjector"="True"} + Blend One Zero + ZWrite Off + ZTest LEqual + //Offset 1,1 + ColorMask RGBA + LOD 100 + Cull Off + + Pass + { + Name "Forward" + Tags {"Lightmode"="UniversalForward"} + HLSLPROGRAM + + #pragma vertex vert + #pragma fragment frag +#pragma exclude_renderers gles + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #pragma multi_compile_fragment _ FOG_LINEAR FOG_EXP2 + #define SHADERPASS SHADERPASS_FORWARD + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl" + + + struct appdata + { + //float4 vertex : POSITION; + half2 uv0 : TEXCOORD0; + uint vertexID : SV_VertexID; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f + { + float4 vertex : SV_POSITION; + float2 uv0 : TEXCOORD0; + float4 wPos_xyz_fog_x : TEXCOORD1; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + TEXTURECUBE(_SkyTex); + SamplerState sampler_SkyTex; + CBUFFER_START(UnityPerMaterial) + half4 _SkyColor; + float _FogDist; + CBUFFER_END + + + /* Gets the position of a vertex as a part of a right triangle that completely covers the screen + * Assumes a single triangle mesh, with the positions based on the vertex's ID. + * CCW order + * 0 : 0,1 0 + * 1 : 0,0 | \ + * 2 : 1,0 1--2 + */ + float4 GetQuadVertexPosition2(uint vertexID, float z = UNITY_NEAR_CLIP_VALUE) + { + uint topBit = vertexID >> 1u; + uint botBit = (vertexID & 1u); + float y = 1.0f - ((vertexID & 2u) >> 1); + float x = (vertexID & 1u);//1 - (topBit + botBit) & 1; // produces 1 for indices 0,3 and 0 for 1,2 + return float4(x, y, z, 1.0); + } + v2f vert(appdata v) + { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + //float z = (rcp(_SkyDist) - _ZBufferParams.y) / (_ZBufferParams.x); // Transform from linear 0-1 depth to clipspace Z + float4 clipQuad = GetQuadVertexPosition(v.vertexID, UNITY_RAW_FAR_CLIP_VALUE); + clipQuad.xy = 4.0f * clipQuad.xy - 1.0f; + //clipQuad.xy = 0.5f * clipQuad.xy - 0.5f; + float4 wPos = mul(UNITY_MATRIX_I_VP, clipQuad); + o.wPos_xyz_fog_x.xyz = wPos.xyz / wPos.w; + o.vertex = clipQuad; + half clipZ_0Far = lerp(_ProjectionParams.y, _ProjectionParams.z, _FogDist); + o.wPos_xyz_fog_x.w = unity_FogParams.x * clipZ_0Far; + return o; + } + + half4 frag(v2f i) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + + float3 viewDir = normalize(float3(i.wPos_xyz_fog_x.xyz - _WorldSpaceCameraPos)); + half4 col = SAMPLE_TEXTURECUBE_LOD(_SkyTex, sampler_SkyTex, viewDir, 0); + col *= _SkyColor; + + col.rgb = MixFog(col.rgb, viewDir, i.wPos_xyz_fog_x.w); + + col = Volumetrics(col, i.wPos_xyz_fog_x.xyz); + + return col; + } + ENDHLSL + } + } +} diff --git a/Assets/SLZShaders/BonelabSky/shaders/Sky_Far.shader.meta b/Assets/SLZShaders/BonelabSky/shaders/Sky_Far.shader.meta new file mode 100644 index 0000000..587bb44 --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/shaders/Sky_Far.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 75ebf02c7324c2944904e47c12cb421b +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/BonelabSky/textures.meta b/Assets/SLZShaders/BonelabSky/textures.meta new file mode 100644 index 0000000..e19f79e --- /dev/null +++ b/Assets/SLZShaders/BonelabSky/textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ea399fb043d56334aa2576c57d9a4eee +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/BonelabSky/textures/ProtoSky.png b/Assets/SLZShaders/BonelabSky/textures/ProtoSky.png new file mode 100644 index 0000000000000000000000000000000000000000..84b95c329709f374d166804a165f513ec7e014bf GIT binary patch literal 74918 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\r\n\r\n + false\r\n true\r\n + GenRoughness\r\n 1\r\n + false\r\n" + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Fluorescence.shader b/Assets/SLZShaders/Fluorescence.shader new file mode 100644 index 0000000..56d7f42 --- /dev/null +++ b/Assets/SLZShaders/Fluorescence.shader @@ -0,0 +1,3325 @@ +// Made with Amplify Shader Editor +// Available at the Unity Asset Store - http://u3d.as/y3X +Shader "SLZ/Fluorescence" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [ASEBegin]_BaseMap("Base Map", 2D) = "white" {} + [NoScaleOffset]_Fluorescence("Fluorescence", 2D) = "white" {} + _AlbedotoFluorescence("Albedo to Fluorescence", Range( 0 , 1)) = 1 + _FluorescenceTint("Fluorescence Tint", Color) = (1,1,1,1) + _Absorbance("Absorbance", Color) = (0,0.1875,0.929,1) + [NoScaleOffset]_MetallicGlossMap("MAS", 2D) = "white" {} + [NoScaleOffset][Normal]_BumpMap("Normal map", 2D) = "bump" {} + [NoScaleOffset]_EmissionMap("EmissionMap", 2D) = "black" {} + [HDR]_EmissionColor("EmissionColor", Color) = (0,0,0,0) + [Space(30)][Header(Details)][Space(10)][Toggle(_DETAILS_ON)] _Details("Details enabled", Float) = 0 + _DetailMap("DetailMap", 2D) = "white" {} + [ASEEnd]_EmissionFalloff("EmissionFalloff", Float) = 1 + + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + //_TransmissionShadow( "Transmission Shadow", Range( 0, 1 ) ) = 0.5 + //_TransStrength( "Trans Strength", Range( 0, 50 ) ) = 1 + //_TransNormal( "Trans Normal Distortion", Range( 0, 1 ) ) = 0.5 + //_TransScattering( "Trans Scattering", Range( 1, 50 ) ) = 2 + //_TransDirect( "Trans Direct", Range( 0, 1 ) ) = 0.9 + //_TransAmbient( "Trans Ambient", Range( 0, 1 ) ) = 0.1 + //_TransShadow( "Trans Shadow", Range( 0, 1 ) ) = 0.5 + //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5 + //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16 + //_TessMin( "Tess Min Distance", Float ) = 10 + //_TessMax( "Tess Max Distance", Float ) = 25 + //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16 + //_TessMaxDisp( "Tess Max Displacement", Float ) = 25 + } + + SubShader + { + LOD 0 + + + + + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Opaque" "Queue"="Geometry" } + Cull Back + ZWrite On + ZTest LEqual + Offset 0 , 0 + AlphaToMask Off + + HLSLINCLUDE + #pragma target 3.0 + + #pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + + #ifndef ASE_TESS_FUNCS + #define ASE_TESS_FUNCS + float4 FixedTess( float tessValue ) + { + return tessValue; + } + + float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos ) + { + float3 wpos = mul(o2w,vertex).xyz; + float dist = distance (wpos, cameraPos); + float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess; + return f; + } + + float4 CalcTriEdgeTessFactors (float3 triVertexFactors) + { + float4 tess; + tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z); + tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z); + tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y); + tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f; + return tess; + } + + float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams ) + { + float dist = distance (0.5 * (wpos0+wpos1), cameraPos); + float len = distance(wpos0, wpos1); + float f = max(len * scParams.y / (edgeLen * dist), 1.0); + return f; + } + + float DistanceFromPlane (float3 pos, float4 plane) + { + float d = dot (float4(pos,1.0f), plane); + return d; + } + + bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] ) + { + float4 planeTest; + planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f ); + return !all (planeTest); + } + + float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos ) + { + float3 f; + f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos); + f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos); + f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos); + + return CalcTriEdgeTessFactors (f); + } + + float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + return tess; + } + + float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + + if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes)) + { + tess = 0.0f; + } + else + { + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + } + return tess; + } + #endif //ASE_TESS_FUNCS + + ENDHLSL + + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForwardOnly" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_FORWARD + + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + + #define ASE_NEEDS_FRAG_WORLD_VIEW_DIR + #define ASE_NEEDS_FRAG_WORLD_TANGENT + #define ASE_NEEDS_FRAG_WORLD_NORMAL + #define ASE_NEEDS_FRAG_WORLD_BITANGENT + #pragma shader_feature_local_fragment _DETAILS_ON + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DefaultLitVariants.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_texcoord8 : TEXCOORD8; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _DetailMap_ST; + float4 _EmissionColor; + float4 _FluorescenceTint; + float4 _Absorbance; + float _AlbedotoFluorescence; + float _EmissionFalloff; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + TEXTURE2D(_DetailMap); + SAMPLER(sampler_DetailMap); + TEXTURE2D(_Fluorescence); + SAMPLER(sampler_Fluorescence); + TEXTURE2D(_BumpMap); + SAMPLER(sampler_BumpMap); + TEXTURE2D(_EmissionMap); + SAMPLER(sampler_EmissionMap); + TEXTURE2D(_MetallicGlossMap); + SAMPLER(sampler_MetallicGlossMap); + + + float MyCustomExpression17( float smooth1, float smooth2 ) + { + return saturate( smooth1 + smooth2 - 1); + } + + inline float MyCustomExpression217_g1( float detailSmooth, float smoothness ) + { + return smoothness * (2.0 * detailSmooth); + } + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord8.xy = v.texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + #if defined(LIGHTMAP_ON) + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + #if !defined(LIGHTMAP_ON) + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + #endif + + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) || defined(ASE_TERRAIN_INSTANCING) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float2 uv_BaseMap = IN.ase_texcoord8.xy * _BaseMap_ST.xy + _BaseMap_ST.zw; + float4 temp_output_21_0_g1 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ); + float4 temp_output_109_0_g170 = round( temp_output_21_0_g1 ); + float2 texCoord219_g1 = IN.ase_texcoord8.xy * float2( 1,1 ) + float2( 0,0 ); + float2 temp_output_218_0_g1 = texCoord219_g1; + float4 tex2DNode1_g1 = SAMPLE_TEXTURE2D( _DetailMap, sampler_DetailMap, ( ( temp_output_218_0_g1 * _DetailMap_ST.xy ) + _DetailMap_ST.zw ) ); + #ifdef _DETAILS_ON + float4 staticSwitch16_g1 = ( ( temp_output_109_0_g170 * ( 1.0 - ( ( 1.0 - temp_output_21_0_g1 ) * ( 1.0 - (tex2DNode1_g1.r).xxxx ) * 2.0 ) ) ) + ( ( 1.0 - temp_output_109_0_g170 ) * ( temp_output_21_0_g1 * (tex2DNode1_g1.r).xxxx * 2.0 ) ) ); + #else + float4 staticSwitch16_g1 = temp_output_21_0_g1; + #endif + float4 temp_output_16_0 = staticSwitch16_g1; + float4 tex2DNode14 = SAMPLE_TEXTURE2D( _Fluorescence, sampler_Fluorescence, uv_BaseMap ); + float4 lerpResult24 = lerp( temp_output_16_0 , float4( 0,0,0,0 ) , ( _AlbedotoFluorescence * tex2DNode14 )); + + float3 tex2DNode11 = UnpackNormalScale( SAMPLE_TEXTURE2D( _BumpMap, sampler_BumpMap, uv_BaseMap ), 1.0f ); + float4 temp_output_22_0_g1 = float4( tex2DNode11 , 0.0 ); + float2 temp_output_57_0_g1 = (tex2DNode1_g1).ga; + float2 break79_g1 = temp_output_57_0_g1; + float3 appendResult56_g1 = (float3(break79_g1.y , break79_g1.x , 1.0)); + float3 temp_cast_5 = (1.0).xxx; + #ifdef _DETAILS_ON + float4 staticSwitch26_g1 = float4( BlendNormal( temp_output_22_0_g1.rgb , ( ( appendResult56_g1 * 2.0 ) - temp_cast_5 ) ) , 0.0 ); + #else + float4 staticSwitch26_g1 = temp_output_22_0_g1; + #endif + float4 temp_output_16_25 = staticSwitch26_g1; + + float4 tex2DNode27 = SAMPLE_TEXTURE2D( _EmissionMap, sampler_EmissionMap, uv_BaseMap ); + float3 tanToWorld0 = float3( WorldTangent.x, WorldBiTangent.x, WorldNormal.x ); + float3 tanToWorld1 = float3( WorldTangent.y, WorldBiTangent.y, WorldNormal.y ); + float3 tanToWorld2 = float3( WorldTangent.z, WorldBiTangent.z, WorldNormal.z ); + float3 tanNormal38 = temp_output_16_25.rgb; + float3 worldNormal38 = float3(dot(tanToWorld0,tanNormal38), dot(tanToWorld1,tanNormal38), dot(tanToWorld2,tanNormal38)); + float dotResult31 = dot( WorldViewDirection , worldNormal38 ); + + float4 tex2DNode12 = SAMPLE_TEXTURE2D( _MetallicGlossMap, sampler_MetallicGlossMap, uv_BaseMap ); + + float smooth117 = tex2DNode11.b; + float smooth217 = tex2DNode12.b; + float localMyCustomExpression17 = MyCustomExpression17( smooth117 , smooth217 ); + float temp_output_23_0_g1 = localMyCustomExpression17; + float detailSmooth217_g1 = tex2DNode1_g1.b; + float smoothness217_g1 = temp_output_23_0_g1; + float localMyCustomExpression217_g1 = MyCustomExpression217_g1( detailSmooth217_g1 , smoothness217_g1 ); + #ifdef _DETAILS_ON + float staticSwitch17_g1 = localMyCustomExpression217_g1; + #else + float staticSwitch17_g1 = temp_output_23_0_g1; + #endif + + float4 lerpResult20 = lerp( float4( 1,1,1,1 ) , temp_output_16_0 , _AlbedotoFluorescence); + + float3 Albedo = lerpResult24.rgb; + float3 Normal = temp_output_16_25.rgb; + float3 Emission = ( tex2DNode27 * _EmissionColor * temp_output_16_0 * saturate( pow( dotResult31 , _EmissionFalloff ) ) ).rgb; +#if 0 + float3 BakedEmission = ( tex2DNode27 * _EmissionColor * temp_output_16_0 ).rgb; +#endif + float3 Specular = 0.5; + float Metallic = tex2DNode12.r; + float Smoothness = staticSwitch17_g1; + float Occlusion = tex2DNode12.g; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _CLEARCOAT + float CoatMask = 0; + float CoatSmoothness = 0; + #endif + + #if defined(_FLUORESCENCE) + float4 Fluorescence = ( tex2DNode14 * _FluorescenceTint * lerpResult20 ); + float4 Absorbance = _Absorbance; + #endif + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.viewDirectionWS = WorldViewDirection; + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + #else + inputData.normalWS = WorldNormal; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + inputData.shadowCoord = ShadowCoords; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + inputData.shadowCoord = TransformWorldToShadowCoord(inputData.positionWS); + #else + inputData.shadowCoord = float4(0, 0, 0, 0); + #endif + + + #ifdef ASE_FOG + inputData.fogCoord = IN.fogFactorAndVertexLight.x; + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzww; //TODO: Shuffle things in vertex streams so we get full RGBA color rather than RGBB here + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xyz, IN.dynamicLightmapUV.xy, IN.vertexSH, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI(IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, IN.vertexSH , inputData.normalWS); + #endif + + #else + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + #endif + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + SurfaceData surfaceData; + surfaceData.albedo = Albedo; + surfaceData.metallic = saturate(Metallic); + surfaceData.specular = Specular; + surfaceData.smoothness = saturate(Smoothness), + surfaceData.occlusion = Occlusion, + surfaceData.emission = Emission, + surfaceData.alpha = saturate(Alpha); + surfaceData.normalTS = Normal; + surfaceData.clearCoatMask = 0; + surfaceData.clearCoatSmoothness = 1; + + #ifdef _CLEARCOAT + surfaceData.clearCoatMask = saturate(CoatMask); + surfaceData.clearCoatSmoothness = saturate(CoatSmoothness); + #endif + #if defined(_FLUORESCENCE) + surfaceData.fluorescence = Fluorescence; + surfaceData.absorbance = Absorbance; + #endif + + #ifdef _DBUFFER + ApplyDecalToSurfaceData(IN.clipPos, surfaceData, inputData); + #endif + + half4 color = UniversalFragmentPBR( inputData, surfaceData); + + #ifdef LIGHTMAP_ON + float3 MetalSpec = lerp(kDieletricSpec.rgb, surfaceData.albedo , surfaceData.metallic); + color.rgb += BakedSpecular * surfaceData.occlusion * MetalSpec * inputData.bakedGI.rgb; + #endif + + #ifdef _TRANSMISSION_ASE + { + float shadow = _TransmissionShadow; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + half3 mainTransmission = max(0 , -dot(inputData.normalWS, mainLight.direction)) * mainAtten * Transmission; + color.rgb += Albedo * mainTransmission; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 transmission = max(0 , -dot(inputData.normalWS, light.direction)) * atten * Transmission; + color.rgb += Albedo * transmission; + } + #endif + } + #endif + + #ifdef _TRANSLUCENCY_ASE + { + float shadow = _TransShadow; + float normal = _TransNormal; + float scattering = _TransScattering; + float direct = _TransDirect; + float ambient = _TransAmbient; + float strength = _TransStrength; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + + half3 mainLightDir = mainLight.direction + inputData.normalWS * normal; + half mainVdotL = pow( saturate( dot( inputData.viewDirectionWS, -mainLightDir ) ), scattering ); + half3 mainTranslucency = mainAtten * ( mainVdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * mainTranslucency * strength; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 lightDir = light.direction + inputData.normalWS * normal; + half VdotL = pow( saturate( dot( inputData.viewDirectionWS, -lightDir ) ), scattering ); + half3 translucency = atten * ( VdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * translucency * strength; + } + #endif + } + #endif + + #ifdef _REFRACTION_ASE + float4 projScreenPos = ScreenPos / ScreenPos.w; + float3 refractionOffset = ( RefractionIndex - 1.0 ) * mul( UNITY_MATRIX_V, float4( WorldNormal,0 ) ).xyz * ( 1.0 - dot( WorldNormal, WorldViewDirection ) ); + projScreenPos.xy += refractionOffset.xy; + float3 refraction = SHADERGRAPH_SAMPLE_SCENE_COLOR( projScreenPos.xy ) * RefractionColor; + color.rgb = lerp( refraction, color.rgb, color.a ); + color.a = 1; + #endif + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, -inputData.viewDirectionWS, IN.fogFactorAndVertexLight.x); + #endif + #endif + + color = Volumetrics( color, inputData.positionWS); + + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return color; + } + + ENDHLSL + } + + + Pass + { + + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + + ZWrite On + ZTest LEqual + AlphaToMask Off + ColorMask 0 + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #pragma multi_compile _ _CASTING_PUNCTUAL_LIGHT_SHADOW + + #define SHADERPASS SHADERPASS_SHADOWCASTER + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _DetailMap_ST; + float4 _EmissionColor; + float4 _FluorescenceTint; + float4 _Absorbance; + float _AlbedotoFluorescence; + float _EmissionFalloff; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + float3 _LightDirection; + float3 _LightPosition; + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + + float3 normalWS = TransformObjectToWorldDir(v.ase_normal); + + + #if _CASTING_PUNCTUAL_LIGHT_SHADOW + float3 lightDirectionWS = normalize(_LightPosition - positionWS); + #else + float3 lightDirectionWS = _LightDirection; + #endif + float2 vShadowOffsets = GetShadowOffsets( normalWS, lightDirectionWS ); + positionWS.xyz -= vShadowOffsets.y * lightDirectionWS.xyz * .01; + float4 clipPos = TransformObjectToHClip( float4( mul( unity_WorldToObject, float4( positionWS.xyz, 1.0 ) ).xyz, 1.0 ) ); + //float4 clipPos = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, lightDirectionWS)); + + #if UNITY_REVERSED_Z + clipPos.z = min(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #else + clipPos.z = max(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #endif + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = clipPos; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + #ifdef _ALPHATEST_SHADOW_ON + clip(Alpha - AlphaClipThresholdShadow); + #else + clip(Alpha - AlphaClipThreshold); + #endif + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + return 0; + } + + ENDHLSL + } + + + Pass + { + + Name "DepthOnly" + Tags { "LightMode"="DepthOnly" } + + ZWrite On + ColorMask 0 + AlphaToMask Off + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _DetailMap_ST; + float4 _EmissionColor; + float4 _FluorescenceTint; + float4 _Absorbance; + float _AlbedotoFluorescence; + float _EmissionFalloff; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return 0; + } + ENDHLSL + } + + + Pass + { + + Name "Meta" + Tags { "LightMode"="Meta" } + + Cull Off + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #pragma shader_feature _ EDITOR_VISUALIZATION + + #define SHADERPASS SHADERPASS_META + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/MetaInput.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #pragma shader_feature_local_fragment _DETAILS_ON + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + #ifdef EDITOR_VISUALIZATION + float4 VizUV : TEXCOORD2; + float4 LightCoord : TEXCOORD3; + #endif + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _DetailMap_ST; + float4 _EmissionColor; + float4 _FluorescenceTint; + float4 _Absorbance; + float _AlbedotoFluorescence; + float _EmissionFalloff; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + TEXTURE2D(_DetailMap); + SAMPLER(sampler_DetailMap); + TEXTURE2D(_Fluorescence); + SAMPLER(sampler_Fluorescence); + TEXTURE2D(_EmissionMap); + SAMPLER(sampler_EmissionMap); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord4.xy = v.texcoord0.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.clipPos = MetaVertexPosition( v.vertex, v.texcoord1.xy, v.texcoord1.xy, unity_LightmapST, unity_DynamicLightmapST ); + + #ifdef EDITOR_VISUALIZATION + float2 VizUV = 0; + float4 LightCoord = 0; + UnityEditorVizData(v.vertex.xyz, v.texcoord0.xy, v.texcoord1.xy, v.texcoord2.xy, VizUV, LightCoord); + o.VizUV = float4(VizUV, 0, 0); + o.LightCoord = LightCoord; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = o.clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.texcoord0 = v.texcoord0; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.texcoord0 = patch[0].texcoord0 * bary.x + patch[1].texcoord0 * bary.y + patch[2].texcoord0 * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 uv_BaseMap = IN.ase_texcoord4.xy * _BaseMap_ST.xy + _BaseMap_ST.zw; + float4 temp_output_21_0_g1 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ); + float4 temp_output_109_0_g170 = round( temp_output_21_0_g1 ); + float2 texCoord219_g1 = IN.ase_texcoord4.xy * float2( 1,1 ) + float2( 0,0 ); + float2 temp_output_218_0_g1 = texCoord219_g1; + float4 tex2DNode1_g1 = SAMPLE_TEXTURE2D( _DetailMap, sampler_DetailMap, ( ( temp_output_218_0_g1 * _DetailMap_ST.xy ) + _DetailMap_ST.zw ) ); + #ifdef _DETAILS_ON + float4 staticSwitch16_g1 = ( ( temp_output_109_0_g170 * ( 1.0 - ( ( 1.0 - temp_output_21_0_g1 ) * ( 1.0 - (tex2DNode1_g1.r).xxxx ) * 2.0 ) ) ) + ( ( 1.0 - temp_output_109_0_g170 ) * ( temp_output_21_0_g1 * (tex2DNode1_g1.r).xxxx * 2.0 ) ) ); + #else + float4 staticSwitch16_g1 = temp_output_21_0_g1; + #endif + float4 temp_output_16_0 = staticSwitch16_g1; + float4 tex2DNode14 = SAMPLE_TEXTURE2D( _Fluorescence, sampler_Fluorescence, uv_BaseMap ); + float4 lerpResult24 = lerp( temp_output_16_0 , float4( 0,0,0,0 ) , ( _AlbedotoFluorescence * tex2DNode14 )); + + float4 tex2DNode27 = SAMPLE_TEXTURE2D( _EmissionMap, sampler_EmissionMap, uv_BaseMap ); + + + float3 Albedo = lerpResult24.rgb; + float3 Emission = ( tex2DNode27 * _EmissionColor * temp_output_16_0 ).rgb; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + MetaInput metaInput = (MetaInput)0; + metaInput.Albedo = Albedo; + metaInput.Emission = Emission; + #ifdef EDITOR_VISUALIZATION + metaInput.VizUV = IN.VizUV.xy; + metaInput.LightCoord = IN.LightCoord; + #endif + + return MetaFragment(metaInput); + } + ENDHLSL + } + + /*ase_pass*/ + Pass + { + + Name "BakedRaytrace" + Tags{ "LightMode" = "BakedRaytrace" } + HLSLPROGRAM + + /*ase_pragma_before*/ + + #define SHADERPASS SHADERPASS_RAYTRACE + + #include "UnityRaytracingMeshUtils.cginc" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #define _EMISSION + #pragma raytracing test + #pragma shader_feature_local __ _ALBEDOMULTIPLY_ON + #pragma shader_feature_local __ _EMISSION_ON + + /*ase_pragma*/ + + struct RayPayload + { + float4 color; + float3 dir; + }; + + struct AttributeData + { + float2 barycentrics; + }; + + struct Vertex + { + float2 texcoord; + float3 normal; + }; + + Texture2D _BaseMap; + SamplerState sampler_BaseMap; + + CBUFFER_START( UnityPerMaterial ) + /*ase_srp_batcher*/ + Texture2D _EmissionMap; + SamplerState sampler_EmissionMap; + + float4 _EmissionColor; + float4 _BaseMap_ST; + float _BakedMutiplier = 1; + CBUFFER_END + + /*ase_globals*/ + + /*ase_funcs*/ + + //https://coty.tips/raytracing-in-unity/ + [shader("closesthit")] + void MyClosestHit(inout RayPayload payload, + AttributeData attributes : SV_IntersectionAttributes) { + + payload.color = float4(0,0,0,1); //Intializing + payload.dir = float3(1,0,0); + + // #if _EMISSION_ON + uint2 launchIdx = DispatchRaysIndex(); + // ShadingData shade = getShadingData( PrimitiveIndex(), attribs ); + + uint primitiveIndex = PrimitiveIndex(); + uint3 triangleIndicies = UnityRayTracingFetchTriangleIndices(primitiveIndex); + Vertex v0, v1, v2; + + v0.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.x, kVertexAttributeTexCoord0); + v1.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.y, kVertexAttributeTexCoord0); + v2.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.z, kVertexAttributeTexCoord0); + + // v0.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.x, kVertexAttributeNormal); + // v1.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.y, kVertexAttributeNormal); + // v2.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.z, kVertexAttributeNormal); + + float3 barycentrics = float3(1.0 - attributes.barycentrics.x - attributes.barycentrics.y, attributes.barycentrics.x, attributes.barycentrics.y); + + Vertex vInterpolated; + vInterpolated.texcoord = v0.texcoord * barycentrics.x + v1.texcoord * barycentrics.y + v2.texcoord * barycentrics.z; + //TODO: Extract normal direction to ignore the backside of emissive objects + //vInterpolated.normal = v0.normal * barycentrics.x + v1.normal * barycentrics.y + v2.normal * barycentrics.z; + // if ( dot(vInterpolated.normal, float3(1,0,0) < 0) ) payload.color = float4(0,10,0,1) ; + // else payload.color = float4(10,0,0,1) ; + + //TODO: Figure out how to tie Amplify into using Texture2d and SamplerState instead of the bundled sampler2D. Forcing names for now. + //#if _ALBEDOMULTIPLY_ON + float4 albedo = float4(_BaseMap.SampleLevel(sampler_BaseMap, vInterpolated.texcoord.xy * _BaseMap_ST.xy + _BaseMap_ST.zw, 0 ).rgb , 1) ; + // #else + // float4 albedo = float4(1,1,1,1); + // #endif + + payload.color = float4( (_EmissionMap.SampleLevel(sampler_EmissionMap, vInterpolated.texcoord * _BaseMap_ST.xy + _BaseMap_ST.zw,0) ).rgb * _EmissionColor.rgb * albedo.rgb * _BakedMutiplier , 1 ); + // #else + // payload.color = float4(0,0,0,1); + + // #endif + } + ENDHLSL + + } + + + Pass + { + + Name "Universal2D" + Tags { "LightMode"="Universal2D" } + + Blend One Zero, One Zero + ColorMask RGBA + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_2D + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #pragma shader_feature_local_fragment _DETAILS_ON + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float4 ase_texcoord2 : TEXCOORD2; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _DetailMap_ST; + float4 _EmissionColor; + float4 _FluorescenceTint; + float4 _Absorbance; + float _AlbedotoFluorescence; + float _EmissionFalloff; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + TEXTURE2D(_DetailMap); + SAMPLER(sampler_DetailMap); + TEXTURE2D(_Fluorescence); + SAMPLER(sampler_Fluorescence); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID( v ); + UNITY_TRANSFER_INSTANCE_ID( v, o ); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + o.ase_texcoord2.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord2.zw = 0; + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 uv_BaseMap = IN.ase_texcoord2.xy * _BaseMap_ST.xy + _BaseMap_ST.zw; + float4 temp_output_21_0_g1 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ); + float4 temp_output_109_0_g170 = round( temp_output_21_0_g1 ); + float2 texCoord219_g1 = IN.ase_texcoord2.xy * float2( 1,1 ) + float2( 0,0 ); + float2 temp_output_218_0_g1 = texCoord219_g1; + float4 tex2DNode1_g1 = SAMPLE_TEXTURE2D( _DetailMap, sampler_DetailMap, ( ( temp_output_218_0_g1 * _DetailMap_ST.xy ) + _DetailMap_ST.zw ) ); + #ifdef _DETAILS_ON + float4 staticSwitch16_g1 = ( ( temp_output_109_0_g170 * ( 1.0 - ( ( 1.0 - temp_output_21_0_g1 ) * ( 1.0 - (tex2DNode1_g1.r).xxxx ) * 2.0 ) ) ) + ( ( 1.0 - temp_output_109_0_g170 ) * ( temp_output_21_0_g1 * (tex2DNode1_g1.r).xxxx * 2.0 ) ) ); + #else + float4 staticSwitch16_g1 = temp_output_21_0_g1; + #endif + float4 temp_output_16_0 = staticSwitch16_g1; + float4 tex2DNode14 = SAMPLE_TEXTURE2D( _Fluorescence, sampler_Fluorescence, uv_BaseMap ); + float4 lerpResult24 = lerp( temp_output_16_0 , float4( 0,0,0,0 ) , ( _AlbedotoFluorescence * tex2DNode14 )); + + + float3 Albedo = lerpResult24.rgb; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + half4 color = half4( Albedo, Alpha ); + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + return color; + } + ENDHLSL + } + + + Pass + { + + Name "DepthNormals" + Tags { "LightMode"="DepthNormalsOnly" } + + ZWrite On + Blend One Zero + ZTest LEqual + ZWrite On + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + + #pragma shader_feature_local_fragment _DETAILS_ON + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float3 worldNormal : TEXCOORD2; + float4 worldTangent : TEXCOORD3; + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _DetailMap_ST; + float4 _EmissionColor; + float4 _FluorescenceTint; + float4 _Absorbance; + float _AlbedotoFluorescence; + float _EmissionFalloff; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BumpMap); + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BumpMap); + TEXTURE2D(_DetailMap); + SAMPLER(sampler_DetailMap); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord4.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal( v.ase_normal ); + float4 tangentWS = float4(TransformObjectToWorldDir( v.ase_tangent.xyz), v.ase_tangent.w); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.worldNormal = normalWS; + o.worldTangent = tangentWS; + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + float3 WorldNormal = IN.worldNormal; + float4 WorldTangent = IN.worldTangent; + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 uv_BaseMap = IN.ase_texcoord4.xy * _BaseMap_ST.xy + _BaseMap_ST.zw; + float3 tex2DNode11 = UnpackNormalScale( SAMPLE_TEXTURE2D( _BumpMap, sampler_BumpMap, uv_BaseMap ), 1.0f ); + float4 temp_output_22_0_g1 = float4( tex2DNode11 , 0.0 ); + float2 texCoord219_g1 = IN.ase_texcoord4.xy * float2( 1,1 ) + float2( 0,0 ); + float2 temp_output_218_0_g1 = texCoord219_g1; + float4 tex2DNode1_g1 = SAMPLE_TEXTURE2D( _DetailMap, sampler_DetailMap, ( ( temp_output_218_0_g1 * _DetailMap_ST.xy ) + _DetailMap_ST.zw ) ); + float2 temp_output_57_0_g1 = (tex2DNode1_g1).ga; + float2 break79_g1 = temp_output_57_0_g1; + float3 appendResult56_g1 = (float3(break79_g1.y , break79_g1.x , 1.0)); + float3 temp_cast_2 = (1.0).xxx; + #ifdef _DETAILS_ON + float4 staticSwitch26_g1 = float4( BlendNormal( temp_output_22_0_g1.rgb , ( ( appendResult56_g1 * 2.0 ) - temp_cast_2 ) ) , 0.0 ); + #else + float4 staticSwitch26_g1 = temp_output_22_0_g1; + #endif + float4 temp_output_16_25 = staticSwitch26_g1; + + float3 Normal = temp_output_16_25.rgb; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + #if defined(_GBUFFER_NORMALS_OCT) + float2 octNormalWS = PackNormalOctQuadEncode(WorldNormal); + float2 remappedOctNormalWS = saturate(octNormalWS * 0.5 + 0.5); + half3 packedNormalWS = PackFloat2To888(remappedOctNormalWS); + return half4(packedNormalWS, 0.0); + #else + + #if defined(_NORMALMAP) + #if _NORMAL_DROPOFF_TS + float crossSign = (WorldTangent.w > 0.0 ? 1.0 : -1.0) * GetOddNegativeScale(); + float3 bitangent = crossSign * cross(WorldNormal.xyz, WorldTangent.xyz); + float3 normalWS = TransformTangentToWorld(Normal, half3x3(WorldTangent.xyz, bitangent, WorldNormal.xyz)); + #elif _NORMAL_DROPOFF_OS + float3 normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + float3 normalWS = Normal; + #endif + #else + float3 normalWS = WorldNormal; + #endif + + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + #endif + } + ENDHLSL + } + + /*ase_pass*/ + Pass + { + + Name "GBuffer" + Tags{"LightMode" = "None" } + + Blend One Zero + ColorMask RGBA + /*ase_stencil*/ + + HLSLPROGRAM +/*ase_pragma_before*/ +#if FALSE + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile _ DYNAMICLIGHTMAP_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE + //_MAIN_LIGHT_SHADOWS_SCREEN + + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION + + #pragma multi_compile_fragment _ _SHADOWS_SOFT + #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING + #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE + //#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile _ _GBUFFER_NORMALS_OCT + //#pragma multi_compile_fragment _ _LIGHT_LAYERS + #pragma multi_compile _ _RENDER_PASS_ENABLED + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_GBUFFER + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl" + + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + /*ase_pragma*/ + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vdata:p=p;n=n;t=t;uv0=tc0;uv1=tc1;uv2=tc2*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + /*ase_interp(8,):sp=sp;sc=tc2;wn.xyz=tc3.xyz;wt.xyz=tc4.xyz;wbt.xyz=tc5.xyz;wp.x=tc3.w;wp.y=tc4.w;wp.z=tc5.w;spu=tc6*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + /*ase_srp_batcher*/ + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + /*ase_globals*/ + + /*ase_funcs*/ + + VertexOutput VertexFunction( VertexInput v /*ase_vert_input*/ ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + /*ase_vert_code:v=VertexInput;o=VertexOutput*/ + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = /*ase_vert_out:Vertex Offset;Float3;8;-1;_Vertex*/defaultVertexValue/*end*/; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = /*ase_vert_out:Vertex Normal;Float3;10;-1;_Normal*/v.ase_normal/*end*/; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vcontrol*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + /*ase_control_code:v=VertexInput;o=VertexControl*/ + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + /*ase_domain_code:patch=VertexControl;o=VertexInput;bary=SV_DomainLocation*/ + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + FragmentOutput frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + /*ase_frag_input*/ ) + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #else + ShadowCoords = float4(0, 0, 0, 0); + #endif + + + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + /*ase_frag_code:IN=VertexOutput*/ + float3 Albedo = /*ase_frag_out:Albedo;Float3;0;-1;_Albedo*/float3(0.5, 0.5, 0.5)/*end*/; + float3 Normal = /*ase_frag_out:Normal;Float3;1;-1;_FragNormal*/float3(0, 0, 1)/*end*/; + float3 Emission = /*ase_frag_out:Emission;Float3;2;-1;_Emission*/0/*end*/; + float3 Specular = /*ase_frag_out:Specular;Float3;9;-1;_Specular*/0.5/*end*/; + float Metallic = /*ase_frag_out:Metallic;Float;3;-1;_Metallic*/0/*end*/; + float Smoothness = /*ase_frag_out:Smoothness;Float;4;-1;_Smoothness*/0.5/*end*/; + float Occlusion = /*ase_frag_out:Occlusion;Float;5;-1;_Occlusion*/1/*end*/; + float Alpha = /*ase_frag_out:Alpha;Float;6;-1;_Alpha*/1/*end*/; + float AlphaClipThreshold = /*ase_frag_out:Alpha Clip Threshold;Float;7;-1;_AlphaClip*/0.5/*end*/; + float AlphaClipThresholdShadow = /*ase_frag_out:Alpha Clip Threshold Shadow;Float;16;-1;_AlphaClipShadow*/0.5/*end*/; + float3 BakedGI = /*ase_frag_out:Baked GI;Float3;11;-1;_BakedGI*/0/*end*/; + float3 RefractionColor = /*ase_frag_out:Refraction Color;Float3;12;-1;_RefractionColor*/1/*end*/; + float RefractionIndex = /*ase_frag_out:Refraction Index;Float;13;-1;_RefractionIndex*/1/*end*/; + float3 Transmission = /*ase_frag_out:Transmission;Float3;14;-1;_Transmission*/1/*end*/; + float3 Translucency = /*ase_frag_out:Translucency;Float3;15;-1;_Translucency*/1/*end*/; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = /*ase_frag_out:Depth Value;Float;17;-1;_DepthValue*/0/*end*/; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.positionCS = IN.clipPos; + inputData.shadowCoord = ShadowCoords; + + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + #else + inputData.normalWS = WorldNormal; + #endif + + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + inputData.viewDirectionWS = SafeNormalize( WorldViewDirection ); + + + + #ifdef ASE_FOG + inputData.fogCoord = InitializeInputDataFog(float4(WorldPosition, 1.0), IN.fogFactorAndVertexLight.x); + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw; + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #else + #if defined(DYNAMICLIGHTMAP_ON) + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, SH, inputData.normalWS); + #else + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, SH, inputData.normalWS ); + #endif + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + #ifdef _DBUFFER + ApplyDecal(IN.clipPos, + Albedo, + Specular, + inputData.normalWS, + Metallic, + Occlusion, + Smoothness); + #endif + + BRDFData brdfData; + InitializeBRDFData + (Albedo, Metallic, Specular, Smoothness, Alpha, brdfData); + + Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, inputData.shadowMask); + half4 color; + MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, inputData.shadowMask); + color.rgb = GlobalIllumination(brdfData, inputData.bakedGI, Occlusion, inputData.positionWS, inputData.normalWS, inputData.viewDirectionWS); + color.a = Alpha; + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, IN.fogFactorAndVertexLight.x); + #endif + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return BRDFDataToGbuffer(brdfData, inputData, Smoothness, Emission + color.rgb); + } +#endif + ENDHLSL + } + + + + Pass + { + + Name "SceneSelectionPass" + Tags { "LightMode"="SceneSelectionPass" } + + Cull Off + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _DetailMap_ST; + float4 _EmissionColor; + float4 _FluorescenceTint; + float4 _Absorbance; + float _AlbedotoFluorescence; + float _EmissionFalloff; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + int _ObjectId; + int _PassValue; + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = half4(_ObjectId, _PassValue, 1.0, 1.0); + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "ScenePickingPass" + Tags { "LightMode"="Picking" } + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _DetailMap_ST; + float4 _EmissionColor; + float4 _FluorescenceTint; + float4 _Absorbance; + float _AlbedotoFluorescence; + float _EmissionFalloff; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + + float4 _SelectionID; + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = 0; + outColor = _SelectionID; + + return outColor; + } + + ENDHLSL + } + + } + + CustomEditor "UnityEditor.ShaderGraphLitGUI" + Fallback "Hidden/InternalErrorShader" + +} +/*ASEBEGIN +Version=18935 +298;327;1906;1013;1833.764;333.6301;1;True;True +Node;AmplifyShaderEditor.SamplerNode;10;-601.7855,-199.5828;Inherit;True;Property;_BaseMap;Base Map;0;0;Create;False;0;0;0;False;0;False;-1;None;4a2e2c582c6152344b543594adcaf736;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SaturateNode;39;749.2825,908.504;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;19;-553.2972,522.168;Inherit;False;Property;_FluorescenceTint;Fluorescence Tint;3;0;Create;True;0;0;0;False;0;False;1,1,1,1;1,1,1,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;25;-129.8595,567.0112;Inherit;False;2;2;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;21;-555.801,439.5413;Inherit;False;Property;_AlbedotoFluorescence;Albedo to Fluorescence;2;0;Create;True;0;0;0;False;0;False;1;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;28;509.9995,658.6445;Inherit;False;Property;_EmissionColor;EmissionColor;8;1;[HDR];Create;True;0;0;0;False;0;False;0,0,0,0;0.1320755,0.1320755,0.1320755,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.ViewDirInputsCoordNode;30;108.8457,977.0601;Inherit;False;World;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.WorldNormalVector;38;88.84518,824.4688;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.DotProductOpNode;31;311.6371,952.2789;Inherit;True;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;18;51.41707,346.4341;Inherit;True;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.ColorNode;15;-512.9699,897.4257;Inherit;False;Property;_Absorbance;Absorbance;4;0;Create;True;0;0;0;False;0;False;0,0.1875,0.929,1;0,0.1874999,0.929,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;36;347.6555,1260.693;Inherit;False;Property;_EmissionFalloff;EmissionFalloff;15;0;Create;True;0;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.CustomExpressionNode;17;-277.2696,103.3686;Inherit;False;return saturate( smooth1 + smooth2 - 1)@;1;Create;2;True;smooth1;FLOAT;0;In;;Inherit;False;True;smooth2;FLOAT;0;In;;Inherit;False;My Custom Expression;True;False;0;;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;12;-598.5559,207.799;Inherit;True;Property;_MetallicGlossMap;MAS;5;1;[NoScaleOffset];Create;False;0;0;0;False;0;False;-1;None;132961454852db9449638c8ef0e57786;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.LerpOp;24;136.1732,67.49464;Inherit;True;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.FunctionNode;16;-137.3702,-56.82171;Inherit;False;Detail Map;9;;1;c1327834c5e6d22468ff566e8f35a321;0;4;21;COLOR;1,1,1,1;False;22;COLOR;0,0,1,0;False;23;FLOAT;0.5;False;218;FLOAT2;0,0;False;3;COLOR;0;COLOR;25;FLOAT;24 +Node;AmplifyShaderEditor.PowerNode;34;539.2812,1028.813;Inherit;True;False;2;0;FLOAT;0;False;1;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.LerpOp;20;-113.0252,243.6415;Inherit;False;3;0;COLOR;1,1,1,1;False;1;COLOR;0,0,0,0;False;2;FLOAT;1;False;1;COLOR;0 +Node;AmplifyShaderEditor.SamplerNode;14;-596.6281,693.1221;Inherit;True;Property;_Fluorescence;Fluorescence;1;1;[NoScaleOffset];Create;True;0;0;0;False;0;False;-1;None;0b3941e9220e3944a9b2cc23007a65c0;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SamplerNode;27;508.1717,448.9693;Inherit;True;Property;_EmissionMap;EmissionMap;7;1;[NoScaleOffset];Create;True;0;0;0;False;0;False;-1;None;0b3941e9220e3944a9b2cc23007a65c0;True;0;False;black;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;29;888.4446,410.9026;Inherit;False;4;4;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;3;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SamplerNode;11;-599.349,7.815605;Inherit;True;Property;_BumpMap;Normal map;6;2;[NoScaleOffset];[Normal];Create;False;0;0;0;False;0;False;-1;None;7b90612d0f9d1664e803dca742b9ad46;True;0;True;bump;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;35;891.5758,632.2701;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;13;-1235.268,20.01114;Inherit;False;0;10;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;3;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthOnly;0;3;DepthOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;False;False;True;1;LightMode=DepthOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;2;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ShadowCaster;0;2;ShadowCaster;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=ShadowCaster;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;9;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ScenePickingPass;0;9;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;6;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthNormals;0;6;DepthNormals;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormalsOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;8;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;SceneSelectionPass;0;8;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;5;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Universal2D;0;5;Universal2D;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;4;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Meta;0;4;Meta;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Meta;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;0;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ExtraPrePass;0;0;ExtraPrePass;5;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;0;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;7;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;GBuffer;0;7;GBuffer;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalGBuffer;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;1;1265.567,48.64588;Half;False;True;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;SLZ/Fluorescence;94348b07e5e8bab40bd6c8a1e3df54cd;True;Forward;0;1;Forward;23;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalForwardOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;48;Workflow;1;0;Surface;0;0; Refraction Model;0;0; Blend;0;0;Two Sided;1;0;Fragment Normal Space,InvertActionOnDeselection;0;0;Transmission;0;0; Transmission Shadow;0.5,False,-1;0;Translucency;0;0; Translucency Strength;1,False,-1;0; Normal Distortion;0.5,False,-1;0; Scattering;2,False,-1;0; Direct;0.9,False,-1;0; Ambient;0.1,False,-1;0; Shadow;0.5,False,-1;0;Cast Shadows;1;0; Use Shadow Threshold;0;0;Receive Shadows;1;0;GPU Instancing;0;0;LOD CrossFade;0;0;Built-in Fog;1;0;Lightmaps;1;0;Volumetrics;1;0;Decals;0;0;Screen Space Occlusion;1;0;Reflection Probe Blend/Projection;1;0;Light Layers;0;0;_FinalColorxAlpha;0;0;Meta Pass;1;0;GBuffer Pass;0;0;Override Baked GI;0;0;Extra Pre Pass;0;0;DOTS Instancing;0;0;Tessellation;0;0; Phong;0;0; Strength;0.5,False,-1;0; Type;0;0; Tess;16,False,-1;0; Min;10,False,-1;0; Max;25,False,-1;0; Edge Length;16,False,-1;0; Max Displacement;25,False,-1;0;Write Depth;0;0; Early Z;0;0;Vertex Position,InvertActionOnDeselection;1;0;Debug Display;0;0;Clear Coat;0;0;Fluorescence;1;637956974339123413;0;10;False;True;True;True;True;True;True;False;True;True;False;;True;0 +WireConnection;10;1;13;0 +WireConnection;39;0;34;0 +WireConnection;25;0;21;0 +WireConnection;25;1;14;0 +WireConnection;38;0;16;25 +WireConnection;31;0;30;0 +WireConnection;31;1;38;0 +WireConnection;18;0;14;0 +WireConnection;18;1;19;0 +WireConnection;18;2;20;0 +WireConnection;17;0;11;3 +WireConnection;17;1;12;3 +WireConnection;12;1;13;0 +WireConnection;24;0;16;0 +WireConnection;24;2;25;0 +WireConnection;16;21;10;0 +WireConnection;16;22;11;0 +WireConnection;16;23;17;0 +WireConnection;34;0;31;0 +WireConnection;34;1;36;0 +WireConnection;20;1;16;0 +WireConnection;20;2;21;0 +WireConnection;14;1;13;0 +WireConnection;27;1;13;0 +WireConnection;29;0;27;0 +WireConnection;29;1;28;0 +WireConnection;29;2;16;0 +WireConnection;29;3;39;0 +WireConnection;11;1;13;0 +WireConnection;35;0;27;0 +WireConnection;35;1;28;0 +WireConnection;35;2;16;0 +WireConnection;1;0;24;0 +WireConnection;1;1;16;25 +WireConnection;1;2;29;0 +WireConnection;1;20;35;0 +WireConnection;1;3;12;1 +WireConnection;1;4;16;24 +WireConnection;1;5;12;2 +WireConnection;1;21;18;0 +WireConnection;1;22;15;0 +ASEEND*/ +//CHKSM=308FF68453A182A37D42E29F3590C47D31935B4E \ No newline at end of file diff --git a/Assets/SLZShaders/Fluorescence.shader.meta b/Assets/SLZShaders/Fluorescence.shader.meta new file mode 100644 index 0000000..ebc852e --- /dev/null +++ b/Assets/SLZShaders/Fluorescence.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: e95b31b7241745c479b6b9574209d1f9 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/ForceField.shader b/Assets/SLZShaders/ForceField.shader new file mode 100644 index 0000000..ad915bd --- /dev/null +++ b/Assets/SLZShaders/ForceField.shader @@ -0,0 +1,2397 @@ +// Made with Amplify Shader Editor +// Available at the Unity Asset Store - http://u3d.as/y3X +Shader "SLZ/ForceField" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1) + [ASEBegin][HDR]_Color("Color", Color) = (1,1,1,0) + [HDR]_EdgeColor("Edge Color", Color) = (1,1,1,0) + _EdgeDistance("Edge Distance", Float) = 0.1 + _Normal("Normal", 2D) = "bump" {} + _NormalScale("Normal Scale", Float) = 1 + _TimeScaler("Time Scaler", Float) = 0 + _Vector0("Vector 0", Vector) = (1,1,0,0) + [ASEEnd]_NoiseDefusion("Noise Defusion", Float) = 0 + + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5 + //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16 + //_TessMin( "Tess Min Distance", Float ) = 10 + //_TessMax( "Tess Max Distance", Float ) = 25 + //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16 + //_TessMaxDisp( "Tess Max Displacement", Float ) = 25 + } + + SubShader + { + LOD 0 + + + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Transparent" "Queue"="Transparent" } + + Cull Off + AlphaToMask Off + + HLSLINCLUDE + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma target 5.0 + + //#pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + + + #ifndef ASE_TESS_FUNCS + #define ASE_TESS_FUNCS + float4 FixedTess( float tessValue ) + { + return tessValue; + } + + float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos ) + { + float3 wpos = mul(o2w,vertex).xyz; + float dist = distance (wpos, cameraPos); + float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess; + return f; + } + + float4 CalcTriEdgeTessFactors (float3 triVertexFactors) + { + float4 tess; + tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z); + tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z); + tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y); + tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f; + return tess; + } + + float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams ) + { + float dist = distance (0.5 * (wpos0+wpos1), cameraPos); + float len = distance(wpos0, wpos1); + float f = max(len * scParams.y / (edgeLen * dist), 1.0); + return f; + } + + float DistanceFromPlane (float3 pos, float4 plane) + { + float d = dot (float4(pos,1.0f), plane); + return d; + } + + bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] ) + { + float4 planeTest; + planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f ); + return !all (planeTest); + } + + float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos ) + { + float3 f; + f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos); + f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos); + f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos); + + return CalcTriEdgeTessFactors (f); + } + + float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + return tess; + } + + float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + + if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes)) + { + tess = 0.0f; + } + else + { + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + } + return tess; + } + #endif //ASE_TESS_FUNCS + + ENDHLSL + + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForwardOnly" } + + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + ZWrite Off + ZTest LEqual + Offset 0 , 0 + ColorMask RGBA + + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #define ASE_SRP_VERSION 999999 + #define REQUIRE_DEPTH_TEXTURE 1 + + + //#pragma multi_compile _ LIGHTMAP_ON + //#pragma multi_compile _ DIRLIGHTMAP_COMBINED + //#pragma shader_feature _ _SAMPLE_GI + //#pragma multi_compile _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + //#pragma multi_compile _ DEBUG_DISPLAY + #define SHADERPASS SHADERPASS_UNLIT + + + #pragma vertex vert + #pragma fragment frag + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/Debugging3D.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceData.hlsl" + + + #define ASE_NEEDS_FRAG_WORLD_POSITION + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + #ifdef ASE_FOG + float fogFactor : TEXCOORD2; + #endif + float4 ase_texcoord3 : TEXCOORD3; + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Vector0; + float4 _Color; + float4 _EdgeColor; + float _TimeScaler; + float _NormalScale; + float _NoiseDefusion; + float _EdgeDistance; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _Normal; + uniform float4 _CameraDepthTexture_TexelSize; + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g4( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + float3 MyCustomExpression1_g8( float2 uv, float level ) + { + return SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv),level).rgb; + } + + + VertexOutput VertexFunction ( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord3 = screenPos; + + o.ase_texcoord4.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + #ifdef ASE_FOG + o.fogFactor = ComputeFogFactor( positionCS.z ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag ( VertexOutput IN ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + float localMyCustomExpression1_g9 = ( 0.0 ); + float4 screenPos = IN.ase_texcoord3; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float mulTime31 = _TimeParameters.x * _TimeScaler; + float2 texCoord30 = IN.ase_texcoord4.xy * (_Vector0).xy + ( (_Vector0).zw * mulTime31 ); + float3 unpack26 = UnpackNormalScale( tex2D( _Normal, texCoord30 ), _NormalScale ); + unpack26.z = lerp( 1, unpack26.z, saturate(_NormalScale) ); + float2 screenUV27_g4 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g4 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g4 = GetScreenNoiseRGBASlice27_g4( screenUV27_g4 , offsetFrame27_g4 ); + float3 temp_output_57_0 = (localGetScreenNoiseRGBASlice27_g4).xyz; + float3 temp_output_60_0 = ( temp_output_57_0 - float3( 0.5,0.5,0.5 ) ); + float3 temp_output_64_0 = ( unpack26 + ( temp_output_60_0 * _NoiseDefusion * 2.0 ) ); + float4 ase_screenPosNorm = screenPos / screenPos.w; + ase_screenPosNorm.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? ase_screenPosNorm.z : ase_screenPosNorm.z * 0.5 + 0.5; + float screenDepth14 = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH( ase_screenPosNorm.xy ),_ZBufferParams); + float distanceDepth14 = saturate( ( screenDepth14 - LinearEyeDepth( ase_screenPosNorm.z,_ZBufferParams ) ) / ( _EdgeDistance ) ); + float temp_output_15_0 = ( 1.0 - distanceDepth14 ); + float2 uv1_g8 = ( ase_grabScreenPosNorm + float4( ( temp_output_64_0 * ( 1.0 - temp_output_15_0 ) ) , 0.0 ) ).xy; + float level1_g8 = 0.0; + float3 localMyCustomExpression1_g8 = MyCustomExpression1_g8( uv1_g8 , level1_g8 ); + float4 appendResult98 = (float4((( ( float4( localMyCustomExpression1_g8 , 0.0 ) * _Color ) + ( ( temp_output_15_0 * temp_output_15_0 * temp_output_15_0 ) * _EdgeColor ) )).rgb , 1.0)); + float3 lerpResult105 = lerp( float3( 0,0,0 ) , temp_output_57_0 , ( 1.0 - _Color ).rgb); + float3 break94 = lerpResult105; + float2 temp_output_74_0 = abs( (temp_output_64_0).xy ); + float4 appendResult100 = (float4((( _Color * float4( temp_output_60_0 , 0.0 ) )).rgb , saturate( ( max( max( break94.x , break94.y ) , break94.z ) + saturate( max( ( temp_output_74_0 * 30.0 ).x , 0.0 ) ) ) ))); + #ifdef SHADER_API_MOBILE + float4 staticSwitch113 = appendResult100; + #else + float4 staticSwitch113 = appendResult98; + #endif + float4 color1_g9 = staticSwitch113; + float3 WorldSpacePosition1_g9 = WorldPosition; + { + color1_g9 = Volumetrics(color1_g9, WorldSpacePosition1_g9); + } + + float3 BakedAlbedo = 0; + float3 BakedEmission = 0; + float3 Color = color1_g9.xyz; + float Alpha = (staticSwitch113).w; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + + #ifdef _ALPHATEST_ON + clip( Alpha - AlphaClipThreshold ); + #endif + + #if defined(_DBUFFER) + ApplyDecalToBaseColor(IN.clipPos, Color); + #endif + + #if defined(_ALPHAPREMULTIPLY_ON) + Color *= Alpha; + #endif + + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_FOG + Color = MixFog( Color, IN.fogFactor ); + #endif + + return half4( Color, Alpha ); + } + + ENDHLSL + } + + + Pass + { + + Name "DepthOnly" + Tags { "LightMode"="DepthOnly" } + + ZWrite On + ColorMask 0 + AlphaToMask Off + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #define ASE_SRP_VERSION 999999 + #define REQUIRE_DEPTH_TEXTURE 1 + + + #pragma vertex vert + #pragma fragment frag + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float4 ase_texcoord2 : TEXCOORD2; + float4 ase_texcoord3 : TEXCOORD3; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Vector0; + float4 _Color; + float4 _EdgeColor; + float _TimeScaler; + float _NormalScale; + float _NoiseDefusion; + float _EdgeDistance; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _Normal; + uniform float4 _CameraDepthTexture_TexelSize; + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g4( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + float3 MyCustomExpression1_g8( float2 uv, float level ) + { + return SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv),level).rgb; + } + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord2 = screenPos; + + o.ase_texcoord3.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord3.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.clipPos = TransformWorldToHClip( positionWS ); + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = o.clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float4 screenPos = IN.ase_texcoord2; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float mulTime31 = _TimeParameters.x * _TimeScaler; + float2 texCoord30 = IN.ase_texcoord3.xy * (_Vector0).xy + ( (_Vector0).zw * mulTime31 ); + float3 unpack26 = UnpackNormalScale( tex2D( _Normal, texCoord30 ), _NormalScale ); + unpack26.z = lerp( 1, unpack26.z, saturate(_NormalScale) ); + float2 screenUV27_g4 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g4 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g4 = GetScreenNoiseRGBASlice27_g4( screenUV27_g4 , offsetFrame27_g4 ); + float3 temp_output_57_0 = (localGetScreenNoiseRGBASlice27_g4).xyz; + float3 temp_output_60_0 = ( temp_output_57_0 - float3( 0.5,0.5,0.5 ) ); + float3 temp_output_64_0 = ( unpack26 + ( temp_output_60_0 * _NoiseDefusion * 2.0 ) ); + float4 ase_screenPosNorm = screenPos / screenPos.w; + ase_screenPosNorm.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? ase_screenPosNorm.z : ase_screenPosNorm.z * 0.5 + 0.5; + float screenDepth14 = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH( ase_screenPosNorm.xy ),_ZBufferParams); + float distanceDepth14 = saturate( ( screenDepth14 - LinearEyeDepth( ase_screenPosNorm.z,_ZBufferParams ) ) / ( _EdgeDistance ) ); + float temp_output_15_0 = ( 1.0 - distanceDepth14 ); + float2 uv1_g8 = ( ase_grabScreenPosNorm + float4( ( temp_output_64_0 * ( 1.0 - temp_output_15_0 ) ) , 0.0 ) ).xy; + float level1_g8 = 0.0; + float3 localMyCustomExpression1_g8 = MyCustomExpression1_g8( uv1_g8 , level1_g8 ); + float4 appendResult98 = (float4((( ( float4( localMyCustomExpression1_g8 , 0.0 ) * _Color ) + ( ( temp_output_15_0 * temp_output_15_0 * temp_output_15_0 ) * _EdgeColor ) )).rgb , 1.0)); + float3 lerpResult105 = lerp( float3( 0,0,0 ) , temp_output_57_0 , ( 1.0 - _Color ).rgb); + float3 break94 = lerpResult105; + float2 temp_output_74_0 = abs( (temp_output_64_0).xy ); + float4 appendResult100 = (float4((( _Color * float4( temp_output_60_0 , 0.0 ) )).rgb , saturate( ( max( max( break94.x , break94.y ) , break94.z ) + saturate( max( ( temp_output_74_0 * 30.0 ).x , 0.0 ) ) ) ))); + #ifdef SHADER_API_MOBILE + float4 staticSwitch113 = appendResult100; + #else + float4 staticSwitch113 = appendResult98; + #endif + + float Alpha = (staticSwitch113).w; + float AlphaClipThreshold = 0.5; + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + return 0; + } + ENDHLSL + } + + + Pass + { + + Name "Universal2D" + Tags { "LightMode"="Universal2D" } + + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + ZWrite Off + ZTest LEqual + Offset 0 , 0 + ColorMask RGBA + + + HLSLPROGRAM +#pragma multi_compile_instancing#define _RECEIVE_SHADOWS_OFF 1#define ASE_SRP_VERSION 999999#define REQUIRE_DEPTH_TEXTURE 1 +#if FALSE + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma shader_feature _ _SAMPLE_GI + #pragma multi_compile _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile _ DEBUG_DISPLAY + #define SHADERPASS SHADERPASS_UNLIT + + + #pragma vertex vert + #pragma fragment frag + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/Debugging3D.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceData.hlsl" + + + #define ASE_NEEDS_FRAG_WORLD_POSITION + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + #ifdef ASE_FOG + float fogFactor : TEXCOORD2; + #endif + float4 ase_texcoord3 : TEXCOORD3; + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Vector0; + float4 _Color; + float4 _EdgeColor; + float _TimeScaler; + float _NormalScale; + float _NoiseDefusion; + float _EdgeDistance; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _Normal; + uniform float4 _CameraDepthTexture_TexelSize; + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g4( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + float3 MyCustomExpression1_g8( float2 uv, float level ) + { + return SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv),level).rgb; + } + + + VertexOutput VertexFunction ( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord3 = screenPos; + + o.ase_texcoord4.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + #ifdef ASE_FOG + o.fogFactor = ComputeFogFactor( positionCS.z ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag ( VertexOutput IN ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + float localMyCustomExpression1_g9 = ( 0.0 ); + float4 screenPos = IN.ase_texcoord3; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float mulTime31 = _TimeParameters.x * _TimeScaler; + float2 texCoord30 = IN.ase_texcoord4.xy * (_Vector0).xy + ( (_Vector0).zw * mulTime31 ); + float3 unpack26 = UnpackNormalScale( tex2D( _Normal, texCoord30 ), _NormalScale ); + unpack26.z = lerp( 1, unpack26.z, saturate(_NormalScale) ); + float2 screenUV27_g4 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g4 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g4 = GetScreenNoiseRGBASlice27_g4( screenUV27_g4 , offsetFrame27_g4 ); + float3 temp_output_57_0 = (localGetScreenNoiseRGBASlice27_g4).xyz; + float3 temp_output_60_0 = ( temp_output_57_0 - float3( 0.5,0.5,0.5 ) ); + float3 temp_output_64_0 = ( unpack26 + ( temp_output_60_0 * _NoiseDefusion * 2.0 ) ); + float4 ase_screenPosNorm = screenPos / screenPos.w; + ase_screenPosNorm.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? ase_screenPosNorm.z : ase_screenPosNorm.z * 0.5 + 0.5; + float screenDepth14 = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH( ase_screenPosNorm.xy ),_ZBufferParams); + float distanceDepth14 = saturate( ( screenDepth14 - LinearEyeDepth( ase_screenPosNorm.z,_ZBufferParams ) ) / ( _EdgeDistance ) ); + float temp_output_15_0 = ( 1.0 - distanceDepth14 ); + float2 uv1_g8 = ( ase_grabScreenPosNorm + float4( ( temp_output_64_0 * ( 1.0 - temp_output_15_0 ) ) , 0.0 ) ).xy; + float level1_g8 = 0.0; + float3 localMyCustomExpression1_g8 = MyCustomExpression1_g8( uv1_g8 , level1_g8 ); + float4 appendResult98 = (float4((( ( float4( localMyCustomExpression1_g8 , 0.0 ) * _Color ) + ( ( temp_output_15_0 * temp_output_15_0 * temp_output_15_0 ) * _EdgeColor ) )).rgb , 1.0)); + float3 lerpResult105 = lerp( float3( 0,0,0 ) , temp_output_57_0 , ( 1.0 - _Color ).rgb); + float3 break94 = lerpResult105; + float2 temp_output_74_0 = abs( (temp_output_64_0).xy ); + float4 appendResult100 = (float4((( _Color * float4( temp_output_60_0 , 0.0 ) )).rgb , saturate( ( max( max( break94.x , break94.y ) , break94.z ) + saturate( max( ( temp_output_74_0 * 30.0 ).x , 0.0 ) ) ) ))); + #ifdef SHADER_API_MOBILE + float4 staticSwitch113 = appendResult100; + #else + float4 staticSwitch113 = appendResult98; + #endif + float4 color1_g9 = staticSwitch113; + float3 WorldSpacePosition1_g9 = WorldPosition; + { + color1_g9 = Volumetrics(color1_g9, WorldSpacePosition1_g9); + } + + float3 BakedAlbedo = 0; + float3 BakedEmission = 0; + float3 Color = color1_g9.xyz; + float Alpha = (staticSwitch113).w; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + + #ifdef _ALPHATEST_ON + clip( Alpha - AlphaClipThreshold ); + #endif + + #if defined(_DBUFFER) + ApplyDecalToBaseColor(IN.clipPos, Color); + #endif + + #if defined(_ALPHAPREMULTIPLY_ON) + Color *= Alpha; + #endif + + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_FOG + Color = MixFog( Color, IN.fogFactor ); + #endif + + return half4( Color, Alpha ); + } +#endif + ENDHLSL + } + + + + Pass + { + + Name "SceneSelectionPass" + Tags { "LightMode"="SceneSelectionPass" } + + Cull Off + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #define ASE_SRP_VERSION 999999 + #define REQUIRE_DEPTH_TEXTURE 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 ase_texcoord : TEXCOORD0; + float4 ase_texcoord1 : TEXCOORD1; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Vector0; + float4 _Color; + float4 _EdgeColor; + float _TimeScaler; + float _NormalScale; + float _NoiseDefusion; + float _EdgeDistance; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + sampler2D _Normal; + uniform float4 _CameraDepthTexture_TexelSize; + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g4( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + float3 MyCustomExpression1_g8( float2 uv, float level ) + { + return SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv),level).rgb; + } + + + int _ObjectId; + int _PassValue; + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord = screenPos; + + o.ase_texcoord1.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord1.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + float4 screenPos = IN.ase_texcoord; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float mulTime31 = _TimeParameters.x * _TimeScaler; + float2 texCoord30 = IN.ase_texcoord1.xy * (_Vector0).xy + ( (_Vector0).zw * mulTime31 ); + float3 unpack26 = UnpackNormalScale( tex2D( _Normal, texCoord30 ), _NormalScale ); + unpack26.z = lerp( 1, unpack26.z, saturate(_NormalScale) ); + float2 screenUV27_g4 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g4 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g4 = GetScreenNoiseRGBASlice27_g4( screenUV27_g4 , offsetFrame27_g4 ); + float3 temp_output_57_0 = (localGetScreenNoiseRGBASlice27_g4).xyz; + float3 temp_output_60_0 = ( temp_output_57_0 - float3( 0.5,0.5,0.5 ) ); + float3 temp_output_64_0 = ( unpack26 + ( temp_output_60_0 * _NoiseDefusion * 2.0 ) ); + float4 ase_screenPosNorm = screenPos / screenPos.w; + ase_screenPosNorm.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? ase_screenPosNorm.z : ase_screenPosNorm.z * 0.5 + 0.5; + float screenDepth14 = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH( ase_screenPosNorm.xy ),_ZBufferParams); + float distanceDepth14 = saturate( ( screenDepth14 - LinearEyeDepth( ase_screenPosNorm.z,_ZBufferParams ) ) / ( _EdgeDistance ) ); + float temp_output_15_0 = ( 1.0 - distanceDepth14 ); + float2 uv1_g8 = ( ase_grabScreenPosNorm + float4( ( temp_output_64_0 * ( 1.0 - temp_output_15_0 ) ) , 0.0 ) ).xy; + float level1_g8 = 0.0; + float3 localMyCustomExpression1_g8 = MyCustomExpression1_g8( uv1_g8 , level1_g8 ); + float4 appendResult98 = (float4((( ( float4( localMyCustomExpression1_g8 , 0.0 ) * _Color ) + ( ( temp_output_15_0 * temp_output_15_0 * temp_output_15_0 ) * _EdgeColor ) )).rgb , 1.0)); + float3 lerpResult105 = lerp( float3( 0,0,0 ) , temp_output_57_0 , ( 1.0 - _Color ).rgb); + float3 break94 = lerpResult105; + float2 temp_output_74_0 = abs( (temp_output_64_0).xy ); + float4 appendResult100 = (float4((( _Color * float4( temp_output_60_0 , 0.0 ) )).rgb , saturate( ( max( max( break94.x , break94.y ) , break94.z ) + saturate( max( ( temp_output_74_0 * 30.0 ).x , 0.0 ) ) ) ))); + #ifdef SHADER_API_MOBILE + float4 staticSwitch113 = appendResult100; + #else + float4 staticSwitch113 = appendResult98; + #endif + + surfaceDescription.Alpha = (staticSwitch113).w; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if _ALPHATEST_ON + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = half4(_ObjectId, _PassValue, 1.0, 1.0); + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "ScenePickingPass" + Tags { "LightMode"="Picking" } + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #define ASE_SRP_VERSION 999999 + #define REQUIRE_DEPTH_TEXTURE 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 ase_texcoord : TEXCOORD0; + float4 ase_texcoord1 : TEXCOORD1; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Vector0; + float4 _Color; + float4 _EdgeColor; + float _TimeScaler; + float _NormalScale; + float _NoiseDefusion; + float _EdgeDistance; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + sampler2D _Normal; + uniform float4 _CameraDepthTexture_TexelSize; + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g4( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + float3 MyCustomExpression1_g8( float2 uv, float level ) + { + return SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv),level).rgb; + } + + + + float4 _SelectionID; + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord = screenPos; + + o.ase_texcoord1.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord1.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + float4 screenPos = IN.ase_texcoord; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float mulTime31 = _TimeParameters.x * _TimeScaler; + float2 texCoord30 = IN.ase_texcoord1.xy * (_Vector0).xy + ( (_Vector0).zw * mulTime31 ); + float3 unpack26 = UnpackNormalScale( tex2D( _Normal, texCoord30 ), _NormalScale ); + unpack26.z = lerp( 1, unpack26.z, saturate(_NormalScale) ); + float2 screenUV27_g4 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g4 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g4 = GetScreenNoiseRGBASlice27_g4( screenUV27_g4 , offsetFrame27_g4 ); + float3 temp_output_57_0 = (localGetScreenNoiseRGBASlice27_g4).xyz; + float3 temp_output_60_0 = ( temp_output_57_0 - float3( 0.5,0.5,0.5 ) ); + float3 temp_output_64_0 = ( unpack26 + ( temp_output_60_0 * _NoiseDefusion * 2.0 ) ); + float4 ase_screenPosNorm = screenPos / screenPos.w; + ase_screenPosNorm.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? ase_screenPosNorm.z : ase_screenPosNorm.z * 0.5 + 0.5; + float screenDepth14 = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH( ase_screenPosNorm.xy ),_ZBufferParams); + float distanceDepth14 = saturate( ( screenDepth14 - LinearEyeDepth( ase_screenPosNorm.z,_ZBufferParams ) ) / ( _EdgeDistance ) ); + float temp_output_15_0 = ( 1.0 - distanceDepth14 ); + float2 uv1_g8 = ( ase_grabScreenPosNorm + float4( ( temp_output_64_0 * ( 1.0 - temp_output_15_0 ) ) , 0.0 ) ).xy; + float level1_g8 = 0.0; + float3 localMyCustomExpression1_g8 = MyCustomExpression1_g8( uv1_g8 , level1_g8 ); + float4 appendResult98 = (float4((( ( float4( localMyCustomExpression1_g8 , 0.0 ) * _Color ) + ( ( temp_output_15_0 * temp_output_15_0 * temp_output_15_0 ) * _EdgeColor ) )).rgb , 1.0)); + float3 lerpResult105 = lerp( float3( 0,0,0 ) , temp_output_57_0 , ( 1.0 - _Color ).rgb); + float3 break94 = lerpResult105; + float2 temp_output_74_0 = abs( (temp_output_64_0).xy ); + float4 appendResult100 = (float4((( _Color * float4( temp_output_60_0 , 0.0 ) )).rgb , saturate( ( max( max( break94.x , break94.y ) , break94.z ) + saturate( max( ( temp_output_74_0 * 30.0 ).x , 0.0 ) ) ) ))); + #ifdef SHADER_API_MOBILE + float4 staticSwitch113 = appendResult100; + #else + float4 staticSwitch113 = appendResult98; + #endif + + surfaceDescription.Alpha = (staticSwitch113).w; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if _ALPHATEST_ON + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = 0; + outColor = _SelectionID; + + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "DepthNormals" + Tags { "LightMode"="DepthNormalsOnly" } + + ZTest LEqual + ZWrite On + + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #define ASE_SRP_VERSION 999999 + #define REQUIRE_DEPTH_TEXTURE 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma multi_compile_fog + #pragma instancing_options renderinglayer + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define VARYINGS_NEED_NORMAL_WS + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float3 normalWS : TEXCOORD0; + float4 ase_texcoord1 : TEXCOORD1; + float4 ase_texcoord2 : TEXCOORD2; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Vector0; + float4 _Color; + float4 _EdgeColor; + float _TimeScaler; + float _NormalScale; + float _NoiseDefusion; + float _EdgeDistance; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _Normal; + uniform float4 _CameraDepthTexture_TexelSize; + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g4( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + float3 MyCustomExpression1_g8( float2 uv, float level ) + { + return SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv),level).rgb; + } + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord1 = screenPos; + + o.ase_texcoord2.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord2.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal(v.ase_normal); + + o.clipPos = TransformWorldToHClip(positionWS); + o.normalWS.xyz = normalWS; + + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + float4 screenPos = IN.ase_texcoord1; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float mulTime31 = _TimeParameters.x * _TimeScaler; + float2 texCoord30 = IN.ase_texcoord2.xy * (_Vector0).xy + ( (_Vector0).zw * mulTime31 ); + float3 unpack26 = UnpackNormalScale( tex2D( _Normal, texCoord30 ), _NormalScale ); + unpack26.z = lerp( 1, unpack26.z, saturate(_NormalScale) ); + float2 screenUV27_g4 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g4 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g4 = GetScreenNoiseRGBASlice27_g4( screenUV27_g4 , offsetFrame27_g4 ); + float3 temp_output_57_0 = (localGetScreenNoiseRGBASlice27_g4).xyz; + float3 temp_output_60_0 = ( temp_output_57_0 - float3( 0.5,0.5,0.5 ) ); + float3 temp_output_64_0 = ( unpack26 + ( temp_output_60_0 * _NoiseDefusion * 2.0 ) ); + float4 ase_screenPosNorm = screenPos / screenPos.w; + ase_screenPosNorm.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? ase_screenPosNorm.z : ase_screenPosNorm.z * 0.5 + 0.5; + float screenDepth14 = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH( ase_screenPosNorm.xy ),_ZBufferParams); + float distanceDepth14 = saturate( ( screenDepth14 - LinearEyeDepth( ase_screenPosNorm.z,_ZBufferParams ) ) / ( _EdgeDistance ) ); + float temp_output_15_0 = ( 1.0 - distanceDepth14 ); + float2 uv1_g8 = ( ase_grabScreenPosNorm + float4( ( temp_output_64_0 * ( 1.0 - temp_output_15_0 ) ) , 0.0 ) ).xy; + float level1_g8 = 0.0; + float3 localMyCustomExpression1_g8 = MyCustomExpression1_g8( uv1_g8 , level1_g8 ); + float4 appendResult98 = (float4((( ( float4( localMyCustomExpression1_g8 , 0.0 ) * _Color ) + ( ( temp_output_15_0 * temp_output_15_0 * temp_output_15_0 ) * _EdgeColor ) )).rgb , 1.0)); + float3 lerpResult105 = lerp( float3( 0,0,0 ) , temp_output_57_0 , ( 1.0 - _Color ).rgb); + float3 break94 = lerpResult105; + float2 temp_output_74_0 = abs( (temp_output_64_0).xy ); + float4 appendResult100 = (float4((( _Color * float4( temp_output_60_0 , 0.0 ) )).rgb , saturate( ( max( max( break94.x , break94.y ) , break94.z ) + saturate( max( ( temp_output_74_0 * 30.0 ).x , 0.0 ) ) ) ))); + #ifdef SHADER_API_MOBILE + float4 staticSwitch113 = appendResult100; + #else + float4 staticSwitch113 = appendResult98; + #endif + + surfaceDescription.Alpha = (staticSwitch113).w; + surfaceDescription.AlphaClipThreshold = 0.5; + + #if _ALPHATEST_ON + clip(surfaceDescription.Alpha - surfaceDescription.AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + float3 normalWS = IN.normalWS; + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + + } + + ENDHLSL + } + + + Pass + { + + Name "DepthNormalsOnly" + Tags { "LightMode"="DepthNormalsOnly" } + + ZTest LEqual + ZWrite On + + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #define ASE_SRP_VERSION 999999 + #define REQUIRE_DEPTH_TEXTURE 1 + + + #pragma exclude_renderers glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define ATTRIBUTES_NEED_TEXCOORD1 + #define VARYINGS_NEED_NORMAL_WS + #define VARYINGS_NEED_TANGENT_WS + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float3 normalWS : TEXCOORD0; + float4 ase_texcoord1 : TEXCOORD1; + float4 ase_texcoord2 : TEXCOORD2; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Vector0; + float4 _Color; + float4 _EdgeColor; + float _TimeScaler; + float _NormalScale; + float _NoiseDefusion; + float _EdgeDistance; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _Normal; + uniform float4 _CameraDepthTexture_TexelSize; + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g4( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + float3 MyCustomExpression1_g8( float2 uv, float level ) + { + return SAMPLE_TEXTURE2D_X_LOD(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, UnityStereoTransformScreenSpaceTex(uv),level).rgb; + } + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord1 = screenPos; + + o.ase_texcoord2.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord2.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal(v.ase_normal); + + o.clipPos = TransformWorldToHClip(positionWS); + o.normalWS.xyz = normalWS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + float4 screenPos = IN.ase_texcoord1; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float mulTime31 = _TimeParameters.x * _TimeScaler; + float2 texCoord30 = IN.ase_texcoord2.xy * (_Vector0).xy + ( (_Vector0).zw * mulTime31 ); + float3 unpack26 = UnpackNormalScale( tex2D( _Normal, texCoord30 ), _NormalScale ); + unpack26.z = lerp( 1, unpack26.z, saturate(_NormalScale) ); + float2 screenUV27_g4 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g4 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g4 = GetScreenNoiseRGBASlice27_g4( screenUV27_g4 , offsetFrame27_g4 ); + float3 temp_output_57_0 = (localGetScreenNoiseRGBASlice27_g4).xyz; + float3 temp_output_60_0 = ( temp_output_57_0 - float3( 0.5,0.5,0.5 ) ); + float3 temp_output_64_0 = ( unpack26 + ( temp_output_60_0 * _NoiseDefusion * 2.0 ) ); + float4 ase_screenPosNorm = screenPos / screenPos.w; + ase_screenPosNorm.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? ase_screenPosNorm.z : ase_screenPosNorm.z * 0.5 + 0.5; + float screenDepth14 = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH( ase_screenPosNorm.xy ),_ZBufferParams); + float distanceDepth14 = saturate( ( screenDepth14 - LinearEyeDepth( ase_screenPosNorm.z,_ZBufferParams ) ) / ( _EdgeDistance ) ); + float temp_output_15_0 = ( 1.0 - distanceDepth14 ); + float2 uv1_g8 = ( ase_grabScreenPosNorm + float4( ( temp_output_64_0 * ( 1.0 - temp_output_15_0 ) ) , 0.0 ) ).xy; + float level1_g8 = 0.0; + float3 localMyCustomExpression1_g8 = MyCustomExpression1_g8( uv1_g8 , level1_g8 ); + float4 appendResult98 = (float4((( ( float4( localMyCustomExpression1_g8 , 0.0 ) * _Color ) + ( ( temp_output_15_0 * temp_output_15_0 * temp_output_15_0 ) * _EdgeColor ) )).rgb , 1.0)); + float3 lerpResult105 = lerp( float3( 0,0,0 ) , temp_output_57_0 , ( 1.0 - _Color ).rgb); + float3 break94 = lerpResult105; + float2 temp_output_74_0 = abs( (temp_output_64_0).xy ); + float4 appendResult100 = (float4((( _Color * float4( temp_output_60_0 , 0.0 ) )).rgb , saturate( ( max( max( break94.x , break94.y ) , break94.z ) + saturate( max( ( temp_output_74_0 * 30.0 ).x , 0.0 ) ) ) ))); + #ifdef SHADER_API_MOBILE + float4 staticSwitch113 = appendResult100; + #else + float4 staticSwitch113 = appendResult98; + #endif + + surfaceDescription.Alpha = (staticSwitch113).w; + surfaceDescription.AlphaClipThreshold = 0.5; + + #if _ALPHATEST_ON + clip(surfaceDescription.Alpha - surfaceDescription.AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + float3 normalWS = IN.normalWS; + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + + } + + ENDHLSL + } + + } + + CustomEditor "UnityEditor.ShaderGraphUnlitGUI" + Fallback "Hidden/InternalErrorShader" + +} +/*ASEBEGIN +Version=18935 +348;596;2495;1397;768.8135;508.2479;1;True;True +Node;AmplifyShaderEditor.RangedFloatNode;33;-2623.422,285.6297;Inherit;False;Property;_TimeScaler;Time Scaler;5;0;Create;True;0;0;0;True;0;False;0;0.5;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.Vector4Node;38;-2533.989,45.28711;Inherit;False;Property;_Vector0;Vector 0;6;0;Create;True;0;0;0;True;0;False;1,1,0,0;0.01,1,0,-1;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SwizzleNode;40;-2344.733,140.3067;Inherit;False;FLOAT2;2;3;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleTimeNode;31;-2434.626,281.5258;Inherit;False;1;0;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FunctionNode;56;-2843.489,682.7742;Inherit;True;Global Blue Noise Sample;-1;;4;bac712bbbce65c14c9d4cbc808f3d0e0;0;2;8;FLOAT2;0,0;False;10;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.SwizzleNode;57;-2494.688,665.4838;Inherit;False;FLOAT3;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SwizzleNode;39;-2345.777,56.68601;Inherit;False;FLOAT2;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;42;-2190.038,199.8864;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.RangedFloatNode;58;-2539.488,787.0839;Inherit;False;Property;_NoiseDefusion;Noise Defusion;8;0;Create;True;0;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;60;-2293.285,650.127;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0.5,0.5,0.5;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.RangedFloatNode;29;-2264.535,549.5233;Inherit;False;Property;_NormalScale;Normal Scale;4;0;Create;True;0;0;0;False;0;False;1;0.005;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;59;-2131.998,781.0203;Inherit;False;Constant;_Float1;Float 1;8;0;Create;True;0;0;0;False;0;False;2;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;30;-2023.442,133.185;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;61;-2135.284,668.1271;Inherit;False;3;3;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SamplerNode;26;-1714.431,220.1914;Inherit;True;Property;_Normal;Normal;3;0;Create;True;0;0;0;False;0;False;-1;None;2ba2085b33bf11d43a9426e5eb7a2902;True;0;True;bump;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;22;-1570.032,659.9443;Inherit;False;Property;_EdgeDistance;Edge Distance;2;0;Create;True;0;0;0;False;0;False;0.1;0.13;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;64;-1351.414,245.1566;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.CommentaryNode;111;-2250.552,-1145.886;Inherit;False;2708.299;805.0335;Android variation;18;74;75;89;76;105;94;77;79;93;80;95;109;103;107;100;90;99;110;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.DepthFade;14;-1355.945,653.6127;Inherit;False;True;True;False;2;1;FLOAT3;0,0,0;False;0;FLOAT;0.2;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;19;-846.6503,-182.6969;Inherit;False;Property;_Color;Color;0;1;[HDR];Create;True;0;0;0;False;0;False;1,1,1,0;1,0.4103774,0.4524934,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.OneMinusNode;15;-1054.045,600.9127;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SwizzleNode;110;-2200.552,-839.0759;Inherit;False;FLOAT2;0;1;2;3;1;0;FLOAT3;0,0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.OneMinusNode;36;-1135.297,370.4312;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;75;-1828.17,-979.5426;Inherit;False;Constant;_Float0;Float 0;11;0;Create;True;0;0;0;False;0;False;30;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.AbsOpNode;74;-1992.394,-835.0392;Inherit;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.OneMinusNode;89;-520.7108,-784.2026;Inherit;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.LerpOp;105;-313.1315,-1095.886;Inherit;False;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;76;-1552.77,-1040.743;Inherit;True;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;37;-1109.006,224.9539;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.GrabScreenPosition;25;-1270.398,20.4839;Inherit;False;0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleAddOpNode;28;-1016.67,108.2705;Inherit;False;2;2;0;FLOAT4;0,0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.BreakToComponentsNode;94;-139.4934,-1013.937;Inherit;False;FLOAT3;1;0;FLOAT3;0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15 +Node;AmplifyShaderEditor.BreakToComponentsNode;77;-1339.853,-1070.498;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;23;-883.0327,567.9443;Inherit;False;3;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;21;-968.7116,725.8766;Inherit;False;Property;_EdgeColor;Edge Color;1;1;[HDR];Create;True;0;0;0;False;0;False;1,1,1,0;2.337647,0.4,0.121293,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMaxOpNode;79;-1210.853,-1085.498;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMaxOpNode;93;16.76184,-947.3367;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FunctionNode;73;-848.6816,94.34859;Inherit;False;GrabScreenColorManualLevel;-1;;8;b7c9b6b3581e5364c833193cd43e9ba8;0;2;5;FLOAT2;0,0;False;2;FLOAT;0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SaturateNode;80;-1037.675,-1090.238;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;18;-412.6502,-128.0968;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;20;-683.4601,370.531;Inherit;False;2;2;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMaxOpNode;95;166.6133,-907.6324;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;90;-495.1148,-561.4131;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT3;0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;17;-315.7252,146.4916;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;109;285.2019,-839.184;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SaturateNode;103;292.747,-681.5574;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SwizzleNode;99;-207.8187,-530.8778;Inherit;False;FLOAT3;0;1;2;3;1;0;COLOR;0,0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SwizzleNode;97;-176.5121,130.2798;Inherit;False;FLOAT3;0;1;2;3;1;0;COLOR;0,0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.DynamicAppendNode;100;225.0844,-475.853;Inherit;False;FLOAT4;4;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.DynamicAppendNode;98;-180.3545,32.94035;Inherit;False;FLOAT4;4;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;1;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.StaticSwitch;113;136.8126,-22.49399;Inherit;False;Property;_Keyword0;SHADER_API_MOBILE;10;0;Create;False;0;0;0;False;0;False;0;0;0;False;SHADER_API_MOBILE;Toggle;2;Key0;Key1;Fetch;False;True;Fragment;9;1;FLOAT4;0,0,0,0;False;0;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;3;FLOAT4;0,0,0,0;False;4;FLOAT4;0,0,0,0;False;5;FLOAT4;0,0,0,0;False;6;FLOAT4;0,0,0,0;False;7;FLOAT4;0,0,0,0;False;8;FLOAT4;0,0,0,0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.OneMinusNode;107;-1762.517,-824.3533;Inherit;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SamplerNode;43;-1595.401,893.2531;Inherit;True;Property;_TextureSample0;Texture Sample 0;7;0;Create;True;0;0;0;False;0;False;-1;None;c77738f9b82bdc047a63d7b33b2b9874;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.TimeNode;65;-2438.836,368.3835;Inherit;False;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.WorldPosInputsNode;88;330.4374,110.2684;Inherit;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SwizzleNode;101;857.0782,44.50648;Inherit;False;FLOAT;3;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FunctionNode;87;537.5373,-39.83163;Inherit;False;VolumetricsUnlit;-1;;9;800698b1441791d449f3e84fa3283d1e;0;2;2;FLOAT4;0,0,0,0;False;3;FLOAT3;0,0,0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;53;388.8,16.69999;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;DepthNormals;0;8;DepthNormals;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormalsOnly;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;47;388.8,16.69999;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;ShadowCaster;0;2;ShadowCaster;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=ShadowCaster;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;54;388.8,16.69999;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;DepthNormalsOnly;0;9;DepthNormalsOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormalsOnly;False;True;15;d3d9;d3d11_9x;d3d11;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;49;388.8,16.69999;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;Meta;0;4;Meta;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Meta;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;50;388.8,16.69999;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;Universal2D;0;5;Universal2D;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;5;False;-1;10;False;-1;1;1;False;-1;10;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;2;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;45;539.9322,73.05437;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;ExtraPrePass;0;0;ExtraPrePass;5;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;0;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;52;388.8,16.69999;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;ScenePickingPass;0;7;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;51;388.8,16.69999;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;SceneSelectionPass;0;6;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;46;1160.733,-37.34563;Half;False;True;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;3;SLZ/ForceField;2992e84f91cbeb14eab234972e07ea9d;True;Forward;0;1;Forward;8;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Transparent=RenderType;Queue=Transparent=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;5;False;-1;10;False;-1;1;1;False;-1;10;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;2;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;1;LightMode=UniversalForwardOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;22;Surface;1;637971395290964121; Blend;0;0;Two Sided;0;637971395840501447;Cast Shadows;0;637971395248012710; Use Shadow Threshold;0;0;Receive Shadows;0;637971395242512077;GPU Instancing;1;0;LOD CrossFade;0;0;Built-in Fog;0;0;DOTS Instancing;0;0;Meta Pass;0;0;Extra Pre Pass;0;0;Tessellation;0;0; Phong;0;0; Strength;0.5,False,-1;0; Type;0;0; Tess;16,False,-1;0; Min;10,False,-1;0; Max;25,False,-1;0; Edge Length;16,False,-1;0; Max Displacement;25,False,-1;0;Vertex Position,InvertActionOnDeselection;1;0;0;10;False;True;False;True;False;True;True;True;True;True;False;;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;48;388.8,16.69999;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;DepthOnly;0;3;DepthOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;False;False;True;1;LightMode=DepthOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +WireConnection;40;0;38;0 +WireConnection;31;0;33;0 +WireConnection;57;0;56;0 +WireConnection;39;0;38;0 +WireConnection;42;0;40;0 +WireConnection;42;1;31;0 +WireConnection;60;0;57;0 +WireConnection;30;0;39;0 +WireConnection;30;1;42;0 +WireConnection;61;0;60;0 +WireConnection;61;1;58;0 +WireConnection;61;2;59;0 +WireConnection;26;1;30;0 +WireConnection;26;5;29;0 +WireConnection;64;0;26;0 +WireConnection;64;1;61;0 +WireConnection;14;0;22;0 +WireConnection;15;0;14;0 +WireConnection;110;0;64;0 +WireConnection;36;0;15;0 +WireConnection;74;0;110;0 +WireConnection;89;0;19;0 +WireConnection;105;1;57;0 +WireConnection;105;2;89;0 +WireConnection;76;0;74;0 +WireConnection;76;1;75;0 +WireConnection;37;0;64;0 +WireConnection;37;1;36;0 +WireConnection;28;0;25;0 +WireConnection;28;1;37;0 +WireConnection;94;0;105;0 +WireConnection;77;0;76;0 +WireConnection;23;0;15;0 +WireConnection;23;1;15;0 +WireConnection;23;2;15;0 +WireConnection;79;0;77;0 +WireConnection;93;0;94;0 +WireConnection;93;1;94;1 +WireConnection;73;5;28;0 +WireConnection;80;0;79;0 +WireConnection;18;0;73;0 +WireConnection;18;1;19;0 +WireConnection;20;0;23;0 +WireConnection;20;1;21;0 +WireConnection;95;0;93;0 +WireConnection;95;1;94;2 +WireConnection;90;0;19;0 +WireConnection;90;1;60;0 +WireConnection;17;0;18;0 +WireConnection;17;1;20;0 +WireConnection;109;0;95;0 +WireConnection;109;1;80;0 +WireConnection;103;0;109;0 +WireConnection;99;0;90;0 +WireConnection;97;0;17;0 +WireConnection;100;0;99;0 +WireConnection;100;3;103;0 +WireConnection;98;0;97;0 +WireConnection;113;1;98;0 +WireConnection;113;0;100;0 +WireConnection;107;0;74;0 +WireConnection;101;0;113;0 +WireConnection;87;2;113;0 +WireConnection;87;3;88;0 +WireConnection;46;2;87;0 +WireConnection;46;3;101;0 +ASEEND*/ +//CHKSM=DE2FCCF1C3516DBF2FAAE2DB9B798309F4E86BE5 \ No newline at end of file diff --git a/Assets/SLZShaders/ForceField.shader.meta b/Assets/SLZShaders/ForceField.shader.meta new file mode 100644 index 0000000..bca176c --- /dev/null +++ b/Assets/SLZShaders/ForceField.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 6bf3d81d08a4ff343b22619a187bb249 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include.meta b/Assets/SLZShaders/Include.meta new file mode 100644 index 0000000..c3d162f --- /dev/null +++ b/Assets/SLZShaders/Include.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ae65e6fd73412a843ad0abebcd7f7754 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle.meta b/Assets/SLZShaders/Include/Particle.meta new file mode 100644 index 0000000..f74d85f --- /dev/null +++ b/Assets/SLZShaders/Include/Particle.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 05cb88a931e735a4b9ad942dbbbf3ed7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector.meta new file mode 100644 index 0000000..f400777 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: baf0cae36873ec6479fc0c926f732068 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/Base.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector/Base.meta new file mode 100644 index 0000000..61ce6be --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/Base.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 98a02e34c0c4b8748ade0ad9cd5a2611 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/Base/Base_Particle.hlsl b/Assets/SLZShaders/Include/Particle/ShaderInjector/Base/Base_Particle.hlsl new file mode 100644 index 0000000..c63a2f7 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/Base/Base_Particle.hlsl @@ -0,0 +1,152 @@ + +#pragma target 5.0 +//#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + +#if defined(SHADER_API_MOBILE) + //#!INJECT_POINT MOBILE_DEFINES +#else + //#!INJECT_POINT STANDALONE_DEFINES +#endif + +//#!INJECT_POINT UNIVERSAL_DEFINES + +#pragma multi_compile_fog +#pragma skip_variants FOG_LINEAR +#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED +#pragma multi_compile_instancing +#pragma instancing_options procedural:ParticleInstancingSetup + + + +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" +#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl" +#include "Include/Particle/billboard.hlsl" +//#!INJECT_POINT INCLUDES + +struct appdata +{ + float4 vertex : POSITION; + float4 uv0_vertexStream0_xy : TEXCOORD0; + half4 color : COLOR; + //#!INJECT_POINT VERTEX_IN + //#!INJECT_DEFAULT + float vertexStream1 : TEXCOORD1; + //#!INJECT_END + UNITY_VERTEX_INPUT_INSTANCE_ID +}; + +struct v2f +{ + //#!INJECT_POINT VERTEX_CENTROID + //#!INJECT_DEFAULT + float4 vertex : SV_POSITION; + //#!INJECT_END + float2 uv0 : TEXCOORD0; + float4 wPos_xyz_fog_x : TEXCOORD1; + half4 color : COLOR; + //#!INJECT_POINT INTERPOLATORS + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO +}; + +struct fragOut +{ + half4 color : SV_Target; + //#!INJECT_POINT OUTPUT_SEMANTICS +}; + +//#include "Include/PlatformSamplers.hlsl" + +TEXTURE2D(_BaseMap); +SamplerState sampler_BaseMap; + +//#!INJECT_POINT UNIFORMS + +CBUFFER_START(UnityPerMaterial) +float4 _BaseMap_ST; +half4 _BaseColor; +//#!INJECT_POINT MATERIAL_CBUFFER +CBUFFER_END + +//#!INJECT_POINT FUNCTIONS + +v2f vert(appdata v) +{ + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + //#!INJECT_POINT VERT_BEGIN + + //#!INJECT_POINT VERT_TRANSFORM + //#!INJECT_DEFAULT + float3 particleCenter = float3(v.uv0_vertexStream0_xy.zw, v.vertexStream1.x); + v.vertex.xyz = ParticleFaceCamera(v.vertex.xyz, particleCenter); + //#!INJECT_END + o.wPos_xyz_fog_x.xyz = TransformObjectToWorld(v.vertex.xyz); + o.vertex = TransformWorldToHClip(o.wPos_xyz_fog_x.xyz); + o.uv0 = TRANSFORM_TEX(v.uv0_vertexStream0_xy.xy, _BaseMap); + half clipZ_0Far = UNITY_Z_0_FAR_FROM_CLIPSPACE(o.vertex.z); + o.wPos_xyz_fog_x.w = unity_FogParams.x * clipZ_0Far; + o.color = v.color; + + //#!INJECT_POINT VERT_END + + return o; +} + +fragOut frag(v2f i) +{ + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + + fragOut f; + + //#!INJECT_POINT FRAG_BEGIN + + //#!INJECT_POINT FRAG_COLOR + //#!INJECT_DEFAULT + f.color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, i.uv0); + f.color *= _BaseColor * i.color; + //#!INJECT_END + + //#!INJECT_POINT FRAG_FOG + //#!INJECT_DEFAULT + half3 viewDir = normalize(half3(i.wPos_xyz_fog_x.xyz - _WorldSpaceCameraPos)); + #if defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2) + #if defined(SLZ_PARTICLE_ADDITIVE) + f.color.rgb *= 1.0 - ComputeFogIntensity(i.wPos_xyz_fog_x.w); + #elif defined(SLZ_PARTICLE_MULTIPLICATIVE) + f.color.rgb = lerp(f.color.rgb, half3(1,1,1), ComputeFogIntensity(i.wPos_xyz_fog_x.w)); + #elif defined(SLZ_PARTICLE_ALPHABLEND) + f.color.rgb = MixFog(f.color.rgb, viewDir, i.wPos_xyz_fog_x.w); + #endif + #endif + //#!INJECT_END + + + //#!INJECT_POINT FRAG_VOLUMETRICS + //#!INJECT_DEFAULT + #if defined(SLZ_PARTICLE_ADDITIVE) + #if defined(_VOLUMETRICS_ENABLED) + f.color *= GetVolumetricColor(i.wPos_xyz_fog_x.xyz).a; + #endif + #elif defined(SLZ_PARTICLE_ALPHABLEND) + f.color = Volumetrics(f.color, i.wPos_xyz_fog_x.xyz); + #endif + //#!INJECT_END + + //#!INJECT_POINT FRAG_END + + return f; +} \ No newline at end of file diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/Base/Base_Particle.hlsl.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector/Base/Base_Particle.hlsl.meta new file mode 100644 index 0000000..f88bcf3 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/Base/Base_Particle.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2df13d630bf74324fbefa9003b6544b3 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections.meta new file mode 100644 index 0000000..8864d5b --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4e0ec44885694984b843804e07b56a1c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_SoftBlend.hlsl b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_SoftBlend.hlsl new file mode 100644 index 0000000..e008a94 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_SoftBlend.hlsl @@ -0,0 +1,42 @@ +//#!INJECT_BEGIN INCLUDES 0 +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZSoftBlend.hlsl" +//#!INJECT_END + +//#!INJECT_BEGIN MATERIAL_CBUFFER 0 + float _SoftFactor; +//#!INJECT_END + +//#!INJECT_BEGIN VERTEX_CENTROID 0 +#if defined(SHADER_API_MOBILE) + centroid float4 vertex : SV_POSITION; +#else + float4 vertex : SV_POSITION; +#endif +//#!INJECT_END + +//#!INJECT_BEGIN OUTPUT_SEMANTICS 0 +#if defined(SHADER_API_MOBILE) + float depth : SV_DepthLessEqual; +#endif +//#!INJECT_END + + +//#!INJECT_BEGIN FRAG_END 99 + #if defined(SHADER_API_MOBILE) + half noise = GetScreenNoiseR(screenUVs); + f.depth = SLZSoftBlendZTest(i.vertex.z, noise, _SoftFactor); + #else + float rawDepth = SampleSceneDepth(screenUVs); + float viewZ = dot(GetWorldToViewMatrix()._m20_m21_m22_m23, float4(i.wPos_xyz_fog_x.xyz, 1)); + float fade = SLZSoftBlendDepth(rawDepth, viewZ, _SoftFactor); + #if defined(SLZ_PARTICLE_ADDITIVE) + f.color *= fade; + #elif defined(SLZ_PARTICLE_MULTIPLICATIVE) + f.color = lerp(fade, float4(1,1,1,1), f.color)); + #else + f.color.a *= fade; + #endif + #endif +//#!INJECT_END \ No newline at end of file diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_SoftBlend.hlsl.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_SoftBlend.hlsl.meta new file mode 100644 index 0000000..b342ae3 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_SoftBlend.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f42ab72a6a8465649be290d03a8f1981 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_screenspaceUVs.hlsl b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_screenspaceUVs.hlsl new file mode 100644 index 0000000..d4151ff --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_screenspaceUVs.hlsl @@ -0,0 +1,4 @@ + +//#!INJECT_BEGIN FRAG_BEGIN -1 + float2 screenUVs = GetNormalizedScreenSpaceUV(i.vertex); +//#!INJECT_END \ No newline at end of file diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_screenspaceUVs.hlsl.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_screenspaceUVs.hlsl.meta new file mode 100644 index 0000000..2b76c85 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Particle_screenspaceUVs.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 03859193eb793184ca8cc47738d7109d +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Torch.hlsl b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Torch.hlsl new file mode 100644 index 0000000..dbb7363 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Torch.hlsl @@ -0,0 +1,39 @@ +//#!INJECT_BEGIN UNIFORMS 0 + TEXTURE2D(_ScreenSpacePattern); + SAMPLER(sampler_ScreenSpacePattern); +//#!INJECT_END + +//#!INJECT_BEGIN MATERIAL_CBUFFER 0 + half _Speed; + half _SecondarySpeed; + float _ScreenSpaceSize; + float _ParticleOffset; +//#!INJECT_END + +//#!INJECT_BEGIN FUNCTIONS 0 + float2 RotateTorchUVs(float2 uv, float2 center, float angle) + { + uv = uv - center; + float sin1, cos1; + sincos(angle, sin1, cos1); + float2x2 rotMat = float2x2(cos1, -sin1, sin1, cos1); + uv = mul(rotMat, uv); + return uv + center; + } +//#!INJECT_END + +//#!INJECT_BEGIN VERT_BEGIN 0 + v.vertex.z += _ParticleOffset; +//#!INJECT_END + +//#!INJECT_BEGIN FRAG_COLOR 0 + float angle1 = frac(_Time[0] * 3.1830988618 * _Speed) * TWO_PI; + float angle2 = frac(_Time[0] * 3.1830988618 * _Speed * _SecondarySpeed) * TWO_PI; + angle1 = -angle1; + float2 uv1 = RotateTorchUVs(i.uv0.xy, float2(0.5, 0.5), angle1); + half layer1 = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv1).r; + float2 uv2 = RotateTorchUVs(i.uv0.xy, float2(0.5, 0.5), angle2); + half layer2 = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv2).r; + half4 SSPattern = SAMPLE_TEXTURE2D(_ScreenSpacePattern, sampler_ScreenSpacePattern, _ScreenParams.xy * screenUVs / _ScreenSpaceSize); + f.color = (layer1 * layer2 * i.color.a) * SSPattern * _BaseColor * i.color; +//#!INJECT_END \ No newline at end of file diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Torch.hlsl.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Torch.hlsl.meta new file mode 100644 index 0000000..d01ad64 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/Injections/Injection_Torch.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2a6fc1acbba5a6045a0692bfb9a7a8f2 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.asset b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.asset new file mode 100644 index 0000000..9d1d25b --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bd7d1f8f9838c1541abbb5c264b254f6, type: 3} + m_Name: ParticleBasic + m_EditorClassIdentifier: + outputInclude: {fileID: 10900000, guid: c156fe6f1c50d864f8ceb85b935236f7, type: 3} + baseInclude: {fileID: 10900000, guid: 2df13d630bf74324fbefa9003b6544b3, type: 3} + injectableIncludes: [] diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.asset.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.asset.meta new file mode 100644 index 0000000..3d58a56 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 36686d6671a56b04f9401216e0ff9ae5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.hlsl b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.hlsl new file mode 100644 index 0000000..c076d42 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.hlsl @@ -0,0 +1,128 @@ +/*-----------------------------------------------------------------------------------------------------* + *-----------------------------------------------------------------------------------------------------* + * WARNING: THIS FILE WAS CREATED WITH SHADERINJECTOR, AND SHOULD NOT BE EDITED DIRECTLY. MODIFY THE * + * BASE INCLUDE AND INJECTED FILES INSTEAD, AND REGENERATE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * + *-----------------------------------------------------------------------------------------------------* + *-----------------------------------------------------------------------------------------------------*/ + + +#pragma target 5.0 +//#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + +#if defined(SHADER_API_MOBILE) +#else +#endif + + +#pragma multi_compile_fog +#pragma skip_variants FOG_LINEAR +#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED +#pragma multi_compile_instancing +#pragma instancing_options procedural:ParticleInstancingSetup + + + +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" +#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl" +#include "Include/Particle/billboard.hlsl" + +struct appdata +{ + float4 vertex : POSITION; + float4 uv0_vertexStream0_xy : TEXCOORD0; + half4 color : COLOR; + float vertexStream1 : TEXCOORD1; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; + +struct v2f +{ + float4 vertex : SV_POSITION; + float2 uv0 : TEXCOORD0; + float4 wPos_xyz_fog_x : TEXCOORD1; + half4 color : COLOR; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO +}; + +struct fragOut +{ + half4 color : SV_Target; +}; + +//#include "Include/PlatformSamplers.hlsl" + +TEXTURE2D(_BaseMap); +SamplerState sampler_BaseMap; + + +CBUFFER_START(UnityPerMaterial) +float4 _BaseMap_ST; +half4 _BaseColor; +CBUFFER_END + + +v2f vert(appdata v) +{ + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + float3 particleCenter = float3(v.uv0_vertexStream0_xy.zw, v.vertexStream1.x); + v.vertex.xyz = ParticleFaceCamera(v.vertex.xyz, particleCenter); + o.wPos_xyz_fog_x.xyz = TransformObjectToWorld(v.vertex.xyz); + o.vertex = TransformWorldToHClip(o.wPos_xyz_fog_x.xyz); + o.uv0 = TRANSFORM_TEX(v.uv0_vertexStream0_xy.xy, _BaseMap); + half clipZ_0Far = UNITY_Z_0_FAR_FROM_CLIPSPACE(o.vertex.z); + o.wPos_xyz_fog_x.w = unity_FogParams.x * clipZ_0Far; + o.color = v.color; + + + return o; +} + +fragOut frag(v2f i) +{ + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + + fragOut f; + + + f.color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, i.uv0); + f.color *= _BaseColor * i.color; + + half3 viewDir = normalize(half3(i.wPos_xyz_fog_x.xyz - _WorldSpaceCameraPos)); + #if defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2) + #if defined(SLZ_PARTICLE_ADDITIVE) + f.color.rgb *= 1.0 - ComputeFogIntensity(i.wPos_xyz_fog_x.w); + #elif defined(SLZ_PARTICLE_MULTIPLICATIVE) + f.color.rgb = lerp(f.color.rgb, half3(1,1,1), ComputeFogIntensity(i.wPos_xyz_fog_x.w)); + #elif defined(SLZ_PARTICLE_ALPHABLEND) + f.color.rgb = MixFog(f.color.rgb, viewDir, i.wPos_xyz_fog_x.w); + #endif + #endif + + + #if defined(SLZ_PARTICLE_ADDITIVE) + #if defined(_VOLUMETRICS_ENABLED) + f.color *= GetVolumetricColor(i.wPos_xyz_fog_x.xyz).a; + #endif + #elif defined(SLZ_PARTICLE_ALPHABLEND) + f.color = Volumetrics(f.color, i.wPos_xyz_fog_x.xyz); + #endif + + + return f; +} \ No newline at end of file diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.hlsl.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.hlsl.meta new file mode 100644 index 0000000..8545923 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleBasic.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c156fe6f1c50d864f8ceb85b935236f7 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.asset b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.asset new file mode 100644 index 0000000..563a762 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bd7d1f8f9838c1541abbb5c264b254f6, type: 3} + m_Name: ParticleSoft + m_EditorClassIdentifier: + outputInclude: {fileID: 10900000, guid: 005850956c06e3c4d9126500376c9a40, type: 3} + baseInclude: {fileID: 10900000, guid: 2df13d630bf74324fbefa9003b6544b3, type: 3} + injectableIncludes: + - {fileID: 10900000, guid: 03859193eb793184ca8cc47738d7109d, type: 3} + - {fileID: 10900000, guid: f42ab72a6a8465649be290d03a8f1981, type: 3} diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.asset.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.asset.meta new file mode 100644 index 0000000..80fd69c --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 390d76c4ec3c32e4e8ecc2b49aa78a1c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.hlsl b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.hlsl new file mode 100644 index 0000000..ef2dc26 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.hlsl @@ -0,0 +1,175 @@ +/*-----------------------------------------------------------------------------------------------------* + *-----------------------------------------------------------------------------------------------------* + * WARNING: THIS FILE WAS CREATED WITH SHADERINJECTOR, AND SHOULD NOT BE EDITED DIRECTLY. MODIFY THE * + * BASE INCLUDE AND INJECTED FILES INSTEAD, AND REGENERATE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * + *-----------------------------------------------------------------------------------------------------* + *-----------------------------------------------------------------------------------------------------*/ + + +#pragma target 5.0 +//#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + +#if defined(SHADER_API_MOBILE) +#else +#endif + + +#pragma multi_compile_fog +#pragma skip_variants FOG_LINEAR +#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED +#pragma multi_compile_instancing +#pragma instancing_options procedural:ParticleInstancingSetup + + + +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" +#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl" +#include "Include/Particle/billboard.hlsl" +// Begin Injection INCLUDES from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- +#if defined(SHADER_API_MOBILE) + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" +#else + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl" +#endif +// End Injection INCLUDES from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- + +struct appdata +{ + float4 vertex : POSITION; + float4 uv0_vertexStream0_xy : TEXCOORD0; + half4 color : COLOR; + float vertexStream1 : TEXCOORD1; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; + +struct v2f +{ +// Begin Injection VERTEX_CENTROID from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- +#if defined(SHADER_API_MOBILE) + centroid float4 vertex : SV_POSITION; +#else + float4 vertex : SV_POSITION; +#endif +// End Injection VERTEX_CENTROID from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- + float2 uv0 : TEXCOORD0; + float4 wPos_xyz_fog_x : TEXCOORD1; + half4 color : COLOR; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO +}; + +struct fragOut +{ + half4 color : SV_Target; +// Begin Injection OUTPUT_SEMANTICS from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- +#if defined(SHADER_API_MOBILE) + float depth : SV_DepthLessEqual; +#endif +// End Injection OUTPUT_SEMANTICS from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- +}; + +//#include "Include/PlatformSamplers.hlsl" + +TEXTURE2D(_BaseMap); +SamplerState sampler_BaseMap; + + +CBUFFER_START(UnityPerMaterial) +float4 _BaseMap_ST; +half4 _BaseColor; +// Begin Injection MATERIAL_CBUFFER from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- + float _SoftFactor; +// End Injection MATERIAL_CBUFFER from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- +CBUFFER_END + + +v2f vert(appdata v) +{ + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + float3 particleCenter = float3(v.uv0_vertexStream0_xy.zw, v.vertexStream1.x); + v.vertex.xyz = ParticleFaceCamera(v.vertex.xyz, particleCenter); + o.wPos_xyz_fog_x.xyz = TransformObjectToWorld(v.vertex.xyz); + o.vertex = TransformWorldToHClip(o.wPos_xyz_fog_x.xyz); + o.uv0 = TRANSFORM_TEX(v.uv0_vertexStream0_xy.xy, _BaseMap); + half clipZ_0Far = UNITY_Z_0_FAR_FROM_CLIPSPACE(o.vertex.z); + o.wPos_xyz_fog_x.w = unity_FogParams.x * clipZ_0Far; + o.color = v.color; + + + return o; +} + +fragOut frag(v2f i) +{ + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + + fragOut f; + +// Begin Injection FRAG_BEGIN from Injection_Particle_screenspaceUVs.hlsl ---------------------------------------------------------- + float2 screenUVs = GetNormalizedScreenSpaceUV(i.vertex); +// End Injection FRAG_BEGIN from Injection_Particle_screenspaceUVs.hlsl ---------------------------------------------------------- + + f.color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, i.uv0); + f.color *= _BaseColor * i.color; + + half3 viewDir = normalize(half3(i.wPos_xyz_fog_x.xyz - _WorldSpaceCameraPos)); + #if defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2) + #if defined(SLZ_PARTICLE_ADDITIVE) + f.color.rgb *= 1.0 - ComputeFogIntensity(i.wPos_xyz_fog_x.w); + #elif defined(SLZ_PARTICLE_MULTIPLICATIVE) + f.color.rgb = lerp(f.color.rgb, half3(1,1,1), ComputeFogIntensity(i.wPos_xyz_fog_x.w)); + #elif defined(SLZ_PARTICLE_ALPHABLEND) + f.color.rgb = MixFog(f.color.rgb, viewDir, i.wPos_xyz_fog_x.w); + #endif + #endif + + + #if defined(SLZ_PARTICLE_ADDITIVE) + #if defined(_VOLUMETRICS_ENABLED) + f.color *= GetVolumetricColor(i.wPos_xyz_fog_x.xyz).a; + #endif + #elif defined(SLZ_PARTICLE_ALPHABLEND) + f.color = Volumetrics(f.color, i.wPos_xyz_fog_x.xyz); + #endif + +// Begin Injection FRAG_END from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- + #if defined(SHADER_API_MOBILE) + half noise = GetScreenNoiseR(screenUVs); + float depthOffset = _SoftFactor * noise * noise ; + float vertDepth = i.vertex.z; + float cameraZ = 1.0 / (_ZBufferParams.z * vertDepth + _ZBufferParams.w); + cameraZ += depthOffset; + f.depth = (rcp(cameraZ) - _ZBufferParams.w) / _ZBufferParams.z; + #else + float rawDepth = SampleSceneDepth(screenUVs); + float sceneZ = (unity_OrthoParams.w == 0) ? LinearEyeDepth(rawDepth, _ZBufferParams) : LinearDepthToEyeDepth(rawDepth); + float thisZ = LinearEyeDepth(i.wPos_xyz_fog_x.xyz, GetWorldToViewMatrix()); + float fade = saturate((1 / _SoftFactor) * (sceneZ - thisZ)); + fade *= fade; + #if defined(SLZ_PARTICLE_ADDITIVE) + f.color *= fade; + #elif defined(SLZ_PARTICLE_MULTIPLICATIVE) + f.color = lerp(fade, float4(1,1,1,1), f.color)); + #else + f.color.a *= fade; + #endif + #endif +// End Injection FRAG_END from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- + + return f; +} \ No newline at end of file diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.hlsl.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.hlsl.meta new file mode 100644 index 0000000..6282eb8 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleSoft.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 005850956c06e3c4d9126500376c9a40 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.asset b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.asset new file mode 100644 index 0000000..e35eec3 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bd7d1f8f9838c1541abbb5c264b254f6, type: 3} + m_Name: ParticleTorch + m_EditorClassIdentifier: + outputInclude: {fileID: 10900000, guid: 2313d59684d119840a78fee73c48959a, type: 3} + baseInclude: {fileID: 10900000, guid: 2df13d630bf74324fbefa9003b6544b3, type: 3} + injectableIncludes: + - {fileID: 10900000, guid: 03859193eb793184ca8cc47738d7109d, type: 3} + - {fileID: 10900000, guid: f42ab72a6a8465649be290d03a8f1981, type: 3} + - {fileID: 10900000, guid: 2a6fc1acbba5a6045a0692bfb9a7a8f2, type: 3} diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.asset.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.asset.meta new file mode 100644 index 0000000..f23d197 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 88f1b8e9d502e19419d88bca2cab94da +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.hlsl b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.hlsl new file mode 100644 index 0000000..a4953fe --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.hlsl @@ -0,0 +1,200 @@ +/*-----------------------------------------------------------------------------------------------------* + *-----------------------------------------------------------------------------------------------------* + * WARNING: THIS FILE WAS CREATED WITH SHADERINJECTOR, AND SHOULD NOT BE EDITED DIRECTLY. MODIFY THE * + * BASE INCLUDE AND INJECTED FILES INSTEAD, AND REGENERATE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * + *-----------------------------------------------------------------------------------------------------* + *-----------------------------------------------------------------------------------------------------*/ + + +#pragma target 5.0 +//#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + +#if defined(SHADER_API_MOBILE) +#else +#endif + + +#pragma multi_compile_fog +#pragma skip_variants FOG_LINEAR +#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED +#pragma multi_compile_instancing +#pragma instancing_options procedural:ParticleInstancingSetup + + + +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" +#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl" +#include "Include/Particle/billboard.hlsl" +// Begin Injection INCLUDES from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZSoftBlend.hlsl" +// End Injection INCLUDES from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- + +struct appdata +{ + float4 vertex : POSITION; + float4 uv0_vertexStream0_xy : TEXCOORD0; + half4 color : COLOR; + float vertexStream1 : TEXCOORD1; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; + +struct v2f +{ +// Begin Injection VERTEX_CENTROID from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- +#if defined(SHADER_API_MOBILE) + centroid float4 vertex : SV_POSITION; +#else + float4 vertex : SV_POSITION; +#endif +// End Injection VERTEX_CENTROID from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- + float2 uv0 : TEXCOORD0; + float4 wPos_xyz_fog_x : TEXCOORD1; + half4 color : COLOR; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO +}; + +struct fragOut +{ + half4 color : SV_Target; +// Begin Injection OUTPUT_SEMANTICS from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- +#if defined(SHADER_API_MOBILE) + float depth : SV_DepthLessEqual; +#endif +// End Injection OUTPUT_SEMANTICS from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- +}; + +//#include "Include/PlatformSamplers.hlsl" + +TEXTURE2D(_BaseMap); +SamplerState sampler_BaseMap; + +// Begin Injection UNIFORMS from Injection_Torch.hlsl ---------------------------------------------------------- + TEXTURE2D(_ScreenSpacePattern); + SAMPLER(sampler_ScreenSpacePattern); +// End Injection UNIFORMS from Injection_Torch.hlsl ---------------------------------------------------------- + +CBUFFER_START(UnityPerMaterial) +float4 _BaseMap_ST; +half4 _BaseColor; +// Begin Injection MATERIAL_CBUFFER from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- + float _SoftFactor; +// End Injection MATERIAL_CBUFFER from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- +// Begin Injection MATERIAL_CBUFFER from Injection_Torch.hlsl ---------------------------------------------------------- + half _Speed; + half _SecondarySpeed; + float _ScreenSpaceSize; + float _ParticleOffset; +// End Injection MATERIAL_CBUFFER from Injection_Torch.hlsl ---------------------------------------------------------- +CBUFFER_END + +// Begin Injection FUNCTIONS from Injection_Torch.hlsl ---------------------------------------------------------- + float2 RotateTorchUVs(float2 uv, float2 center, float angle) + { + uv = uv - center; + float sin1, cos1; + sincos(angle, sin1, cos1); + float2x2 rotMat = float2x2(cos1, -sin1, sin1, cos1); + uv = mul(rotMat, uv); + return uv + center; + } +// End Injection FUNCTIONS from Injection_Torch.hlsl ---------------------------------------------------------- + +v2f vert(appdata v) +{ + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + +// Begin Injection VERT_BEGIN from Injection_Torch.hlsl ---------------------------------------------------------- + v.vertex.z += _ParticleOffset; +// End Injection VERT_BEGIN from Injection_Torch.hlsl ---------------------------------------------------------- + + float3 particleCenter = float3(v.uv0_vertexStream0_xy.zw, v.vertexStream1.x); + v.vertex.xyz = ParticleFaceCamera(v.vertex.xyz, particleCenter); + o.wPos_xyz_fog_x.xyz = TransformObjectToWorld(v.vertex.xyz); + o.vertex = TransformWorldToHClip(o.wPos_xyz_fog_x.xyz); + o.uv0 = TRANSFORM_TEX(v.uv0_vertexStream0_xy.xy, _BaseMap); + half clipZ_0Far = UNITY_Z_0_FAR_FROM_CLIPSPACE(o.vertex.z); + o.wPos_xyz_fog_x.w = unity_FogParams.x * clipZ_0Far; + o.color = v.color; + + + return o; +} + +fragOut frag(v2f i) +{ + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + + fragOut f; + +// Begin Injection FRAG_BEGIN from Injection_Particle_screenspaceUVs.hlsl ---------------------------------------------------------- + float2 screenUVs = GetNormalizedScreenSpaceUV(i.vertex); +// End Injection FRAG_BEGIN from Injection_Particle_screenspaceUVs.hlsl ---------------------------------------------------------- + +// Begin Injection FRAG_COLOR from Injection_Torch.hlsl ---------------------------------------------------------- + float angle1 = frac(_Time[0] * 3.1830988618 * _Speed) * TWO_PI; + float angle2 = frac(_Time[0] * 3.1830988618 * _Speed * _SecondarySpeed) * TWO_PI; + angle1 = -angle1; + float2 uv1 = RotateTorchUVs(i.uv0.xy, float2(0.5, 0.5), angle1); + half layer1 = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv1).r; + float2 uv2 = RotateTorchUVs(i.uv0.xy, float2(0.5, 0.5), angle2); + half layer2 = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv2).r; + half4 SSPattern = SAMPLE_TEXTURE2D(_ScreenSpacePattern, sampler_ScreenSpacePattern, _ScreenParams.xy * screenUVs / _ScreenSpaceSize); + f.color = (layer1 * layer2 * i.color.a) * SSPattern * _BaseColor * i.color; +// End Injection FRAG_COLOR from Injection_Torch.hlsl ---------------------------------------------------------- + + half3 viewDir = normalize(half3(i.wPos_xyz_fog_x.xyz - _WorldSpaceCameraPos)); + #if defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2) + #if defined(SLZ_PARTICLE_ADDITIVE) + f.color.rgb *= 1.0 - ComputeFogIntensity(i.wPos_xyz_fog_x.w); + #elif defined(SLZ_PARTICLE_MULTIPLICATIVE) + f.color.rgb = lerp(f.color.rgb, half3(1,1,1), ComputeFogIntensity(i.wPos_xyz_fog_x.w)); + #elif defined(SLZ_PARTICLE_ALPHABLEND) + f.color.rgb = MixFog(f.color.rgb, viewDir, i.wPos_xyz_fog_x.w); + #endif + #endif + + + #if defined(SLZ_PARTICLE_ADDITIVE) + #if defined(_VOLUMETRICS_ENABLED) + f.color *= GetVolumetricColor(i.wPos_xyz_fog_x.xyz).a; + #endif + #elif defined(SLZ_PARTICLE_ALPHABLEND) + f.color = Volumetrics(f.color, i.wPos_xyz_fog_x.xyz); + #endif + +// Begin Injection FRAG_END from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- + #if defined(SHADER_API_MOBILE) + half noise = GetScreenNoiseR(screenUVs); + f.depth = SLZSoftBlendZTest(i.vertex.z, noise, _SoftFactor); + #else + float rawDepth = SampleSceneDepth(screenUVs); + float viewZ = dot(GetWorldToViewMatrix()._m20_m21_m22_m23, float4(i.wPos_xyz_fog_x.xyz, 1)); + float fade = SLZSoftBlendDepth(rawDepth, viewZ, _SoftFactor); + #if defined(SLZ_PARTICLE_ADDITIVE) + f.color *= fade; + #elif defined(SLZ_PARTICLE_MULTIPLICATIVE) + f.color = lerp(fade, float4(1,1,1,1), f.color)); + #else + f.color.a *= fade; + #endif + #endif +// End Injection FRAG_END from Injection_Particle_SoftBlend.hlsl ---------------------------------------------------------- + + return f; +} \ No newline at end of file diff --git a/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.hlsl.meta b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.hlsl.meta new file mode 100644 index 0000000..1b468f1 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/ShaderInjector/ParticleTorch.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2313d59684d119840a78fee73c48959a +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/amplify_billboard_injector.hlsl b/Assets/SLZShaders/Include/Particle/amplify_billboard_injector.hlsl new file mode 100644 index 0000000..434d623 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/amplify_billboard_injector.hlsl @@ -0,0 +1 @@ +v.vertex.xyz = ParticleFaceCamera(v.vertex.xyz, v.ase_texcoord1.xyz); \ No newline at end of file diff --git a/Assets/SLZShaders/Include/Particle/amplify_billboard_injector.hlsl.meta b/Assets/SLZShaders/Include/Particle/amplify_billboard_injector.hlsl.meta new file mode 100644 index 0000000..9a69362 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/amplify_billboard_injector.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0e6e0041457dfeb47936aa37f7c4bfdf +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/amplify_billboard_injector_flare.hlsl b/Assets/SLZShaders/Include/Particle/amplify_billboard_injector_flare.hlsl new file mode 100644 index 0000000..64b33df --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/amplify_billboard_injector_flare.hlsl @@ -0,0 +1 @@ +v.vertex.xyz = MeshFlareBillboard(v.vertex.xyz); \ No newline at end of file diff --git a/Assets/SLZShaders/Include/Particle/amplify_billboard_injector_flare.hlsl.meta b/Assets/SLZShaders/Include/Particle/amplify_billboard_injector_flare.hlsl.meta new file mode 100644 index 0000000..2b0afbc --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/amplify_billboard_injector_flare.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 75872890b046c074fac20ab6d18e52b1 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Particle/billboard.hlsl b/Assets/SLZShaders/Include/Particle/billboard.hlsl new file mode 100644 index 0000000..c9963f0 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/billboard.hlsl @@ -0,0 +1,94 @@ +float3 centerEyePos() +{ + #if defined(UNITY_STEREO_MULTIVIEW_ENABLED) || defined(UNITY_STEREO_INSTANCING_ENABLED) + return 0.5 * (unity_StereoWorldSpaceCameraPos[0] + unity_StereoWorldSpaceCameraPos[1]); + #else + return _WorldSpaceCameraPos; + #endif +} + +/** Rotates a particle to face the camera in a more vr-correct way than unity's default particle system + * + */ + +float3 particle_face_camera(float3 vertex, inout float3 normal, inout float3 center) +{ + vertex.xyz -= center; + + float3 head = centerEyePos(); + float3 centerToEye = normalize(center-head); + float c2eXZLen = length(centerToEye.xz); + float sin1 = -centerToEye.y; + float cos1 = c2eXZLen; + float2x2 rotPitch = float2x2(cos1, sin1, -sin1, cos1); + + vertex.zy = mul(rotPitch, vertex.zy); + normal.zy = mul(rotPitch, normal.zy); + //tangent.zy = mul(rotPitch, tangent.zy); + + float sin2 = centerToEye.x/c2eXZLen; + float cos2 = centerToEye.z/c2eXZLen; + float2x2 rotYaw = float2x2(cos2, sin2, -sin2, cos2); + + vertex.xz = mul(rotYaw,vertex.xz); + normal.xz = mul(rotYaw,normal.xz); + //tangent.xz = mul(rotYaw,tangent.xz); + + vertex.xyz += center; + return vertex; +} + + + + +float3 ParticleFaceCamera(float3 vertex, float3 center) +{ + vertex.xyz -= center; + + float3 head = centerEyePos(); + float3 centerToEye = normalize(center - head); + float c2eXZLen = length(centerToEye.xz); + float sin1 = -centerToEye.y; + float cos1 = c2eXZLen; + float2x2 rotPitch = float2x2(cos1, sin1, -sin1, cos1); + + vertex.zy = mul(rotPitch, vertex.zy); + + + float sin2 = centerToEye.x / c2eXZLen; + float cos2 = centerToEye.z / c2eXZLen; + float2x2 rotYaw = float2x2(cos2, sin2, -sin2, cos2); + + vertex.xz = mul(rotYaw, vertex.xz); + + + vertex.xyz += center; + return vertex; +} + +float3 MeshFaceCamera(float3 vertex) +{ + float3 center = float3(0,0,0); + //vertex = TransformObjectToWorld(vertex); + + float3 head = TransformWorldToObject(centerEyePos()); + float3 centerToEye = normalize(center - head); + float c2eXZLen = length(centerToEye.xz); + float sin1 = -centerToEye.y; + float cos1 = c2eXZLen; + float2x2 rotPitch = float2x2(cos1, sin1, -sin1, cos1); + + vertex.zy = mul(rotPitch, vertex.zy); + + + float sin2 = centerToEye.x / c2eXZLen; + float cos2 = centerToEye.z / c2eXZLen; + float2x2 rotYaw = float2x2(cos2, sin2, -sin2, cos2); + + vertex.xz = mul(rotYaw, vertex.xz); + + + //vertex.xyz += center; + return vertex; +} + diff --git a/Assets/SLZShaders/Include/Particle/billboard.hlsl.meta b/Assets/SLZShaders/Include/Particle/billboard.hlsl.meta new file mode 100644 index 0000000..9ad0e98 --- /dev/null +++ b/Assets/SLZShaders/Include/Particle/billboard.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 40dd6881c3760054cacc50fdba7554dc +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/PlatformSamplers.hlsl b/Assets/SLZShaders/Include/PlatformSamplers.hlsl new file mode 100644 index 0000000..19fea63 --- /dev/null +++ b/Assets/SLZShaders/Include/PlatformSamplers.hlsl @@ -0,0 +1,16 @@ +#if defined(SHADER_API_MOBILE) // Quest 2 (XR2) works better with combined texture-samplers apparently + +#ifdef TEXTURE2D +#undef TEXTURE2D +#endif +#ifdef SAMPLER +#undef SAMPLER +#endif +#ifdef SAMPLE_TEXTURE2D +#undef SAMPLE_TEXTURE2D +#endif + +#define TEXTURE2D(textureName) sampler2D textureName +#define SAMPLER(samplerName) +#define SAMPLE_TEXTURE2D(textureName, samplerName, coord) tex2D(textureName, coord) +#endif \ No newline at end of file diff --git a/Assets/SLZShaders/Include/PlatformSamplers.hlsl.meta b/Assets/SLZShaders/Include/PlatformSamplers.hlsl.meta new file mode 100644 index 0000000..9afd0a7 --- /dev/null +++ b/Assets/SLZShaders/Include/PlatformSamplers.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6aab105c75192124887c893201ce93e0 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Include/Triplanar.hlsl b/Assets/SLZShaders/Include/Triplanar.hlsl new file mode 100644 index 0000000..5a1f302 --- /dev/null +++ b/Assets/SLZShaders/Include/Triplanar.hlsl @@ -0,0 +1,95 @@ +#if !defined(SLZ_TRIPLANAR_INCLUDED) +#define SLZ_TRIPLANAR_INCLUDED +//#define TEXTURE2D_PARAM(textureName, samplerName) Texture2D textureName, sampler samplerName + +/** + * Struct containg the ddx and ddy of the uvs combined into one half4 for each axis + */ +struct tpDerivatives +{ + half4 ddX; + half4 ddY; + half4 ddZ; +}; + +/** + * Gets the derivatives of the worldspace coordinates reduced to 3 2 dimensional planes defined by each axis + * + * @param wPos Worldspace position + * @param[out] dd struct containing the x and y derivatives of each plane + */ +void GetDirectionalDerivatives(float3 wPos, out tpDerivatives dd) +{ + dd.ddX.xy = ddx(wPos.zy); + dd.ddY.xy = ddx(wPos.xz); + dd.ddZ.xy = ddx(wPos.xy); + dd.ddX.zw = ddy(wPos.zy); + dd.ddY.zw = ddy(wPos.xz); + dd.ddZ.zw = ddy(wPos.xy); +} + +/** + * Determines the worldspace axis that the given mesh normal is most closely aligned to, and returns the coordinates of the + * pixel in the plane aligned with that axis and the derivatives associated with that plane. Also generates a tangent to world + * matrix using the axes orthogonal to the dominant axis as the tangent and bitangent. + * + * @param[out] triplanarUV Coordinates of the fragment in the plane aligned with the dominant axis + * @param[out] ddxMax X derivatives of the coordinates of the fragment in the plane aligned with the dominant axis + * @param[out] ddyMax Y derivatives of the coordinates of the fragment in the plane aligned with the dominant axis + * @param[out] tanToWrld Tangent to world matrix composed of the other two axes as tangent and bitangent, and the mesh normal as the normal + * @param wPos World-space position of the fragment + * @param wNorm World-space mesh normal + * @param dd derivatives of the fragment's coordinates in each axis aligned plane + */ +void GetTPUVExpensive(out float2 triplanarUV, out half2 ddxMax, out half2 ddyMax, out half3x3 tanToWrld, float3 wPos, half3 wNorm, + tpDerivatives dd) +{ + half3 dir; + dir.x = abs(wNorm.x) > abs(wNorm.y) && abs(wNorm.x) > abs(wNorm.z) ? 1 : 0; + dir.y = abs(wNorm.y) >= abs(wNorm.x) && abs(wNorm.y) > abs(wNorm.z) ? 1 : 0; + dir.z = abs(wNorm.z) >= abs(wNorm.y) && abs(wNorm.z) >= abs(wNorm.x) ? 1 : 0; + half3 dirSign = sign(wNorm); + dirSign.z = -dirSign.z; // u should be flipped on Z + ddxMax = dir.x * dd.ddX.xy + dir.y * dd.ddY.xy + dir.z * dd.ddZ.xy; + ddyMax = dir.x * dd.ddX.zw + dir.y * dd.ddY.zw + dir.z * dd.ddZ.zw; + //half3 maxDir = half3(dirX, dirY, dirZ); + float2 uvX = wPos.zy * float2(dirSign.x, 1.0); + triplanarUV = dir.x * uvX; + float2 uvY = wPos.xz * float2(dirSign.y, 1.0); + triplanarUV = mad(dir.y, uvY, triplanarUV); + float2 uvZ = wPos.xy * float2(dirSign.z, 1.0); + triplanarUV = mad(dir.z, uvZ, triplanarUV); + + + tanToWrld = half3x3( + dir.y * dirSign.y + dir.z * dirSign.z, 0, wNorm.x, + 0, dir.x + dir.z, wNorm.y, + dir.x * dirSign.x, dir.y, wNorm.z + ); + +} + +void GetTPUVCheap(out float2 triplanarUV, out half3x3 tanToWrld, float3 wPos, half3 wNorm) +{ + half3 dir; + dir.x = abs(wNorm.x) > abs(wNorm.y) && abs(wNorm.x) > abs(wNorm.z) ? 1 : 0; + dir.y = abs(wNorm.y) >= abs(wNorm.x) && abs(wNorm.y) > abs(wNorm.z) ? 1 : 0; + dir.z = abs(wNorm.z) >= abs(wNorm.y) && abs(wNorm.z) >= abs(wNorm.x) ? 1 : 0; + half3 dirSign = sign(wNorm); + dirSign.z = -dirSign.z; // u should be flipped on Z + //half3 maxDir = half3(dirX, dirY, dirZ); + float2 uvX = wPos.zy * float2(dirSign.x, 1.0); + triplanarUV = dir.x * uvX; + float2 uvY = wPos.xz * float2(dirSign.y, 1.0); + triplanarUV = mad(dir.y, uvY, triplanarUV); + float2 uvZ = wPos.xy * float2(dirSign.z, 1.0); + triplanarUV = mad(dir.z, uvZ, triplanarUV); + + tanToWrld = half3x3( + dir.y * dirSign.y + dir.z * dirSign.z, 0, wNorm.x, + 0, dir.x + dir.z, wNorm.y, + dir.x * dirSign.x, dir.y, wNorm.z + ); +} + +#endif \ No newline at end of file diff --git a/Assets/SLZShaders/Include/Triplanar.hlsl.meta b/Assets/SLZShaders/Include/Triplanar.hlsl.meta new file mode 100644 index 0000000..0f104a7 --- /dev/null +++ b/Assets/SLZShaders/Include/Triplanar.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 225aec2e7a259b642a9fa1a4d10d7aac +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Mod2x.shader b/Assets/SLZShaders/Mod2x.shader new file mode 100644 index 0000000..2b7c376 --- /dev/null +++ b/Assets/SLZShaders/Mod2x.shader @@ -0,0 +1,225 @@ +Shader "SLZ/Mod2x" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1) + _MainTex("MainTex", 2D) = "gray" {} + [HDR]_Color("Color", Color) = (1,1,1,0) + _OffsetUnits("OffsetUnits", Int) = -2 + _OffsetFactor("OffsetFactor", Int) = -2 + _Multiplier("Multiplier", Float) = 1 + [Toggle(_ALPHA_ON)] _alpha("alpha", Float) = 0 + [Toggle(_VERTEXCOLORS_ON)] _VertexColors("VertexColors", Float) = 1 + // [HideInInspector] _texcoord( "", 2D ) = "white" {} + + // [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + // [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + // [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + // [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + // [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + } + + SubShader + { + LOD 0 + + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Transparent" "Queue"="Transparent-499" "IgnoreProjector" = "True"} + + Cull Back + AlphaToMask Off + + HLSLINCLUDE + #pragma target 5.0 + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + ENDHLSL + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForward" } + + Blend DstColor SrcColor + ZWrite Off + ZTest LEqual + Offset [_OffsetFactor] , [_OffsetUnits] + ColorMask RGBA + + HLSLPROGRAM + + #define _RECEIVE_SHADOWS_OFF 1 + #pragma multi_compile_instancing + #define ASE_SRP_VERSION 999999 + #define SHADERPASS SHADERPASS_UNLIT + + #pragma vertex vert + #pragma fragment frag + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + //#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + //#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + //#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + //#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + //#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + //#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/Debugging3D.hlsl" + //#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl" + //#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceData.hlsl" + + + #define ASE_NEEDS_FRAG_COLOR + #define ASE_NEEDS_FRAG_WORLD_POSITION + #pragma shader_feature _ALPHA_ON + #pragma shader_feature _VERTEXCOLORS_ON + #pragma multi_compile _ _VOLUMETRICS_ENABLED + #pragma multi_compile_fog + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + float4 ase_color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float3 worldPos : TEXCOORD0; + float fogFactor : TEXCOORD2; + float4 ase_texcoord3 : TEXCOORD3; + float4 ase_color : COLOR; + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + int _OffsetUnits; + int _OffsetFactor; + float _Multiplier; + CBUFFER_END + sampler2D _MainTex; + + shared float _StaticLightMultiplier; + + + VertexOutput VertexFunction ( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord4 = screenPos; + o.ase_texcoord3.xy = v.ase_texcoord.xy; + o.ase_color = v.ase_color; + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord3.zw = 0; + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + o.fogFactor = ComputeFogFactor( positionCS.z ); + o.clipPos = positionCS; + return o; + } + + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + + half3 Mod2xFog(half3 fragColor, half fogFactor) + { + #if defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2) + half fogIntensity = ComputeFogIntensity(fogFactor); + fragColor = lerp(0.5, fragColor, fogIntensity); + #endif + return fragColor; + } + + half4 frag ( VertexOutput IN ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float localMyCustomExpression1_g126 = ( 0.0 ); + float2 uv_MainTex = IN.ase_texcoord3.xy * _MainTex_ST.xy + _MainTex_ST.zw; + float4 appendResult52 = (float4(1.0 , 1.0 , 1.0 , IN.ase_color.a)); + #ifdef _VERTEXCOLORS_ON + float4 staticSwitch38 = IN.ase_color; + #else + float4 staticSwitch38 = appendResult52; + #endif + float4 temp_output_16_0 = ( tex2D( _MainTex, uv_MainTex ) * _Color * staticSwitch38 ); + float4 temp_output_26_0 = ( ( ( temp_output_16_0 - .5 ) * _Multiplier ) + 0.5 ); + #ifdef _ALPHA_ON + float4 lerpResult30 = lerp( .5 , temp_output_26_0 , (temp_output_16_0).a); + float4 staticSwitch28 = lerpResult30; + #else + float4 staticSwitch28 = temp_output_26_0; + #endif + float4 color1_g126 = staticSwitch28; + float localMyCustomExpression24_g126 = ( 0.0 ); + float4 screenPos = IN.ase_texcoord4; + float4 ase_screenPosNorm = screenPos / screenPos.w; + ase_screenPosNorm.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? ase_screenPosNorm.z : ase_screenPosNorm.z * 0.5 + 0.5; + float2 uv24_g126 = (ase_screenPosNorm).xy; + + float3 BakedAlbedo = 0; + float3 BakedEmission = 0; + float3 Color = color1_g126.xyz; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + + #ifdef _ALPHATEST_ON + clip( Alpha - AlphaClipThreshold ); + #endif + + #if defined(_ALPHAPREMULTIPLY_ON) + Color *= Alpha; + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + Color.rgb = Mod2xFog( Color, IN.fogFactor ); + + #if defined(_VOLUMETRICS_ENABLED) + //works fine on the PC but not quest. Using a semi-plausible result otherwise. + #if !defined(SHADER_API_MOBILE) + half3 FroxelColor = GetVolumetricColor(WorldPosition).rgb; + Color.rgb = Color.rgb - 0.5* (2.0*Color.rgb - 1.0) * FroxelColor / SampleSceneColor(uv24_g126).rgb; + #else + half4 FroxelColor = GetVolumetricColor(IN.worldPos); + Color.rgb = Color.rgb + (saturate(FroxelColor.rgb)*(0.5-Color.rgb)); //rgb lerp //x + s(y-x) + Color.rgb = lerp(0.5, Color , saturate(FroxelColor.a*FroxelColor.a) ); + #endif + #endif + + return half4( Color, Alpha ); + } + + ENDHLSL + } + } + Fallback "Hidden/InternalErrorShader" +} \ No newline at end of file diff --git a/Assets/SLZShaders/Mod2x.shader.meta b/Assets/SLZShaders/Mod2x.shader.meta new file mode 100644 index 0000000..0f63294 --- /dev/null +++ b/Assets/SLZShaders/Mod2x.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 4c21875978f9ed04d9edcf6d97e9ed54 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/NullShader.shader b/Assets/SLZShaders/NullShader.shader new file mode 100644 index 0000000..774c6b4 --- /dev/null +++ b/Assets/SLZShaders/NullShader.shader @@ -0,0 +1,3426 @@ +// Made with Amplify Shader Editor +// Available at the Unity Asset Store - http://u3d.as/y3X +Shader "SLZ/Nullman" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1) + [ASEBegin]_BaseMap("_BaseMap", 2D) = "white" {} + [NoScaleOffset]g_tBRDFMap("BRDF map", 2D) = "white" {} + [NoScaleOffset]_WireColor("WireColor", 2D) = "white" {} + _WireScale("Wire Scale", Float) = 3 + _Refraction("Refraction", Range( 0.5 , 1)) = 0.884 + _Smoothness("Smoothness", Range( 0 , 1)) = 0 + _Metallic("Metallic", Range( 0 , 1)) = 0 + [HDR]_Emission("Emission", Color) = (1,1,1,1) + [NoScaleOffset][SingleLineTexture]_HitRamp("Hit Ramp", 2D) = "black" {} + [HideInInspector]_NumberOfHits("_NumberOfHits", Int) = 0 + _Cubemap("Cubemap", CUBE) = "white" {} + [ASEEnd][Toggle]_CustomCubemap("Custom Cubemap", Float) = 1 + [HideInInspector] _texcoord( "", 2D ) = "white" {} + + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + //_TransmissionShadow( "Transmission Shadow", Range( 0, 1 ) ) = 0.5 + //_TransStrength( "Trans Strength", Range( 0, 50 ) ) = 1 + //_TransNormal( "Trans Normal Distortion", Range( 0, 1 ) ) = 0.5 + //_TransScattering( "Trans Scattering", Range( 1, 50 ) ) = 2 + //_TransDirect( "Trans Direct", Range( 0, 1 ) ) = 0.9 + //_TransAmbient( "Trans Ambient", Range( 0, 1 ) ) = 0.1 + //_TransShadow( "Trans Shadow", Range( 0, 1 ) ) = 0.5 + //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5 + //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16 + //_TessMin( "Tess Min Distance", Float ) = 10 + //_TessMax( "Tess Max Distance", Float ) = 25 + //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16 + //_TessMaxDisp( "Tess Max Displacement", Float ) = 25 + } + + SubShader + { + LOD 0 + + + + + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Opaque" "Queue"="Geometry" } + Cull Back + ZWrite On + ZTest LEqual + Offset 0 , 0 + AlphaToMask Off + + HLSLINCLUDE + #pragma target 3.0 + + #pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + + #ifndef ASE_TESS_FUNCS + #define ASE_TESS_FUNCS + float4 FixedTess( float tessValue ) + { + return tessValue; + } + + float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos ) + { + float3 wpos = mul(o2w,vertex).xyz; + float dist = distance (wpos, cameraPos); + float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess; + return f; + } + + float4 CalcTriEdgeTessFactors (float3 triVertexFactors) + { + float4 tess; + tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z); + tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z); + tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y); + tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f; + return tess; + } + + float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams ) + { + float dist = distance (0.5 * (wpos0+wpos1), cameraPos); + float len = distance(wpos0, wpos1); + float f = max(len * scParams.y / (edgeLen * dist), 1.0); + return f; + } + + float DistanceFromPlane (float3 pos, float4 plane) + { + float d = dot (float4(pos,1.0f), plane); + return d; + } + + bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] ) + { + float4 planeTest; + planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f ); + return !all (planeTest); + } + + float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos ) + { + float3 f; + f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos); + f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos); + f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos); + + return CalcTriEdgeTessFactors (f); + } + + float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + return tess; + } + + float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + + if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes)) + { + tess = 0.0f; + } + else + { + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + } + return tess; + } + #endif //ASE_TESS_FUNCS + + ENDHLSL + + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForward" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_FORWARD + + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + + #define ASE_NEEDS_FRAG_WORLD_NORMAL + #define ASE_NEEDS_FRAG_WORLD_VIEW_DIR + #pragma shader_feature_local_fragment _BRDFMAP + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PosespaceImpacts.hlsl" + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DefaultLitVariants.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_texcoord8 : TEXCOORD8; + float4 ase_texcoord9 : TEXCOORD9; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + half4x4 EllipsoidPosArray[HitMatrixCount]; + float4 _BaseMap_ST; + float4 _Emission; + int _NumberOfHits; + float _CustomCubemap; + float _Refraction; + float _WireScale; + float _Metallic; + float _Smoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + TEXTURECUBE(_Cubemap); + SAMPLER(sampler_Cubemap); + TEXTURE2D(_WireColor); + SAMPLER(sampler_WireColor); + + + half2 PosespaceImpacts_A( float3 Posespace ) + { + return GetClosestImpactUV( Posespace, EllipsoidPosArray , _NumberOfHits ); + } + + half2 SampleHitTex( half2 ImpactsUV ) + { + return SampleHitTexture(ImpactsUV); + } + + float3 MyCustomExpression( float3 viewDirectionWS, float blur ) + { + return DecodeHDREnvironment(SAMPLE_TEXTURECUBE_LOD(unity_SpecCube0, samplerunity_SpecCube0 , viewDirectionWS, blur*UNITY_SPECCUBE_LOD_STEPS), unity_SpecCube0_HDR); + } + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord8.xyz = v.texcoord.xyz; + o.ase_texcoord9.xyz = v.texcoord1.xyz; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.w = 0; + o.ase_texcoord9.w = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + #if defined(LIGHTMAP_ON) + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + #if !defined(LIGHTMAP_ON) + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + #endif + + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) || defined(ASE_TERRAIN_INSTANCING) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float3 normalizedWorldNormal = normalize( WorldNormal ); + float dotResult13 = dot( normalizedWorldNormal , WorldViewDirection ); + float temp_output_89_0 = saturate( dotResult13 ); + float2 uv_BaseMap = IN.ase_texcoord8.xyz.xy * _BaseMap_ST.xy + _BaseMap_ST.zw; + float4 tex2DNode8 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ); + float4 temp_output_14_0 = ( temp_output_89_0 * temp_output_89_0 * tex2DNode8 ); + + float3 texCoord31 = IN.ase_texcoord9.xyz; + texCoord31.xy = IN.ase_texcoord9.xyz.xy * float2( 1,1 ) + float2( 0,0 ); + half3 Posespace29 = texCoord31; + half2 localPosespaceImpacts_A29 = PosespaceImpacts_A( Posespace29 ); + half2 ImpactsUV137 = localPosespaceImpacts_A29; + half2 localSampleHitTex137 = SampleHitTex( ImpactsUV137 ); + float temp_output_144_0 = min( (localSampleHitTex137).y , ( 1.0 - floor( (localPosespaceImpacts_A29).x ) ) ); + float3 temp_output_66_0 = refract( -WorldViewDirection , normalizedWorldNormal , _Refraction ); + float3 viewDirectionWS58 = temp_output_66_0; + float temp_output_65_0 = ( 1.0 - temp_output_89_0 ); + float blur58 = temp_output_65_0; + float3 localMyCustomExpression58 = MyCustomExpression( viewDirectionWS58 , blur58 ); + float3 texCoord5 = IN.ase_texcoord9.xyz; + texCoord5.xy = IN.ase_texcoord9.xyz.xy * float2( 1,1 ) + float2( 0,0 ); + float4 tex2DNode7 = SAMPLE_TEXTURE2D( _WireColor, sampler_WireColor, ( texCoord5 * _WireScale ).xy ); + float4 blendOpSrc129 = tex2DNode8; + float4 blendOpDest129 = tex2DNode7; + float4 lerpBlendMode129 = lerp(blendOpDest129,abs( blendOpSrc129 - blendOpDest129 ),saturate( (0.0 + (temp_output_65_0 - 0.48) * (1.0 - 0.0) / (1.0 - 0.48)) )); + float temp_output_145_0 = ( 1.0 - temp_output_144_0 ); + float4 lerpResult160 = lerp( (( _CustomCubemap )?( SAMPLE_TEXTURECUBE_LOD( _Cubemap, sampler_Cubemap, temp_output_66_0, temp_output_65_0 ) ):( float4( localMyCustomExpression58 , 0.0 ) )) , ( ( lerpBlendMode129 + ( (( _CustomCubemap )?( SAMPLE_TEXTURECUBE_LOD( _Cubemap, sampler_Cubemap, temp_output_66_0, temp_output_65_0 ) ):( float4( localMyCustomExpression58 , 0.0 ) )) * temp_output_14_0 ) ) * temp_output_145_0 * _Emission ) , min( temp_output_145_0 , tex2DNode7.a )); + + float3 Albedo = temp_output_14_0.rgb; + float3 Normal = float3(0, 0, 1); + float3 Emission = ( float4( ( localSampleHitTex137 * temp_output_144_0 ), 0.0 , 0.0 ) + lerpResult160 ).rgb; +#if 0 + float3 BakedEmission = 0; +#endif + float3 Specular = 0.5; + float Metallic = _Metallic; + float Smoothness = _Smoothness; + float Occlusion = temp_output_145_0; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _CLEARCOAT + float CoatMask = 0; + float CoatSmoothness = 0; + #endif + + #if defined(_FLUORESCENCE) + float4 Fluorescence = 0; + float4 Absorbance = 0; + #endif + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.viewDirectionWS = WorldViewDirection; + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + #else + inputData.normalWS = WorldNormal; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + inputData.shadowCoord = ShadowCoords; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + inputData.shadowCoord = TransformWorldToShadowCoord(inputData.positionWS); + #else + inputData.shadowCoord = float4(0, 0, 0, 0); + #endif + + + #ifdef ASE_FOG + inputData.fogCoord = IN.fogFactorAndVertexLight.x; + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzww; //TODO: Shuffle things in vertex streams so we get full RGBA color rather than RGBB here + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xyz, IN.dynamicLightmapUV.xy, IN.vertexSH, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI(IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, IN.vertexSH , inputData.normalWS); + #endif + + #else + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + #endif + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + SurfaceData surfaceData; + surfaceData.albedo = Albedo; + surfaceData.metallic = saturate(Metallic); + surfaceData.specular = Specular; + surfaceData.smoothness = saturate(Smoothness), + surfaceData.occlusion = Occlusion, + surfaceData.emission = Emission, + surfaceData.alpha = saturate(Alpha); + surfaceData.normalTS = Normal; + surfaceData.clearCoatMask = 0; + surfaceData.clearCoatSmoothness = 1; + + #ifdef _CLEARCOAT + surfaceData.clearCoatMask = saturate(CoatMask); + surfaceData.clearCoatSmoothness = saturate(CoatSmoothness); + #endif + #if defined(_FLUORESCENCE) + surfaceData.fluorescence = Fluorescence; + surfaceData.absorbance = Absorbance; + #endif + + #ifdef _DBUFFER + ApplyDecalToSurfaceData(IN.clipPos, surfaceData, inputData); + #endif + + half4 color = UniversalFragmentPBR( inputData, surfaceData); + + #ifdef LIGHTMAP_ON + float3 MetalSpec = lerp(kDieletricSpec.rgb, surfaceData.albedo , surfaceData.metallic); + color.rgb += BakedSpecular * surfaceData.occlusion * MetalSpec * inputData.bakedGI.rgb; + #endif + + #ifdef _TRANSMISSION_ASE + { + float shadow = _TransmissionShadow; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + half3 mainTransmission = max(0 , -dot(inputData.normalWS, mainLight.direction)) * mainAtten * Transmission; + color.rgb += Albedo * mainTransmission; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 transmission = max(0 , -dot(inputData.normalWS, light.direction)) * atten * Transmission; + color.rgb += Albedo * transmission; + } + #endif + } + #endif + + #ifdef _TRANSLUCENCY_ASE + { + float shadow = _TransShadow; + float normal = _TransNormal; + float scattering = _TransScattering; + float direct = _TransDirect; + float ambient = _TransAmbient; + float strength = _TransStrength; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + + half3 mainLightDir = mainLight.direction + inputData.normalWS * normal; + half mainVdotL = pow( saturate( dot( inputData.viewDirectionWS, -mainLightDir ) ), scattering ); + half3 mainTranslucency = mainAtten * ( mainVdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * mainTranslucency * strength; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 lightDir = light.direction + inputData.normalWS * normal; + half VdotL = pow( saturate( dot( inputData.viewDirectionWS, -lightDir ) ), scattering ); + half3 translucency = atten * ( VdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * translucency * strength; + } + #endif + } + #endif + + #ifdef _REFRACTION_ASE + float4 projScreenPos = ScreenPos / ScreenPos.w; + float3 refractionOffset = ( RefractionIndex - 1.0 ) * mul( UNITY_MATRIX_V, float4( WorldNormal,0 ) ).xyz * ( 1.0 - dot( WorldNormal, WorldViewDirection ) ); + projScreenPos.xy += refractionOffset.xy; + float3 refraction = SHADERGRAPH_SAMPLE_SCENE_COLOR( projScreenPos.xy ) * RefractionColor; + color.rgb = lerp( refraction, color.rgb, color.a ); + color.a = 1; + #endif + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, -inputData.viewDirectionWS, IN.fogFactorAndVertexLight.x); + #endif + #endif + + color = Volumetrics( color, inputData.positionWS); + + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return color; + } + + ENDHLSL + } + + + Pass + { + + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + + ZWrite On + ZTest LEqual + AlphaToMask Off + ColorMask 0 + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #pragma multi_compile _ _CASTING_PUNCTUAL_LIGHT_SHADOW + + #define SHADERPASS SHADERPASS_SHADOWCASTER + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #pragma shader_feature_local_fragment _BRDFMAP + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PosespaceImpacts.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + half4 EllipsoidPosArray[HitMatrixCount]; + float4 _BaseMap_ST; + float4 _Emission; + int _NumberOfHits; + float _CustomCubemap; + float _Refraction; + float _WireScale; + float _Metallic; + float _Smoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + float3 _LightDirection; + float3 _LightPosition; + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + + float3 normalWS = TransformObjectToWorldDir(v.ase_normal); + + + #if _CASTING_PUNCTUAL_LIGHT_SHADOW + float3 lightDirectionWS = normalize(_LightPosition - positionWS); + #else + float3 lightDirectionWS = _LightDirection; + #endif + float2 vShadowOffsets = GetShadowOffsets( normalWS, lightDirectionWS ); + positionWS.xyz -= vShadowOffsets.y * lightDirectionWS.xyz * .01; + float4 clipPos = TransformObjectToHClip( float4( mul( unity_WorldToObject, float4( positionWS.xyz, 1.0 ) ).xyz, 1.0 ) ); + //float4 clipPos = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, lightDirectionWS)); + + #if UNITY_REVERSED_Z + clipPos.z = min(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #else + clipPos.z = max(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #endif + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = clipPos; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + #ifdef _ALPHATEST_SHADOW_ON + clip(Alpha - AlphaClipThresholdShadow); + #else + clip(Alpha - AlphaClipThreshold); + #endif + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + return 0; + } + + ENDHLSL + } + + + Pass + { + + Name "DepthOnly" + Tags { "LightMode"="DepthOnly" } + + ZWrite On + ColorMask 0 + AlphaToMask Off + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #pragma shader_feature_local_fragment _BRDFMAP + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PosespaceImpacts.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + half4x4 EllipsoidPosArray[HitMatrixCount]; + float4 _BaseMap_ST; + float4 _Emission; + int _NumberOfHits; + float _CustomCubemap; + float _Refraction; + float _WireScale; + float _Metallic; + float _Smoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return 0; + } + ENDHLSL + } + + + Pass + { + + Name "Meta" + Tags { "LightMode"="Meta" } + + Cull Off + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #pragma shader_feature _ EDITOR_VISUALIZATION + + #define SHADERPASS SHADERPASS_META + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/MetaInput.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #define ASE_NEEDS_VERT_NORMAL + #define ASE_NEEDS_FRAG_WORLD_POSITION + #pragma shader_feature_local_fragment _BRDFMAP + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PosespaceImpacts.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + #ifdef EDITOR_VISUALIZATION + float4 VizUV : TEXCOORD2; + float4 LightCoord : TEXCOORD3; + #endif + float4 ase_texcoord4 : TEXCOORD4; + float4 ase_texcoord5 : TEXCOORD5; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + half4x4 EllipsoidPosArray[HitMatrixCount]; + float4 _BaseMap_ST; + float4 _Emission; + int _NumberOfHits; + float _CustomCubemap; + float _Refraction; + float _WireScale; + float _Metallic; + float _Smoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + float3 ase_worldNormal = TransformObjectToWorldNormal(v.ase_normal); + o.ase_texcoord4.xyz = ase_worldNormal; + + o.ase_texcoord5.xy = v.texcoord0.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.w = 0; + o.ase_texcoord5.zw = 0; + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.clipPos = MetaVertexPosition( v.vertex, v.texcoord1.xy, v.texcoord1.xy, unity_LightmapST, unity_DynamicLightmapST ); + + #ifdef EDITOR_VISUALIZATION + float2 VizUV = 0; + float4 LightCoord = 0; + UnityEditorVizData(v.vertex.xyz, v.texcoord0.xy, v.texcoord1.xy, v.texcoord2.xy, VizUV, LightCoord); + o.VizUV = float4(VizUV, 0, 0); + o.LightCoord = LightCoord; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = o.clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.texcoord0 = v.texcoord0; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.texcoord0 = patch[0].texcoord0 * bary.x + patch[1].texcoord0 * bary.y + patch[2].texcoord0 * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float3 ase_worldNormal = IN.ase_texcoord4.xyz; + float3 normalizedWorldNormal = normalize( ase_worldNormal ); + float3 ase_worldViewDir = ( _WorldSpaceCameraPos.xyz - WorldPosition ); + ase_worldViewDir = SafeNormalize( ase_worldViewDir ); + float dotResult13 = dot( normalizedWorldNormal , ase_worldViewDir ); + float temp_output_89_0 = saturate( dotResult13 ); + float2 uv_BaseMap = IN.ase_texcoord5.xy * _BaseMap_ST.xy + _BaseMap_ST.zw; + float4 tex2DNode8 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ); + float4 temp_output_14_0 = ( temp_output_89_0 * temp_output_89_0 * tex2DNode8 ); + + + float3 Albedo = temp_output_14_0.rgb; + float3 Emission = 0; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + MetaInput metaInput = (MetaInput)0; + metaInput.Albedo = Albedo; + metaInput.Emission = Emission; + #ifdef EDITOR_VISUALIZATION + metaInput.VizUV = IN.VizUV.xy; + metaInput.LightCoord = IN.LightCoord; + #endif + + return MetaFragment(metaInput); + } + ENDHLSL + } + + /*ase_pass*/ + Pass + { + + Name "BakedRaytrace" + Tags{ "LightMode" = "BakedRaytrace" } + HLSLPROGRAM + + /*ase_pragma_before*/ + + #define SHADERPASS SHADERPASS_RAYTRACE + + #include "UnityRaytracingMeshUtils.cginc" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #define _EMISSION + #pragma raytracing test + #pragma shader_feature_local __ _ALBEDOMULTIPLY_ON + #pragma shader_feature_local __ _EMISSION_ON + + /*ase_pragma*/ + + struct RayPayload + { + float4 color; + float3 dir; + }; + + struct AttributeData + { + float2 barycentrics; + }; + + struct Vertex + { + float2 texcoord; + float3 normal; + }; + + Texture2D _BaseMap; + SamplerState sampler_BaseMap; + + CBUFFER_START( UnityPerMaterial ) + /*ase_srp_batcher*/ + Texture2D _EmissionMap; + SamplerState sampler_EmissionMap; + + float4 _EmissionColor; + float4 _BaseMap_ST; + float _BakedMutiplier = 1; + CBUFFER_END + + /*ase_globals*/ + + /*ase_funcs*/ + + //https://coty.tips/raytracing-in-unity/ + [shader("closesthit")] + void MyClosestHit(inout RayPayload payload, + AttributeData attributes : SV_IntersectionAttributes) { + + payload.color = float4(0,0,0,1); //Intializing + payload.dir = float3(1,0,0); + + // #if _EMISSION_ON + uint2 launchIdx = DispatchRaysIndex(); + // ShadingData shade = getShadingData( PrimitiveIndex(), attribs ); + + uint primitiveIndex = PrimitiveIndex(); + uint3 triangleIndicies = UnityRayTracingFetchTriangleIndices(primitiveIndex); + Vertex v0, v1, v2; + + v0.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.x, kVertexAttributeTexCoord0); + v1.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.y, kVertexAttributeTexCoord0); + v2.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.z, kVertexAttributeTexCoord0); + + // v0.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.x, kVertexAttributeNormal); + // v1.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.y, kVertexAttributeNormal); + // v2.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.z, kVertexAttributeNormal); + + float3 barycentrics = float3(1.0 - attributes.barycentrics.x - attributes.barycentrics.y, attributes.barycentrics.x, attributes.barycentrics.y); + + Vertex vInterpolated; + vInterpolated.texcoord = v0.texcoord * barycentrics.x + v1.texcoord * barycentrics.y + v2.texcoord * barycentrics.z; + //TODO: Extract normal direction to ignore the backside of emissive objects + //vInterpolated.normal = v0.normal * barycentrics.x + v1.normal * barycentrics.y + v2.normal * barycentrics.z; + // if ( dot(vInterpolated.normal, float3(1,0,0) < 0) ) payload.color = float4(0,10,0,1) ; + // else payload.color = float4(10,0,0,1) ; + + //TODO: Figure out how to tie Amplify into using Texture2d and SamplerState instead of the bundled sampler2D. Forcing names for now. + //#if _ALBEDOMULTIPLY_ON + float4 albedo = float4(_BaseMap.SampleLevel(sampler_BaseMap, vInterpolated.texcoord.xy * _BaseMap_ST.xy + _BaseMap_ST.zw, 0 ).rgb , 1) ; + // #else + // float4 albedo = float4(1,1,1,1); + // #endif + + payload.color = float4( (_EmissionMap.SampleLevel(sampler_EmissionMap, vInterpolated.texcoord * _BaseMap_ST.xy + _BaseMap_ST.zw,0) ).rgb * _EmissionColor.rgb * albedo.rgb * _BakedMutiplier , 1 ); + // #else + // payload.color = float4(0,0,0,1); + + // #endif + } + ENDHLSL + + } + + + Pass + { + + Name "Universal2D" + Tags { "LightMode"="Universal2D" } + + Blend One Zero, One Zero + ColorMask RGBA + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_2D + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #define ASE_NEEDS_VERT_NORMAL + #define ASE_NEEDS_FRAG_WORLD_POSITION + #pragma shader_feature_local_fragment _BRDFMAP + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PosespaceImpacts.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float4 ase_texcoord2 : TEXCOORD2; + float4 ase_texcoord3 : TEXCOORD3; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + half4x4 EllipsoidPosArray[HitMatrixCount]; + float4 _BaseMap_ST; + float4 _Emission; + int _NumberOfHits; + float _CustomCubemap; + float _Refraction; + float _WireScale; + float _Metallic; + float _Smoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID( v ); + UNITY_TRANSFER_INSTANCE_ID( v, o ); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + float3 ase_worldNormal = TransformObjectToWorldNormal(v.ase_normal); + o.ase_texcoord2.xyz = ase_worldNormal; + + o.ase_texcoord3.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord2.w = 0; + o.ase_texcoord3.zw = 0; + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float3 ase_worldNormal = IN.ase_texcoord2.xyz; + float3 normalizedWorldNormal = normalize( ase_worldNormal ); + float3 ase_worldViewDir = ( _WorldSpaceCameraPos.xyz - WorldPosition ); + ase_worldViewDir = SafeNormalize( ase_worldViewDir ); + float dotResult13 = dot( normalizedWorldNormal , ase_worldViewDir ); + float temp_output_89_0 = saturate( dotResult13 ); + float2 uv_BaseMap = IN.ase_texcoord3.xy * _BaseMap_ST.xy + _BaseMap_ST.zw; + float4 tex2DNode8 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ); + float4 temp_output_14_0 = ( temp_output_89_0 * temp_output_89_0 * tex2DNode8 ); + + + float3 Albedo = temp_output_14_0.rgb; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + half4 color = half4( Albedo, Alpha ); + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + return color; + } + ENDHLSL + } + + + Pass + { + + Name "DepthNormals" + Tags { "LightMode"="DepthNormals" } + + ZWrite On + Blend One Zero + ZTest LEqual + ZWrite On + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + + #pragma shader_feature_local_fragment _BRDFMAP + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PosespaceImpacts.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float3 worldNormal : TEXCOORD2; + float4 worldTangent : TEXCOORD3; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + half4x4 EllipsoidPosArray[HitMatrixCount]; + float4 _BaseMap_ST; + float4 _Emission; + int _NumberOfHits; + float _CustomCubemap; + float _Refraction; + float _WireScale; + float _Metallic; + float _Smoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal( v.ase_normal ); + float4 tangentWS = float4(TransformObjectToWorldDir( v.ase_tangent.xyz), v.ase_tangent.w); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.worldNormal = normalWS; + o.worldTangent = tangentWS; + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + float3 WorldNormal = IN.worldNormal; + float4 WorldTangent = IN.worldTangent; + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float3 Normal = float3(0, 0, 1); + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + #if defined(_GBUFFER_NORMALS_OCT) + float2 octNormalWS = PackNormalOctQuadEncode(WorldNormal); + float2 remappedOctNormalWS = saturate(octNormalWS * 0.5 + 0.5); + half3 packedNormalWS = PackFloat2To888(remappedOctNormalWS); + return half4(packedNormalWS, 0.0); + #else + + #if defined(_NORMALMAP) + #if _NORMAL_DROPOFF_TS + float crossSign = (WorldTangent.w > 0.0 ? 1.0 : -1.0) * GetOddNegativeScale(); + float3 bitangent = crossSign * cross(WorldNormal.xyz, WorldTangent.xyz); + float3 normalWS = TransformTangentToWorld(Normal, half3x3(WorldTangent.xyz, bitangent, WorldNormal.xyz)); + #elif _NORMAL_DROPOFF_OS + float3 normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + float3 normalWS = Normal; + #endif + #else + float3 normalWS = WorldNormal; + #endif + + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + #endif + } + ENDHLSL + } + + + Pass + { + + Name "GBuffer" + Tags { "LightMode"="UniversalGBuffer" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM +#define _NORMAL_DROPOFF_TS 1#pragma multi_compile_fog#define ASE_FOG 1#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED#define _DISABLE_LIGHTMAPS#define _EMISSION#define ASE_SRP_VERSION 999999#define ASE_USING_SAMPLING_MACROS 1 +#if FALSE + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile _ DYNAMICLIGHTMAP_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE + //_MAIN_LIGHT_SHADOWS_SCREEN + + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION + + #pragma multi_compile_fragment _ _SHADOWS_SOFT + #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING + #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE + //#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile _ _GBUFFER_NORMALS_OCT + //#pragma multi_compile_fragment _ _LIGHT_LAYERS + #pragma multi_compile _ _RENDER_PASS_ENABLED + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_GBUFFER + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl" + + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + #define ASE_NEEDS_FRAG_WORLD_NORMAL + #define ASE_NEEDS_FRAG_WORLD_VIEW_DIR + #pragma shader_feature_local_fragment _BRDFMAP + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PosespaceImpacts.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_texcoord8 : TEXCOORD8; + float4 ase_texcoord9 : TEXCOORD9; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + half4x4 EllipsoidPosArray[HitMatrixCount]; + float4 _BaseMap_ST; + float4 _Emission; + int _NumberOfHits; + float _CustomCubemap; + float _Refraction; + float _WireScale; + float _Metallic; + float _Smoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + TEXTURECUBE(_Cubemap); + SAMPLER(sampler_Cubemap); + TEXTURE2D(_WireColor); + SAMPLER(sampler_WireColor); + + + half2 PosespaceImpacts_A( float3 Posespace ) + { + return GetClosestImpactUV( Posespace, EllipsoidPosArray , _NumberOfHits ); + } + + half2 SampleHitTex( half2 ImpactsUV ) + { + return SampleHitTexture(ImpactsUV); + } + + float3 MyCustomExpression( float3 viewDirectionWS, float blur ) + { + return DecodeHDREnvironment(SAMPLE_TEXTURECUBE_LOD(unity_SpecCube0, samplerunity_SpecCube0 , viewDirectionWS, blur*UNITY_SPECCUBE_LOD_STEPS), unity_SpecCube0_HDR); + } + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord8.xyz = v.texcoord.xyz; + o.ase_texcoord9.xyz = v.texcoord1.xyz; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.w = 0; + o.ase_texcoord9.w = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + FragmentOutput frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #else + ShadowCoords = float4(0, 0, 0, 0); + #endif + + + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float3 normalizedWorldNormal = normalize( WorldNormal ); + float dotResult13 = dot( normalizedWorldNormal , WorldViewDirection ); + float temp_output_89_0 = saturate( dotResult13 ); + float2 uv_BaseMap = IN.ase_texcoord8.xyz.xy * _BaseMap_ST.xy + _BaseMap_ST.zw; + float4 tex2DNode8 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ); + float4 temp_output_14_0 = ( temp_output_89_0 * temp_output_89_0 * tex2DNode8 ); + + float3 texCoord31 = IN.ase_texcoord9.xyz; + texCoord31.xy = IN.ase_texcoord9.xyz.xy * float2( 1,1 ) + float2( 0,0 ); + half3 Posespace29 = texCoord31; + half2 localPosespaceImpacts_A29 = PosespaceImpacts_A( Posespace29 ); + half2 ImpactsUV137 = localPosespaceImpacts_A29; + half2 localSampleHitTex137 = SampleHitTex( ImpactsUV137 ); + float temp_output_144_0 = min( (localSampleHitTex137).y , ( 1.0 - floor( (localPosespaceImpacts_A29).x ) ) ); + float3 temp_output_66_0 = refract( -WorldViewDirection , normalizedWorldNormal , _Refraction ); + float3 viewDirectionWS58 = temp_output_66_0; + float temp_output_65_0 = ( 1.0 - temp_output_89_0 ); + float blur58 = temp_output_65_0; + float3 localMyCustomExpression58 = MyCustomExpression( viewDirectionWS58 , blur58 ); + float3 texCoord5 = IN.ase_texcoord9.xyz; + texCoord5.xy = IN.ase_texcoord9.xyz.xy * float2( 1,1 ) + float2( 0,0 ); + float4 tex2DNode7 = SAMPLE_TEXTURE2D( _WireColor, sampler_WireColor, ( texCoord5 * _WireScale ).xy ); + float4 blendOpSrc129 = tex2DNode8; + float4 blendOpDest129 = tex2DNode7; + float4 lerpBlendMode129 = lerp(blendOpDest129,abs( blendOpSrc129 - blendOpDest129 ),saturate( (0.0 + (temp_output_65_0 - 0.48) * (1.0 - 0.0) / (1.0 - 0.48)) )); + float temp_output_145_0 = ( 1.0 - temp_output_144_0 ); + float4 lerpResult160 = lerp( (( _CustomCubemap )?( SAMPLE_TEXTURECUBE_LOD( _Cubemap, sampler_Cubemap, temp_output_66_0, temp_output_65_0 ) ):( float4( localMyCustomExpression58 , 0.0 ) )) , ( ( lerpBlendMode129 + ( (( _CustomCubemap )?( SAMPLE_TEXTURECUBE_LOD( _Cubemap, sampler_Cubemap, temp_output_66_0, temp_output_65_0 ) ):( float4( localMyCustomExpression58 , 0.0 ) )) * temp_output_14_0 ) ) * temp_output_145_0 * _Emission ) , min( temp_output_145_0 , tex2DNode7.a )); + + float3 Albedo = temp_output_14_0.rgb; + float3 Normal = float3(0, 0, 1); + float3 Emission = ( float4( ( localSampleHitTex137 * temp_output_144_0 ), 0.0 , 0.0 ) + lerpResult160 ).rgb; + float3 Specular = 0.5; + float Metallic = _Metallic; + float Smoothness = _Smoothness; + float Occlusion = temp_output_145_0; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.positionCS = IN.clipPos; + inputData.shadowCoord = ShadowCoords; + + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + #else + inputData.normalWS = WorldNormal; + #endif + + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + inputData.viewDirectionWS = SafeNormalize( WorldViewDirection ); + + + + #ifdef ASE_FOG + inputData.fogCoord = InitializeInputDataFog(float4(WorldPosition, 1.0), IN.fogFactorAndVertexLight.x); + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw; + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #else + #if defined(DYNAMICLIGHTMAP_ON) + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, SH, inputData.normalWS); + #else + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, SH, inputData.normalWS ); + #endif + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + #ifdef _DBUFFER + ApplyDecal(IN.clipPos, + Albedo, + Specular, + inputData.normalWS, + Metallic, + Occlusion, + Smoothness); + #endif + + BRDFData brdfData; + InitializeBRDFData + (Albedo, Metallic, Specular, Smoothness, Alpha, brdfData); + + Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, inputData.shadowMask); + half4 color; + MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, inputData.shadowMask); + color.rgb = GlobalIllumination(brdfData, inputData.bakedGI, Occlusion, inputData.positionWS, inputData.normalWS, inputData.viewDirectionWS); + color.a = Alpha; + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, IN.fogFactorAndVertexLight.x); + #endif + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return BRDFDataToGbuffer(brdfData, inputData, Smoothness, Emission + color.rgb); + } +#endif + ENDHLSL + } + + + + Pass + { + + Name "SceneSelectionPass" + Tags { "LightMode"="SceneSelectionPass" } + + Cull Off + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #pragma shader_feature_local_fragment _BRDFMAP + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PosespaceImpacts.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + half4x4 EllipsoidPosArray[HitMatrixCount]; + float4 _BaseMap_ST; + float4 _Emission; + int _NumberOfHits; + float _CustomCubemap; + float _Refraction; + float _WireScale; + float _Metallic; + float _Smoothness; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + int _ObjectId; + int _PassValue; + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = half4(_ObjectId, _PassValue, 1.0, 1.0); + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "ScenePickingPass" + Tags { "LightMode"="Picking" } + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #pragma shader_feature_local_fragment _BRDFMAP + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PosespaceImpacts.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + half4x4 EllipsoidPosArray[HitMatrixCount]; + float4 _BaseMap_ST; + float4 _Emission; + int _NumberOfHits; + float _CustomCubemap; + float _Refraction; + float _WireScale; + float _Metallic; + float _Smoothness; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + + float4 _SelectionID; + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = 0; + outColor = _SelectionID; + + return outColor; + } + + ENDHLSL + } + + } + + CustomEditor "UnityEditor.ShaderGraphLitGUI" + Fallback "Hidden/InternalErrorShader" + +} +/*ASEBEGIN +Version=18935 +2377;282;1920;719;920.551;1386.058;1;True;True +Node;AmplifyShaderEditor.CommentaryNode;26;-831.1582,-1271.949;Inherit;False;1130.562;520.1016;Posspace impacts;8;141;139;137;29;31;146;149;154;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;140;-250.5171,-867.0173;Inherit;False;527.1998;186.4003;Clip;3;144;143;142;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.SimpleMinOpNode;165;841.048,-143.3738;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.PowerNode;131;-566.3386,-757.3566;Inherit;False;True;2;0;FLOAT;0;False;1;FLOAT;5;False;1;FLOAT;0 +Node;AmplifyShaderEditor.OneMinusNode;145;133.857,-646.8608;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;19;-429.9197,844.2775;Inherit;False;Constant;_Float0;Float 0;4;0;Create;True;0;0;0;False;0;False;0.5;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.Matrix4X4Node;154;-808.881,-1025.135;Inherit;False;Property;EllipsoidPosArray[HitMatrixCount];EllipsoidPosArray;12;0;Create;False;0;0;0;True;0;False;1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;0;1;FLOAT4x4;0 +Node;AmplifyShaderEditor.RangedFloatNode;16;-246.9198,844.2775;Inherit;False;Property;_DisplacementAmount;Displacement Amount;5;0;Create;True;0;0;0;False;0;False;0;0.004;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;87;-1090.788,52.81657;Inherit;False;Property;_WireScale;Wire Scale;3;0;Create;True;0;0;0;False;0;False;3;2.3;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;90;-718.9076,-50.80401;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.LerpOp;160;751.3168,-256.9434;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.TexturePropertyNode;146;80.82147,-1235.564;Inherit;True;Property;_HitRamp;Hit Ramp;10;2;[NoScaleOffset];[SingleLineTexture];Fetch;True;0;0;0;True;0;False;None;76fcc1011f697434db1b4dd61a9f40df;False;black;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1 +Node;AmplifyShaderEditor.FloorOpNode;142;-200.5166,-791.617;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RelayNode;115;362.0261,-524.0076;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;31;-757.2919,-1179.52;Inherit;False;1;-1;3;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;79;669.2932,-745.8077;Inherit;False;Property;_Smoothness;Smoothness;7;0;Create;True;0;0;0;False;0;False;0;0.854;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;68;-1445.744,-547.5814;Inherit;False;Property;_Refraction;Refraction;6;0;Create;True;0;0;0;False;0;False;0.884;0.981;0.5;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.TexturePropertyNode;135;1397.647,105.2692;Inherit;True;Property;g_tBRDFMap;BRDF map;1;1;[NoScaleOffset];Fetch;False;0;0;0;True;0;False;None;de79bcbe6f99c48da9238822c4300e8f;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1 +Node;AmplifyShaderEditor.BlendOpsNode;129;-38.41203,30.29977;Inherit;True;Difference;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;1;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;123;464.7832,-647.4188;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.BreakToComponentsNode;138;258.4911,-978.3395;Inherit;False;FLOAT;1;0;FLOAT;0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15 +Node;AmplifyShaderEditor.WorldNormalVector;35;-1472.088,-1092.346;Inherit;False;True;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.ToggleSwitchNode;161;-521.785,-316.5437;Inherit;False;Property;_CustomCubemap;Custom Cubemap;14;0;Create;True;0;0;0;False;0;False;1;True;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.ViewDirInputsCoordNode;12;-1462.103,-767.708;Inherit;False;World;True;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.IntNode;149;-727.9803,-885.525;Inherit;False;Property;_NumberOfHits;_NumberOfHits;11;1;[HideInInspector];Create;True;0;0;0;True;0;False;0;0;False;0;1;INT;0 +Node;AmplifyShaderEditor.SwizzleNode;141;-224.691,-986.3836;Inherit;False;FLOAT;0;1;2;3;1;0;FLOAT2;0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.CustomExpressionNode;58;-805.3964,-429.2491;Inherit;False;return DecodeHDREnvironment(SAMPLE_TEXTURECUBE_LOD(unity_SpecCube0, samplerunity_SpecCube0 , viewDirectionWS, blur*UNITY_SPECCUBE_LOD_STEPS), unity_SpecCube0_HDR)@;3;Create;2;True;viewDirectionWS;FLOAT3;0,0,0;In;;Inherit;False;True;blur;FLOAT;0;In;;Inherit;False;My Custom Expression;False;False;0;;False;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.RefractOpVec;66;-1090.668,-636.2891;Inherit;False;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.OneMinusNode;143;-56.51789,-793.217;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.NegateNode;70;-1248.481,-668.7733;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.WorldNormalVector;81;-1290.717,-947.2798;Inherit;False;True;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.DotProductOpNode;13;-1054.969,-801.1615;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.OneMinusNode;166;426.9427,-783.6636;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TFHCRemapNode;132;-439.6486,-633.1974;Inherit;True;5;0;FLOAT;0;False;1;FLOAT;0.48;False;2;FLOAT;1;False;3;FLOAT;0;False;4;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerStateNode;109;-403.2362,-741.7126;Inherit;False;4;1;0;1;-1;None;1;0;SAMPLER2D;;False;1;SAMPLERSTATE;0 +Node;AmplifyShaderEditor.NormalVertexDataNode;71;-1468.606,-932.2385;Inherit;False;0;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.CustomExpressionNode;29;-400.6082,-1077.482;Half;False;return GetClosestImpactUV( Posespace, EllipsoidPosArray , _NumberOfHits )@;2;Create;1;True;Posespace;FLOAT3;0,0,0;In;;Float;False;PosespaceImpacts_A;False;False;0;7b6b6173356a02044990adfdcb567f25;False;1;0;FLOAT3;0,0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.OneMinusNode;65;-840.4833,-712.3312;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;24;-938.399,502.4214;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.OneMinusNode;122;93.36023,-192.3652;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;10;-864.9715,125.062;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;3;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SamplerNode;15;-740.3387,746.6892;Inherit;True;Property;_DisplacementMap;DisplacementMap;4;1;[NoScaleOffset];Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SaturateNode;89;-824.1046,-775.8494;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;80;669.2932,-823.8077;Inherit;False;Property;_Metallic;Metallic;8;0;Create;True;0;0;0;False;0;False;0;0.562;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;7;-492.0483,58.95336;Inherit;True;Property;_WireColor;WireColor;2;1;[NoScaleOffset];Create;True;0;0;0;False;0;False;-1;07e40fb4bdc07784493f741d9447821a;a22f1ecdacadc2b40aeebd97493732ad;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SaturateNode;133;-159.6486,-489.1974;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;8;-502.8986,-120.0093;Inherit;True;Property;_BaseMap;_BaseMap;0;0;Create;True;0;0;0;False;0;False;-1;e298abdcd2d10894fba4930f7890c1fc;76e0dfed0d3b7914983be74f711467f6;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleAddOpNode;21;22.01736,742.7548;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.PosVertexDataNode;20;-205.5099,599.1859;Inherit;False;0;0;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;78;113.4936,-106.5526;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;5;-1364.524,347.8478;Inherit;False;1;-1;3;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SamplerNode;157;-859.325,-300.5988;Inherit;True;Property;_Cubemap;Cubemap;13;0;Create;True;0;0;0;False;0;False;-1;None;115f13f0a868a454e9cdcee7cf7dba60;True;0;False;white;LockedToCube;False;Object;-1;MipLevel;Cube;8;0;SAMPLERCUBE;;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT3;0,0,0;False;4;FLOAT3;0,0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMinOpNode;144;124.6821,-817.0174;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;18;-351.9198,752.2774;Inherit;False;2;0;COLOR;0.5,0,0,0;False;1;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;17;-158.9197,753.2774;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.ColorNode;134;292.5822,280.2836;Inherit;False;Property;_Emission;Emission;9;1;[HDR];Create;True;0;0;0;False;0;False;1,1,1,1;1,1,1,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SwizzleNode;113;-80.55261,-575.9805;Inherit;False;FLOAT;0;1;2;3;1;0;FLOAT2;0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleTimeNode;22;-1206.77,524.5335;Inherit;False;1;0;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;9;316.6104,55.69166;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.TFHCRemapNode;53;-1750.74,-94.97852;Inherit;True;5;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0.3;False;3;FLOAT;0;False;4;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SwizzleNode;139;-8.460827,-961.1543;Inherit;False;FLOAT;3;1;2;3;1;0;FLOAT2;0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;114;495.3173,-15.92235;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.CustomExpressionNode;137;-128.6731,-1065.85;Half;False;return SampleHitTexture(ImpactsUV)@;2;Create;1;True;ImpactsUV;FLOAT2;0,0;In;;Inherit;False;SampleHitTex;False;False;0;7b6b6173356a02044990adfdcb567f25;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.WorldPosInputsNode;51;731.1708,483.9148;Inherit;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SimpleAddOpNode;116;953.6899,-310.2614;Inherit;False;2;2;0;FLOAT2;0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SaturateNode;85;-1383.562,-46.49241;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.StaticSwitch;136;1423.192,7.304076;Inherit;False;Property;BRDFMAP1;Enable BRDF map;0;0;Create;False;0;0;0;True;0;False;0;0;0;False;_BRDFMAP;Toggle;2;Key0;Key1;Create;True;False;Fragment;9;1;FLOAT;0;False;0;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;14;-166.6766,-262.7515;Inherit;False;3;3;0;FLOAT;0;False;1;FLOAT;0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;102;980.6183,-516.1838;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthOnly;0;3;DepthOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;False;False;True;1;LightMode=DepthOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;105;980.6183,-516.1838;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthNormals;0;6;DepthNormals;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormals;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;103;980.6183,-516.1838;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Meta;0;4;Meta;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Meta;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;100;1279.686,-514.3459;Half;False;True;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;SLZ/Nullman;94348b07e5e8bab40bd6c8a1e3df54cd;True;Forward;0;1;Forward;23;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalForward;False;False;2;Include;;False;;Native;Include;Packages/com.unity.render-pipelines.universal/ShaderLibrary/PosespaceImpacts.hlsl;False;;Custom;Hidden/InternalErrorShader;0;0;Standard;48;Workflow;1;0;Surface;0;0; Refraction Model;0;0; Blend;0;0;Two Sided;1;0;Fragment Normal Space,InvertActionOnDeselection;0;0;Transmission;0;0; Transmission Shadow;0.5,False,-1;0;Translucency;0;0; Translucency Strength;1,False,-1;0; Normal Distortion;0.5,False,-1;0; Scattering;2,False,-1;0; Direct;0.9,False,-1;0; Ambient;0.1,False,-1;0; Shadow;0.5,False,-1;0;Cast Shadows;1;0; Use Shadow Threshold;0;0;Receive Shadows;1;0;GPU Instancing;0;637871337383113979;LOD CrossFade;0;637836073116476184;Built-in Fog;1;0;Lightmaps;0;637946547281780365;Volumetrics;1;0;Decals;0;637871337399645676;Screen Space Occlusion;1;0;Reflection Probe Blend/Projection;1;0;Light Layers;0;637871337407115445;_FinalColorxAlpha;0;0;Meta Pass;1;0;GBuffer Pass;0;0;Override Baked GI;0;0;Extra Pre Pass;0;0;DOTS Instancing;0;0;Tessellation;0;0; Phong;0;0; Strength;0.5,False,-1;0; Type;0;0; Tess;16,False,-1;0; Min;10,False,-1;0; Max;25,False,-1;0; Edge Length;16,False,-1;0; Max Displacement;25,False,-1;0;Write Depth;0;0; Early Z;0;0;Vertex Position,InvertActionOnDeselection;1;0;Debug Display;0;0;Clear Coat;0;0;Fluorescence;0;0;0;10;False;True;True;True;True;True;True;True;True;True;False;;True;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;104;980.6183,-516.1838;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Universal2D;0;5;Universal2D;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;101;980.6183,-516.1838;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ShadowCaster;0;2;ShadowCaster;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=ShadowCaster;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;108;980.6183,-516.1838;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ScenePickingPass;0;9;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;107;980.6183,-516.1838;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;SceneSelectionPass;0;8;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;99;980.6183,-527.7669;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ExtraPrePass;0;0;ExtraPrePass;5;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;0;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;106;980.6183,-516.1838;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;GBuffer;0;7;GBuffer;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalGBuffer;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +WireConnection;165;0;145;0 +WireConnection;165;1;7;4 +WireConnection;131;0;65;0 +WireConnection;145;0;144;0 +WireConnection;160;0;161;0 +WireConnection;160;1;114;0 +WireConnection;160;2;165;0 +WireConnection;142;0;141;0 +WireConnection;115;0;145;0 +WireConnection;129;0;8;0 +WireConnection;129;1;7;0 +WireConnection;129;2;133;0 +WireConnection;123;0;137;0 +WireConnection;123;1;144;0 +WireConnection;161;0;58;0 +WireConnection;161;1;157;0 +WireConnection;141;0;29;0 +WireConnection;58;0;66;0 +WireConnection;58;1;65;0 +WireConnection;66;0;70;0 +WireConnection;66;1;81;0 +WireConnection;66;2;68;0 +WireConnection;143;0;142;0 +WireConnection;70;0;12;0 +WireConnection;13;0;81;0 +WireConnection;13;1;12;0 +WireConnection;132;0;65;0 +WireConnection;29;0;31;0 +WireConnection;65;0;89;0 +WireConnection;24;0;5;0 +WireConnection;24;1;22;0 +WireConnection;10;0;5;0 +WireConnection;10;1;87;0 +WireConnection;15;1;24;0 +WireConnection;89;0;13;0 +WireConnection;7;1;10;0 +WireConnection;133;0;132;0 +WireConnection;21;0;20;0 +WireConnection;21;1;17;0 +WireConnection;78;0;161;0 +WireConnection;78;1;14;0 +WireConnection;157;1;66;0 +WireConnection;157;2;65;0 +WireConnection;144;0;139;0 +WireConnection;144;1;143;0 +WireConnection;18;0;15;0 +WireConnection;18;1;19;0 +WireConnection;17;0;18;0 +WireConnection;17;1;16;0 +WireConnection;113;0;29;0 +WireConnection;9;0;129;0 +WireConnection;9;1;78;0 +WireConnection;53;0;89;0 +WireConnection;139;0;137;0 +WireConnection;114;0;9;0 +WireConnection;114;1;115;0 +WireConnection;114;2;134;0 +WireConnection;137;0;29;0 +WireConnection;116;0;123;0 +WireConnection;116;1;160;0 +WireConnection;85;0;53;0 +WireConnection;14;0;89;0 +WireConnection;14;1;89;0 +WireConnection;14;2;8;0 +WireConnection;100;0;14;0 +WireConnection;100;2;116;0 +WireConnection;100;3;80;0 +WireConnection;100;4;79;0 +WireConnection;100;5;115;0 +ASEEND*/ +//CHKSM=B89AE597CED47D4D90D5FDEE67FCFACD2DDB7E0B \ No newline at end of file diff --git a/Assets/SLZShaders/NullShader.shader.meta b/Assets/SLZShaders/NullShader.shader.meta new file mode 100644 index 0000000..87333d0 --- /dev/null +++ b/Assets/SLZShaders/NullShader.shader.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b2e867ce46fe95046aaceb0155a651ad +ShaderImporter: + externalObjects: {} + defaultTextures: + - _BaseMap: {fileID: 2800000, guid: e298abdcd2d10894fba4930f7890c1fc, type: 3} + - _WireColor: {fileID: 2800000, guid: 07e40fb4bdc07784493f741d9447821a, type: 3} + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/OpaqueHologram.shader b/Assets/SLZShaders/OpaqueHologram.shader new file mode 100644 index 0000000..56a5704 --- /dev/null +++ b/Assets/SLZShaders/OpaqueHologram.shader @@ -0,0 +1,3321 @@ +// Made with Amplify Shader Editor +// Available at the Unity Asset Store - http://u3d.as/y3X +Shader "SLZ/Hologram Depth fade" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [ASEBegin]_BaseMap("Base Map", 2D) = "white" {} + _DepthFader("Depth Fader", Float) = 0.15 + [NoScaleOffset]_BumpMap("Bump Map", 2D) = "bump" {} + [HDR]_HologramEdgeColor("Hologram Edge Color", Color) = (0.2803489,0.5694646,0.9433962,0.09019608) + [NoScaleOffset]_MetallicGlossMap("Metallic, AO, Smoothness", 2D) = "white" {} + _Noise("Noise", Range( 0 , 1)) = 0.136 + _ScanlineSize("ScanlineSize", Float) = 1.5 + [ASEEnd][HDR]_EmissionColor("Emission tint", Color) = (1,1,1,1) + + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + //_TransmissionShadow( "Transmission Shadow", Range( 0, 1 ) ) = 0.5 + //_TransStrength( "Trans Strength", Range( 0, 50 ) ) = 1 + //_TransNormal( "Trans Normal Distortion", Range( 0, 1 ) ) = 0.5 + //_TransScattering( "Trans Scattering", Range( 1, 50 ) ) = 2 + //_TransDirect( "Trans Direct", Range( 0, 1 ) ) = 0.9 + //_TransAmbient( "Trans Ambient", Range( 0, 1 ) ) = 0.1 + //_TransShadow( "Trans Shadow", Range( 0, 1 ) ) = 0.5 + //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5 + //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16 + //_TessMin( "Tess Min Distance", Float ) = 10 + //_TessMax( "Tess Max Distance", Float ) = 25 + //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16 + //_TessMaxDisp( "Tess Max Displacement", Float ) = 25 + } + + SubShader + { + LOD 0 + + + + + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Opaque" "Queue"="Geometry+100" } + Cull Back + ZWrite On + ZTest LEqual + Offset 0,0 + AlphaToMask Off + + HLSLINCLUDE + #pragma target 5.0 + + #pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + + #ifndef ASE_TESS_FUNCS + #define ASE_TESS_FUNCS + float4 FixedTess( float tessValue ) + { + return tessValue; + } + + float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos ) + { + float3 wpos = mul(o2w,vertex).xyz; + float dist = distance (wpos, cameraPos); + float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess; + return f; + } + + float4 CalcTriEdgeTessFactors (float3 triVertexFactors) + { + float4 tess; + tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z); + tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z); + tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y); + tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f; + return tess; + } + + float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams ) + { + float dist = distance (0.5 * (wpos0+wpos1), cameraPos); + float len = distance(wpos0, wpos1); + float f = max(len * scParams.y / (edgeLen * dist), 1.0); + return f; + } + + float DistanceFromPlane (float3 pos, float4 plane) + { + float d = dot (float4(pos,1.0f), plane); + return d; + } + + bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] ) + { + float4 planeTest; + planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f ); + return !all (planeTest); + } + + float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos ) + { + float3 f; + f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos); + f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos); + f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos); + + return CalcTriEdgeTessFactors (f); + } + + float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + return tess; + } + + float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + + if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes)) + { + tess = 0.0f; + } + else + { + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + } + return tess; + } + #endif //ASE_TESS_FUNCS + + ENDHLSL + + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForward" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_DEPTH_WRITE_ON + #define _DISABLE_LIGHTMAPS + #define _DISABLE_SSAO + #pragma multi_compile_instancing + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_FORWARD + + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + + #define ASE_NEEDS_FRAG_SCREEN_POSITION + #define ASE_NEEDS_FRAG_WORLD_TANGENT + #define ASE_NEEDS_FRAG_WORLD_NORMAL + #define ASE_NEEDS_FRAG_WORLD_BITANGENT + #define ASE_NEEDS_FRAG_WORLD_VIEW_DIR + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DefaultLitVariants.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_texcoord8 : TEXCOORD8; + float4 ase_texcoord9 : TEXCOORD9; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _EmissionColor; + float4 _HologramEdgeColor; + float _Noise; + float _ScanlineSize; + float _DepthFader; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + TEXTURE2D(_BumpMap); + SAMPLER(sampler_BumpMap); + TEXTURE2D(_MetallicGlossMap); + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g34( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + inline float3 MyCustomExpression( half4 In0 ) + { + return UnpackNormal(In0);; + } + + real3 ASESafeNormalize(float3 inVec) + { + real dp3 = max(FLT_MIN, dot(inVec, inVec)); + return inVec* rsqrt( dp3); + } + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord8.xy = v.texcoord.xy; + o.ase_texcoord9 = v.vertex; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + #if defined(LIGHTMAP_ON) + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + #if !defined(LIGHTMAP_ON) + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + #endif + + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) || defined(ASE_TERRAIN_INSTANCING) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float2 texCoord26 = IN.ase_texcoord8.xy * float2( 1,1 ) + float2( 0,0 ); + float4 tex2DNode7 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, texCoord26 ); + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( ScreenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float2 screenUV27_g34 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g34 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g34 = GetScreenNoiseRGBASlice27_g34( screenUV27_g34 , offsetFrame27_g34 ); + float4 temp_output_198_0 = localGetScreenNoiseRGBASlice27_g34; + float4 temp_cast_0 = (0.5).xxxx; + float4 temp_output_78_0 = ( ( temp_output_198_0 - temp_cast_0 ) * _Noise ); + float4 temp_output_91_0 = ( tex2DNode7 + temp_output_78_0 ); + + float4 In02_g33 = SAMPLE_TEXTURE2D( _BumpMap, sampler_BumpMap, texCoord26 ); + float3 localMyCustomExpression2_g33 = MyCustomExpression( In02_g33 ); + float3 temp_output_58_0 = localMyCustomExpression2_g33; + + float3 tanToWorld0 = float3( WorldTangent.x, WorldBiTangent.x, WorldNormal.x ); + float3 tanToWorld1 = float3( WorldTangent.y, WorldBiTangent.y, WorldNormal.y ); + float3 tanToWorld2 = float3( WorldTangent.z, WorldBiTangent.z, WorldNormal.z ); + float3 tanNormal56 = temp_output_58_0; + float3 worldNormal56 = float3(dot(tanToWorld0,tanNormal56), dot(tanToWorld1,tanNormal56), dot(tanToWorld2,tanNormal56)); + float3 normalizeResult85 = ASESafeNormalize( WorldViewDirection ); + float dotResult53 = dot( worldNormal56 , normalizeResult85 ); + float temp_output_54_0 = ( 1.0 - dotResult53 ); + float4 temp_output_87_0 = ( ( temp_output_54_0 * temp_output_54_0 * temp_output_54_0 ) * _HologramEdgeColor ); + float4 temp_cast_4 = (0.5).xxxx; + float temp_output_65_0 = ( ( ase_grabScreenPosNorm.g * ( _ScreenParams.y / _ScanlineSize ) ) % 2.0 ); + float4 temp_cast_6 = (0.5).xxxx; + + float4 tex2DNode86 = SAMPLE_TEXTURE2D( _MetallicGlossMap, sampler_BaseMap, texCoord26 ); + + float lerpResult96 = lerp( temp_output_65_0 , 1.0 , saturate( ( dotResult53 - 0.2 ) )); + + float4 unityObjectToClipPos145 = TransformWorldToHClip(TransformObjectToWorld(IN.ase_texcoord9.xyz)); + float temp_output_14_0 = ( unityObjectToClipPos145.w + ( (temp_output_198_0).w * _DepthFader ) ); + float lerpResult183 = lerp( ( ( (temp_output_198_0).w - 1.0 ) * 2.0 ) , 0.5 , ( _EmissionColor.a * tex2DNode7.a )); + + float3 Albedo = temp_output_91_0.rgb; + float3 Normal = temp_output_58_0; + float3 Emission = ( _EmissionColor * ( ( temp_output_87_0 * _HologramEdgeColor.a ) + ( ( temp_output_87_0 + temp_output_78_0 ) * temp_output_65_0 * temp_output_91_0 ) ) ).rgb; +#if 0 + float3 BakedEmission = _HologramEdgeColor.rgb; +#endif + float3 Specular = 0.5; + float Metallic = tex2DNode86.r; + float Smoothness = tex2DNode86.b; + float Occlusion = ( tex2DNode86.g * lerpResult96 ); + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = ( ( ( 1.0 - ( temp_output_14_0 * _ZBufferParams.w ) ) / ( temp_output_14_0 * _ZBufferParams.z ) ) * ceil( lerpResult183 ) ); + #endif + + #ifdef _CLEARCOAT + float CoatMask = 0; + float CoatSmoothness = 0; + #endif + + #if defined(_FLUORESCENCE) + float4 Fluorescence = 0; + float4 Absorbance = 0; + #endif + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.viewDirectionWS = WorldViewDirection; + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + #else + inputData.normalWS = WorldNormal; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + inputData.shadowCoord = ShadowCoords; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + inputData.shadowCoord = TransformWorldToShadowCoord(inputData.positionWS); + #else + inputData.shadowCoord = float4(0, 0, 0, 0); + #endif + + + #ifdef ASE_FOG + inputData.fogCoord = IN.fogFactorAndVertexLight.x; + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzww; //TODO: Shuffle things in vertex streams so we get full RGBA color rather than RGBB here + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xyz, IN.dynamicLightmapUV.xy, IN.vertexSH, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI(IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, IN.vertexSH , inputData.normalWS); + #endif + + #else + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + #endif + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + SurfaceData surfaceData; + surfaceData.albedo = Albedo; + surfaceData.metallic = saturate(Metallic); + surfaceData.specular = Specular; + surfaceData.smoothness = saturate(Smoothness), + surfaceData.occlusion = Occlusion, + surfaceData.emission = Emission, + surfaceData.alpha = saturate(Alpha); + surfaceData.normalTS = Normal; + surfaceData.clearCoatMask = 0; + surfaceData.clearCoatSmoothness = 1; + + #ifdef _CLEARCOAT + surfaceData.clearCoatMask = saturate(CoatMask); + surfaceData.clearCoatSmoothness = saturate(CoatSmoothness); + #endif + #if defined(_FLUORESCENCE) + surfaceData.fluorescence = Fluorescence; + surfaceData.absorbance = Absorbance; + #endif + + #ifdef _DBUFFER + ApplyDecalToSurfaceData(IN.clipPos, surfaceData, inputData); + #endif + + half4 color = UniversalFragmentPBR( inputData, surfaceData); + + #ifdef LIGHTMAP_ON + float3 MetalSpec = lerp(kDieletricSpec.rgb, surfaceData.albedo , surfaceData.metallic); + color.rgb += BakedSpecular * surfaceData.occlusion * MetalSpec * inputData.bakedGI.rgb; + #endif + + #ifdef _TRANSMISSION_ASE + { + float shadow = _TransmissionShadow; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + half3 mainTransmission = max(0 , -dot(inputData.normalWS, mainLight.direction)) * mainAtten * Transmission; + color.rgb += Albedo * mainTransmission; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 transmission = max(0 , -dot(inputData.normalWS, light.direction)) * atten * Transmission; + color.rgb += Albedo * transmission; + } + #endif + } + #endif + + #ifdef _TRANSLUCENCY_ASE + { + float shadow = _TransShadow; + float normal = _TransNormal; + float scattering = _TransScattering; + float direct = _TransDirect; + float ambient = _TransAmbient; + float strength = _TransStrength; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + + half3 mainLightDir = mainLight.direction + inputData.normalWS * normal; + half mainVdotL = pow( saturate( dot( inputData.viewDirectionWS, -mainLightDir ) ), scattering ); + half3 mainTranslucency = mainAtten * ( mainVdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * mainTranslucency * strength; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 lightDir = light.direction + inputData.normalWS * normal; + half VdotL = pow( saturate( dot( inputData.viewDirectionWS, -lightDir ) ), scattering ); + half3 translucency = atten * ( VdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * translucency * strength; + } + #endif + } + #endif + + #ifdef _REFRACTION_ASE + float4 projScreenPos = ScreenPos / ScreenPos.w; + float3 refractionOffset = ( RefractionIndex - 1.0 ) * mul( UNITY_MATRIX_V, float4( WorldNormal,0 ) ).xyz * ( 1.0 - dot( WorldNormal, WorldViewDirection ) ); + projScreenPos.xy += refractionOffset.xy; + float3 refraction = SHADERGRAPH_SAMPLE_SCENE_COLOR( projScreenPos.xy ) * RefractionColor; + color.rgb = lerp( refraction, color.rgb, color.a ); + color.a = 1; + #endif + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, -inputData.viewDirectionWS, IN.fogFactorAndVertexLight.x); + #endif + #endif + + color = Volumetrics( color, inputData.positionWS); + + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return color; + } + + ENDHLSL + } + + + Pass + { + + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + + ZWrite On + ZTest LEqual + AlphaToMask Off + ColorMask 0 + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_DEPTH_WRITE_ON + #define _DISABLE_LIGHTMAPS + #define _DISABLE_SSAO + #pragma multi_compile_instancing + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #pragma multi_compile _ _CASTING_PUNCTUAL_LIGHT_SHADOW + + #define SHADERPASS SHADERPASS_SHADOWCASTER + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float4 ase_texcoord2 : TEXCOORD2; + float4 ase_texcoord3 : TEXCOORD3; + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _EmissionColor; + float4 _HologramEdgeColor; + float _Noise; + float _ScanlineSize; + float _DepthFader; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g34( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + + float3 _LightDirection; + float3 _LightPosition; + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord3 = screenPos; + + o.ase_texcoord2 = v.vertex; + o.ase_texcoord4.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + + float3 normalWS = TransformObjectToWorldDir(v.ase_normal); + + + #if _CASTING_PUNCTUAL_LIGHT_SHADOW + float3 lightDirectionWS = normalize(_LightPosition - positionWS); + #else + float3 lightDirectionWS = _LightDirection; + #endif + float2 vShadowOffsets = GetShadowOffsets( normalWS, lightDirectionWS ); + positionWS.xyz -= vShadowOffsets.y * lightDirectionWS.xyz * .01; + float4 clipPos = TransformObjectToHClip( float4( mul( unity_WorldToObject, float4( positionWS.xyz, 1.0 ) ).xyz, 1.0 ) ); + //float4 clipPos = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, lightDirectionWS)); + + #if UNITY_REVERSED_Z + clipPos.z = min(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #else + clipPos.z = max(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #endif + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = clipPos; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float4 unityObjectToClipPos145 = TransformWorldToHClip(TransformObjectToWorld(IN.ase_texcoord2.xyz)); + float4 screenPos = IN.ase_texcoord3; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float2 screenUV27_g34 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g34 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g34 = GetScreenNoiseRGBASlice27_g34( screenUV27_g34 , offsetFrame27_g34 ); + float4 temp_output_198_0 = localGetScreenNoiseRGBASlice27_g34; + float temp_output_14_0 = ( unityObjectToClipPos145.w + ( (temp_output_198_0).w * _DepthFader ) ); + float2 texCoord26 = IN.ase_texcoord4.xy * float2( 1,1 ) + float2( 0,0 ); + float4 tex2DNode7 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, texCoord26 ); + float lerpResult183 = lerp( ( ( (temp_output_198_0).w - 1.0 ) * 2.0 ) , 0.5 , ( _EmissionColor.a * tex2DNode7.a )); + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = ( ( ( 1.0 - ( temp_output_14_0 * _ZBufferParams.w ) ) / ( temp_output_14_0 * _ZBufferParams.z ) ) * ceil( lerpResult183 ) ); + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + #ifdef _ALPHATEST_SHADOW_ON + clip(Alpha - AlphaClipThresholdShadow); + #else + clip(Alpha - AlphaClipThreshold); + #endif + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + return 0; + } + + ENDHLSL + } + + + Pass + { + + Name "DepthOnly" + Tags { "LightMode"="DepthOnly" } + + ZWrite On + ColorMask 0 + AlphaToMask Off + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_DEPTH_WRITE_ON + #define _DISABLE_LIGHTMAPS + #define _DISABLE_SSAO + #pragma multi_compile_instancing + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float4 ase_texcoord2 : TEXCOORD2; + float4 ase_texcoord3 : TEXCOORD3; + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _EmissionColor; + float4 _HologramEdgeColor; + float _Noise; + float _ScanlineSize; + float _DepthFader; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g34( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord3 = screenPos; + + o.ase_texcoord2 = v.vertex; + o.ase_texcoord4.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float4 unityObjectToClipPos145 = TransformWorldToHClip(TransformObjectToWorld(IN.ase_texcoord2.xyz)); + float4 screenPos = IN.ase_texcoord3; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float2 screenUV27_g34 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g34 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g34 = GetScreenNoiseRGBASlice27_g34( screenUV27_g34 , offsetFrame27_g34 ); + float4 temp_output_198_0 = localGetScreenNoiseRGBASlice27_g34; + float temp_output_14_0 = ( unityObjectToClipPos145.w + ( (temp_output_198_0).w * _DepthFader ) ); + float2 texCoord26 = IN.ase_texcoord4.xy * float2( 1,1 ) + float2( 0,0 ); + float4 tex2DNode7 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, texCoord26 ); + float lerpResult183 = lerp( ( ( (temp_output_198_0).w - 1.0 ) * 2.0 ) , 0.5 , ( _EmissionColor.a * tex2DNode7.a )); + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = ( ( ( 1.0 - ( temp_output_14_0 * _ZBufferParams.w ) ) / ( temp_output_14_0 * _ZBufferParams.z ) ) * ceil( lerpResult183 ) ); + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return 0; + } + ENDHLSL + } + + /*ase_pass*/ + Pass + { + + Name "BakedRaytrace" + Tags{ "LightMode" = "BakedRaytrace" } + HLSLPROGRAM + + /*ase_pragma_before*/ + + #define SHADERPASS SHADERPASS_RAYTRACE + + #include "UnityRaytracingMeshUtils.cginc" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #define _EMISSION + #pragma raytracing test + #pragma shader_feature_local __ _ALBEDOMULTIPLY_ON + #pragma shader_feature_local __ _EMISSION_ON + + /*ase_pragma*/ + + struct RayPayload + { + float4 color; + float3 dir; + }; + + struct AttributeData + { + float2 barycentrics; + }; + + struct Vertex + { + float2 texcoord; + float3 normal; + }; + + Texture2D _BaseMap; + SamplerState sampler_BaseMap; + + CBUFFER_START( UnityPerMaterial ) + /*ase_srp_batcher*/ + Texture2D _EmissionMap; + SamplerState sampler_EmissionMap; + + float4 _EmissionColor; + float4 _BaseMap_ST; + float _BakedMutiplier = 1; + CBUFFER_END + + /*ase_globals*/ + + /*ase_funcs*/ + + //https://coty.tips/raytracing-in-unity/ + [shader("closesthit")] + void MyClosestHit(inout RayPayload payload, + AttributeData attributes : SV_IntersectionAttributes) { + + payload.color = float4(0,0,0,1); //Intializing + payload.dir = float3(1,0,0); + + // #if _EMISSION_ON + uint2 launchIdx = DispatchRaysIndex(); + // ShadingData shade = getShadingData( PrimitiveIndex(), attribs ); + + uint primitiveIndex = PrimitiveIndex(); + uint3 triangleIndicies = UnityRayTracingFetchTriangleIndices(primitiveIndex); + Vertex v0, v1, v2; + + v0.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.x, kVertexAttributeTexCoord0); + v1.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.y, kVertexAttributeTexCoord0); + v2.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.z, kVertexAttributeTexCoord0); + + // v0.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.x, kVertexAttributeNormal); + // v1.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.y, kVertexAttributeNormal); + // v2.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.z, kVertexAttributeNormal); + + float3 barycentrics = float3(1.0 - attributes.barycentrics.x - attributes.barycentrics.y, attributes.barycentrics.x, attributes.barycentrics.y); + + Vertex vInterpolated; + vInterpolated.texcoord = v0.texcoord * barycentrics.x + v1.texcoord * barycentrics.y + v2.texcoord * barycentrics.z; + //TODO: Extract normal direction to ignore the backside of emissive objects + //vInterpolated.normal = v0.normal * barycentrics.x + v1.normal * barycentrics.y + v2.normal * barycentrics.z; + // if ( dot(vInterpolated.normal, float3(1,0,0) < 0) ) payload.color = float4(0,10,0,1) ; + // else payload.color = float4(10,0,0,1) ; + + //TODO: Figure out how to tie Amplify into using Texture2d and SamplerState instead of the bundled sampler2D. Forcing names for now. + //#if _ALBEDOMULTIPLY_ON + float4 albedo = float4(_BaseMap.SampleLevel(sampler_BaseMap, vInterpolated.texcoord.xy * _BaseMap_ST.xy + _BaseMap_ST.zw, 0 ).rgb , 1) ; + // #else + // float4 albedo = float4(1,1,1,1); + // #endif + + payload.color = float4( (_EmissionMap.SampleLevel(sampler_EmissionMap, vInterpolated.texcoord * _BaseMap_ST.xy + _BaseMap_ST.zw,0) ).rgb * _EmissionColor.rgb * albedo.rgb * _BakedMutiplier , 1 ); + // #else + // payload.color = float4(0,0,0,1); + + // #endif + } + ENDHLSL + + } + + + Pass + { + + Name "Universal2D" + Tags { "LightMode"="Universal2D" } + + Blend One Zero, One Zero + ColorMask RGBA + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_DEPTH_WRITE_ON + #define _DISABLE_LIGHTMAPS + #define _DISABLE_SSAO + #pragma multi_compile_instancing + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_2D + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float4 ase_texcoord2 : TEXCOORD2; + float4 ase_texcoord3 : TEXCOORD3; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _EmissionColor; + float4 _HologramEdgeColor; + float _Noise; + float _ScanlineSize; + float _DepthFader; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g34( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID( v ); + UNITY_TRANSFER_INSTANCE_ID( v, o ); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord3 = screenPos; + + o.ase_texcoord2.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord2.zw = 0; + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 texCoord26 = IN.ase_texcoord2.xy * float2( 1,1 ) + float2( 0,0 ); + float4 tex2DNode7 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, texCoord26 ); + float4 screenPos = IN.ase_texcoord3; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float2 screenUV27_g34 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g34 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g34 = GetScreenNoiseRGBASlice27_g34( screenUV27_g34 , offsetFrame27_g34 ); + float4 temp_output_198_0 = localGetScreenNoiseRGBASlice27_g34; + float4 temp_cast_0 = (0.5).xxxx; + float4 temp_output_78_0 = ( ( temp_output_198_0 - temp_cast_0 ) * _Noise ); + float4 temp_output_91_0 = ( tex2DNode7 + temp_output_78_0 ); + + + float3 Albedo = temp_output_91_0.rgb; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + half4 color = half4( Albedo, Alpha ); + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + return color; + } + ENDHLSL + } + + + Pass + { + + Name "DepthNormals" + Tags { "LightMode"="DepthNormals" } + + ZWrite On + Blend One Zero + ZTest LEqual + ZWrite On + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_DEPTH_WRITE_ON + #define _DISABLE_LIGHTMAPS + #define _DISABLE_SSAO + #pragma multi_compile_instancing + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float3 worldNormal : TEXCOORD2; + float4 worldTangent : TEXCOORD3; + float4 ase_texcoord4 : TEXCOORD4; + float4 ase_texcoord5 : TEXCOORD5; + float4 ase_texcoord6 : TEXCOORD6; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _EmissionColor; + float4 _HologramEdgeColor; + float _Noise; + float _ScanlineSize; + float _DepthFader; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BumpMap); + SAMPLER(sampler_BumpMap); + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + + + inline float3 MyCustomExpression( half4 In0 ) + { + return UnpackNormal(In0);; + } + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g34( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord6 = screenPos; + + o.ase_texcoord4.xy = v.ase_texcoord.xy; + o.ase_texcoord5 = v.vertex; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal( v.ase_normal ); + float4 tangentWS = float4(TransformObjectToWorldDir( v.ase_tangent.xyz), v.ase_tangent.w); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.worldNormal = normalWS; + o.worldTangent = tangentWS; + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + float3 WorldNormal = IN.worldNormal; + float4 WorldTangent = IN.worldTangent; + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 texCoord26 = IN.ase_texcoord4.xy * float2( 1,1 ) + float2( 0,0 ); + float4 In02_g33 = SAMPLE_TEXTURE2D( _BumpMap, sampler_BumpMap, texCoord26 ); + float3 localMyCustomExpression2_g33 = MyCustomExpression( In02_g33 ); + float3 temp_output_58_0 = localMyCustomExpression2_g33; + + float4 unityObjectToClipPos145 = TransformWorldToHClip(TransformObjectToWorld(IN.ase_texcoord5.xyz)); + float4 screenPos = IN.ase_texcoord6; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float2 screenUV27_g34 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g34 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g34 = GetScreenNoiseRGBASlice27_g34( screenUV27_g34 , offsetFrame27_g34 ); + float4 temp_output_198_0 = localGetScreenNoiseRGBASlice27_g34; + float temp_output_14_0 = ( unityObjectToClipPos145.w + ( (temp_output_198_0).w * _DepthFader ) ); + float4 tex2DNode7 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, texCoord26 ); + float lerpResult183 = lerp( ( ( (temp_output_198_0).w - 1.0 ) * 2.0 ) , 0.5 , ( _EmissionColor.a * tex2DNode7.a )); + + float3 Normal = temp_output_58_0; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = ( ( ( 1.0 - ( temp_output_14_0 * _ZBufferParams.w ) ) / ( temp_output_14_0 * _ZBufferParams.z ) ) * ceil( lerpResult183 ) ); + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + #if defined(_GBUFFER_NORMALS_OCT) + float2 octNormalWS = PackNormalOctQuadEncode(WorldNormal); + float2 remappedOctNormalWS = saturate(octNormalWS * 0.5 + 0.5); + half3 packedNormalWS = PackFloat2To888(remappedOctNormalWS); + return half4(packedNormalWS, 0.0); + #else + + #if defined(_NORMALMAP) + #if _NORMAL_DROPOFF_TS + float crossSign = (WorldTangent.w > 0.0 ? 1.0 : -1.0) * GetOddNegativeScale(); + float3 bitangent = crossSign * cross(WorldNormal.xyz, WorldTangent.xyz); + float3 normalWS = TransformTangentToWorld(Normal, half3x3(WorldTangent.xyz, bitangent, WorldNormal.xyz)); + #elif _NORMAL_DROPOFF_OS + float3 normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + float3 normalWS = Normal; + #endif + #else + float3 normalWS = WorldNormal; + #endif + + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + #endif + } + ENDHLSL + } + + + Pass + { + + Name "GBuffer" + Tags { "LightMode"="None" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM +#define _NORMAL_DROPOFF_TS 1#pragma multi_compile_fog#define ASE_FOG 1#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED#define ASE_DEPTH_WRITE_ON#define _DISABLE_LIGHTMAPS#define _DISABLE_SSAO#pragma multi_compile_instancing#define _EMISSION#define _NORMALMAP 1#define ASE_SRP_VERSION 999999#define ASE_USING_SAMPLING_MACROS 1 +#if FALSE + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile _ DYNAMICLIGHTMAP_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE + //_MAIN_LIGHT_SHADOWS_SCREEN + + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION + + #pragma multi_compile_fragment _ _SHADOWS_SOFT + #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING + #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE + //#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile _ _GBUFFER_NORMALS_OCT + //#pragma multi_compile_fragment _ _LIGHT_LAYERS + #pragma multi_compile _ _RENDER_PASS_ENABLED + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_GBUFFER + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl" + + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + #define ASE_NEEDS_FRAG_SCREEN_POSITION + #define ASE_NEEDS_FRAG_WORLD_TANGENT + #define ASE_NEEDS_FRAG_WORLD_NORMAL + #define ASE_NEEDS_FRAG_WORLD_BITANGENT + #define ASE_NEEDS_FRAG_WORLD_VIEW_DIR + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_texcoord8 : TEXCOORD8; + float4 ase_texcoord9 : TEXCOORD9; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _EmissionColor; + float4 _HologramEdgeColor; + float _Noise; + float _ScanlineSize; + float _DepthFader; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + TEXTURE2D(_BumpMap); + SAMPLER(sampler_BumpMap); + TEXTURE2D(_MetallicGlossMap); + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + inline float4 GetScreenNoiseRGBASlice27_g34( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + inline float3 MyCustomExpression( half4 In0 ) + { + return UnpackNormal(In0);; + } + + real3 ASESafeNormalize(float3 inVec) + { + real dp3 = max(FLT_MIN, dot(inVec, inVec)); + return inVec* rsqrt( dp3); + } + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord8.xy = v.texcoord.xy; + o.ase_texcoord9 = v.vertex; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + FragmentOutput frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #else + ShadowCoords = float4(0, 0, 0, 0); + #endif + + + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float2 texCoord26 = IN.ase_texcoord8.xy * float2( 1,1 ) + float2( 0,0 ); + float4 tex2DNode7 = SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, texCoord26 ); + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( ScreenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float2 screenUV27_g34 = (ase_grabScreenPosNorm).xy; + float offsetFrame27_g34 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g34 = GetScreenNoiseRGBASlice27_g34( screenUV27_g34 , offsetFrame27_g34 ); + float4 temp_output_198_0 = localGetScreenNoiseRGBASlice27_g34; + float4 temp_cast_0 = (0.5).xxxx; + float4 temp_output_78_0 = ( ( temp_output_198_0 - temp_cast_0 ) * _Noise ); + float4 temp_output_91_0 = ( tex2DNode7 + temp_output_78_0 ); + + float4 In02_g33 = SAMPLE_TEXTURE2D( _BumpMap, sampler_BumpMap, texCoord26 ); + float3 localMyCustomExpression2_g33 = MyCustomExpression( In02_g33 ); + float3 temp_output_58_0 = localMyCustomExpression2_g33; + + float3 tanToWorld0 = float3( WorldTangent.x, WorldBiTangent.x, WorldNormal.x ); + float3 tanToWorld1 = float3( WorldTangent.y, WorldBiTangent.y, WorldNormal.y ); + float3 tanToWorld2 = float3( WorldTangent.z, WorldBiTangent.z, WorldNormal.z ); + float3 tanNormal56 = temp_output_58_0; + float3 worldNormal56 = float3(dot(tanToWorld0,tanNormal56), dot(tanToWorld1,tanNormal56), dot(tanToWorld2,tanNormal56)); + float3 normalizeResult85 = ASESafeNormalize( WorldViewDirection ); + float dotResult53 = dot( worldNormal56 , normalizeResult85 ); + float temp_output_54_0 = ( 1.0 - dotResult53 ); + float4 temp_output_87_0 = ( ( temp_output_54_0 * temp_output_54_0 * temp_output_54_0 ) * _HologramEdgeColor ); + float4 temp_cast_4 = (0.5).xxxx; + float temp_output_65_0 = ( ( ase_grabScreenPosNorm.g * ( _ScreenParams.y / _ScanlineSize ) ) % 2.0 ); + float4 temp_cast_6 = (0.5).xxxx; + + float4 tex2DNode86 = SAMPLE_TEXTURE2D( _MetallicGlossMap, sampler_BaseMap, texCoord26 ); + + float lerpResult96 = lerp( temp_output_65_0 , 1.0 , saturate( ( dotResult53 - 0.2 ) )); + + float4 unityObjectToClipPos145 = TransformWorldToHClip(TransformObjectToWorld(IN.ase_texcoord9.xyz)); + float temp_output_14_0 = ( unityObjectToClipPos145.w + ( (temp_output_198_0).w * _DepthFader ) ); + float lerpResult183 = lerp( ( ( (temp_output_198_0).w - 1.0 ) * 2.0 ) , 0.5 , ( _EmissionColor.a * tex2DNode7.a )); + + float3 Albedo = temp_output_91_0.rgb; + float3 Normal = temp_output_58_0; + float3 Emission = ( _EmissionColor * ( ( temp_output_87_0 * _HologramEdgeColor.a ) + ( ( temp_output_87_0 + temp_output_78_0 ) * temp_output_65_0 * temp_output_91_0 ) ) ).rgb; + float3 Specular = 0.5; + float Metallic = tex2DNode86.r; + float Smoothness = tex2DNode86.b; + float Occlusion = ( tex2DNode86.g * lerpResult96 ); + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = ( ( ( 1.0 - ( temp_output_14_0 * _ZBufferParams.w ) ) / ( temp_output_14_0 * _ZBufferParams.z ) ) * ceil( lerpResult183 ) ); + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.positionCS = IN.clipPos; + inputData.shadowCoord = ShadowCoords; + + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + #else + inputData.normalWS = WorldNormal; + #endif + + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + inputData.viewDirectionWS = SafeNormalize( WorldViewDirection ); + + + + #ifdef ASE_FOG + inputData.fogCoord = InitializeInputDataFog(float4(WorldPosition, 1.0), IN.fogFactorAndVertexLight.x); + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw; + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #else + #if defined(DYNAMICLIGHTMAP_ON) + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, SH, inputData.normalWS); + #else + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, SH, inputData.normalWS ); + #endif + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + #ifdef _DBUFFER + ApplyDecal(IN.clipPos, + Albedo, + Specular, + inputData.normalWS, + Metallic, + Occlusion, + Smoothness); + #endif + + BRDFData brdfData; + InitializeBRDFData + (Albedo, Metallic, Specular, Smoothness, Alpha, brdfData); + + Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, inputData.shadowMask); + half4 color; + MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, inputData.shadowMask); + color.rgb = GlobalIllumination(brdfData, inputData.bakedGI, Occlusion, inputData.positionWS, inputData.normalWS, inputData.viewDirectionWS); + color.a = Alpha; + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, IN.fogFactorAndVertexLight.x); + #endif + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return BRDFDataToGbuffer(brdfData, inputData, Smoothness, Emission + color.rgb); + } +#endif + ENDHLSL + } + + + + Pass + { + + Name "SceneSelectionPass" + Tags { "LightMode"="SceneSelectionPass" } + + Cull Off + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_DEPTH_WRITE_ON + #define _DISABLE_LIGHTMAPS + #define _DISABLE_SSAO + #pragma multi_compile_instancing + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _EmissionColor; + float4 _HologramEdgeColor; + float _Noise; + float _ScanlineSize; + float _DepthFader; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + int _ObjectId; + int _PassValue; + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = half4(_ObjectId, _PassValue, 1.0, 1.0); + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "ScenePickingPass" + Tags { "LightMode"="Picking" } + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_DEPTH_WRITE_ON + #define _DISABLE_LIGHTMAPS + #define _DISABLE_SSAO + #pragma multi_compile_instancing + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _EmissionColor; + float4 _HologramEdgeColor; + float _Noise; + float _ScanlineSize; + float _DepthFader; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + + float4 _SelectionID; + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = 0; + outColor = _SelectionID; + + return outColor; + } + + ENDHLSL + } + + } + + CustomEditor "UnityEditor.ShaderGraphLitGUI" + Fallback "Hidden/InternalErrorShader" + +} +/*ASEBEGIN +Version=18935 +556;179;1410;1119;1050.238;1092.71;2.396823;True;True +Node;AmplifyShaderEditor.CommentaryNode;163;-1992.93,-206.9442;Inherit;False;2042.17;519.2178;Edge coloring;8;87;88;89;54;55;48;166;167;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;167;-1982.529,-157.5087;Inherit;False;630.5564;386.2253;Fresnel;4;52;85;56;53;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;166;-514.7498,-52.95169;Inherit;False;430.2299;317.7492;Add noise and multiply with albedo;2;79;47;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;158;-1517.855,1012.331;Inherit;False;1801.283;486.7962;Dither in clipspace;12;14;146;15;24;12;145;18;17;13;16;111;157;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;164;-405.1964,322.276;Inherit;False;844.462;231.924;scanline to AO;4;93;96;100;99;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;165;-488.244,-513.2033;Inherit;False;202;185;add noise to albedo;1;91;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;160;-2682.31,574.5032;Inherit;False;862.9883;541.9784;Scanline effect;6;68;72;147;71;70;65;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;159;-1255.509,652.848;Inherit;False;745.0706;268.9492;Color noise;4;98;78;80;81;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;178;524.7984,516.2952;Inherit;False;805.9341;539.0737;Emission tinting and psdo-alpha;8;189;183;190;154;153;152;187;199;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;161;-2238.849,-1251.15;Inherit;False;853.8884;739.2095;Basemaps;5;25;26;7;86;58;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.UnityObjToClipPosHlpNode;145;-1250.941,1280.038;Inherit;False;1;0;FLOAT3;0,0,0;False;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;13;-429.0687,1283.933;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.CeilOpNode;189;1005.857,856.962;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;68;-2228.937,698.0006;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleRemainderNode;65;-2054.322,699.1375;Inherit;True;2;0;FLOAT;0;False;1;FLOAT;2;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;154;1180.531,867.2163;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;187;532.295,792.4898;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.OneMinusNode;17;-454.8657,1103.681;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;24;-1117.33,1128.118;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.WireNode;168;-1296,352;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.OneMinusNode;54;-1306.219,-41.01093;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;100;-355.1964,381.3237;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0.2;False;1;FLOAT;0 +Node;AmplifyShaderEditor.LerpOp;183;812.5939,788.0898;Inherit;False;3;0;FLOAT;1;False;1;FLOAT;0.5;False;2;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;98;-954.3539,805.7972;Inherit;False;Property;_Noise;Noise;5;0;Create;True;0;0;0;False;0;False;0.136;0.189;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;78;-672.4381,702.848;Inherit;False;2;2;0;FLOAT4;0,0,0,0;False;1;FLOAT;0.1603774;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.PosVertexDataNode;146;-1467.855,1283.397;Inherit;False;0;0;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.ScreenParams;71;-2607.225,796.4866;Inherit;False;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;80;-1011.571,714.59;Inherit;False;2;0;FLOAT4;0,0,0,0;False;1;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;199;678.2019,929.3956;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;190;673.8575,791.6624;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;2;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ZBufferParams;15;-946.0206,1316.128;Inherit;False;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;55;-1110.801,-133.0509;Inherit;True;3;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;12;-1405.141,1191.881;Inherit;False;Property;_DepthFader;Depth Fader;1;0;Create;True;0;0;0;False;0;False;0.15;0.12;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;48;-976.2174,79.47351;Inherit;False;Property;_HologramEdgeColor;Hologram Edge Color;3;1;[HDR];Create;True;0;0;0;False;0;False;0.2803489,0.5694646,0.9433962,0.09019608;1.247059,0.11,0.01568628,0.1215686;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RelayNode;157;133.4281,1109.07;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;14;-810.8926,1088.93;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SwizzleNode;177;-648.2431,935.3859;Inherit;False;FLOAT;3;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;16;-612.344,1099.455;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;47;-320.5199,10.79749;Inherit;True;3;3;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SamplerNode;7;-1902.078,-1201.15;Inherit;True;Property;_BaseMap;Base Map;0;0;Create;True;0;0;0;False;0;False;-1;None;6c9c24b6a17e8cd4c910d81887b68ee3;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;81;-1201.432,797.887;Inherit;False;Constant;_Float2;Float 2;5;0;Create;True;0;0;0;False;0;False;0.5;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;86;-1896.889,-741.9405;Inherit;True;Property;_MetallicGlossMap;Metallic, AO, Smoothness;4;1;[NoScaleOffset];Create;False;0;0;0;False;0;False;7;None;8dd58822f420adc4ab213165112114cb;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.ColorNode;152;617.5811,584.4951;Inherit;False;Property;_EmissionColor;Emission tint;7;1;[HDR];Create;False;0;0;0;False;0;False;1,1,1,1;1,1,1,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SwizzleNode;111;-1380.493,1063.638;Inherit;False;FLOAT;3;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;18;-255.269,1104.374;Inherit;True;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;88;-67.65933,-144.9931;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.GrabScreenPosition;72;-2632.31,624.5032;Inherit;False;0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.NormalizeNode;85;-1759.143,42.52801;Inherit;False;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;153;946.339,586.6653;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;87;-757.3683,-73.28355;Inherit;False;2;2;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;93;277.2657,372.276;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FunctionNode;58;-1602.96,-937.243;Inherit;False;UnpackNormal;-1;;33;e881a95dc12b33643ac7d663807711b1;0;1;1;FLOAT4;0,0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;91;-438.244,-463.2033;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.ViewDirInputsCoordNode;52;-1934.612,28.5512;Inherit;False;World;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SaturateNode;99;-195.3589,375.4217;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FunctionNode;198;-1661.449,811.9089;Inherit;False;Global Blue Noise Sample;-1;;34;bac712bbbce65c14c9d4cbc808f3d0e0;0;2;8;FLOAT2;0,0;False;10;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;79;-464.7497,-2.95169;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.LerpOp;96;14.39998,395.2;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;1;False;2;FLOAT;0.5;False;1;FLOAT;0 +Node;AmplifyShaderEditor.WireNode;162;164.3546,-460.9641;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.WorldNormalVector;56;-1795.93,-107.5087;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.TextureCoordinatesNode;26;-2188.849,-1151.569;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.DotProductOpNode;53;-1586.973,-25.28336;Inherit;True;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;89;-568.7856,-147.8442;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;147;-2579.685,1000.482;Inherit;False;Property;_ScanlineSize;ScanlineSize;6;0;Create;True;0;0;0;False;0;False;1.5;1.5;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;70;-2371.177,768.7841;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;5;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;25;-1906.612,-973.0698;Inherit;True;Property;_BumpMap;Bump Map;2;1;[NoScaleOffset];Create;True;0;0;0;False;0;False;25;None;390800c9a68bb6d4a8f6080fcedf2590;True;0;True;bump;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;109;896.9503,-56.88453;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;SceneSelectionPass;0;8;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;101;896.9503,-28.88453;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ExtraPrePass;0;0;ExtraPrePass;5;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;0;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;103;896.9503,-56.88453;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ShadowCaster;0;2;ShadowCaster;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=ShadowCaster;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;105;896.9503,-56.88453;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Meta;0;4;Meta;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Meta;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;104;896.9503,-56.88453;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthOnly;0;3;DepthOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;False;False;True;1;LightMode=DepthOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;193;1141.95,41.11547;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;GBuffer;0;7;GBuffer;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=None;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;102;1141.95,-28.88453;Half;False;True;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;SLZ/Hologram Depth fade;94348b07e5e8bab40bd6c8a1e3df54cd;True;Forward;0;1;Forward;23;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;True;True;0;False;-1;True;0;False;-1;True;False;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=100;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalForward;False;False;0;Hidden/InternalErrorShader;0;0;Standard;48;Workflow;1;0;Surface;0;0; Refraction Model;0;0; Blend;0;0;Two Sided;1;0;Fragment Normal Space,InvertActionOnDeselection;0;0;Transmission;0;0; Transmission Shadow;0.5,False,-1;0;Translucency;0;0; Translucency Strength;1,False,-1;0; Normal Distortion;0.5,False,-1;0; Scattering;2,False,-1;0; Direct;0.9,False,-1;0; Ambient;0.1,False,-1;0; Shadow;0.5,False,-1;0;Cast Shadows;1;0; Use Shadow Threshold;0;0;Receive Shadows;1;0;GPU Instancing;1;637958567270329948;LOD CrossFade;0;637826276518736143;Built-in Fog;1;0;Lightmaps;0;637946548730332324;Volumetrics;1;0;Decals;0;0;Screen Space Occlusion;0;637952535710893479;Reflection Probe Blend/Projection;1;0;Light Layers;0;0;_FinalColorxAlpha;0;0;Meta Pass;0;637958566584180353;GBuffer Pass;0;0;Override Baked GI;0;0;Extra Pre Pass;0;0;DOTS Instancing;0;0;Tessellation;0;0; Phong;0;0; Strength;0.5,False,-1;0; Type;0;0; Tess;16,False,-1;0; Min;10,False,-1;0; Max;25,False,-1;0; Edge Length;16,False,-1;0; Max Displacement;25,False,-1;0;Write Depth;1;637807274411999678; Early Z;0;637808158371656942;Vertex Position,InvertActionOnDeselection;1;0;Debug Display;0;0;Clear Coat;0;637807264233463339;Fluorescence;0;0;0;10;False;True;True;True;False;True;True;True;True;True;False;;True;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;106;896.9503,-56.88453;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Universal2D;0;5;Universal2D;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;110;896.9503,-56.88453;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ScenePickingPass;0;9;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;107;896.9503,-56.88453;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthNormals;0;6;DepthNormals;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormals;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.CommentaryNode;169;-1711.449,761.9089;Inherit;False;320;185;Noise from global texture;0;;1,1,1,1;0;0 +WireConnection;145;0;146;0 +WireConnection;13;0;14;0 +WireConnection;13;1;15;3 +WireConnection;189;0;183;0 +WireConnection;68;0;72;2 +WireConnection;68;1;70;0 +WireConnection;65;0;68;0 +WireConnection;154;0;157;0 +WireConnection;154;1;189;0 +WireConnection;187;0;177;0 +WireConnection;17;0;16;0 +WireConnection;24;0;111;0 +WireConnection;24;1;12;0 +WireConnection;168;0;53;0 +WireConnection;54;0;53;0 +WireConnection;100;0;168;0 +WireConnection;183;0;190;0 +WireConnection;183;2;199;0 +WireConnection;78;0;80;0 +WireConnection;78;1;98;0 +WireConnection;80;0;198;0 +WireConnection;80;1;81;0 +WireConnection;199;0;152;4 +WireConnection;199;1;7;4 +WireConnection;190;0;187;0 +WireConnection;55;0;54;0 +WireConnection;55;1;54;0 +WireConnection;55;2;54;0 +WireConnection;157;0;18;0 +WireConnection;14;0;145;4 +WireConnection;14;1;24;0 +WireConnection;177;0;198;0 +WireConnection;16;0;14;0 +WireConnection;16;1;15;4 +WireConnection;47;0;79;0 +WireConnection;47;1;65;0 +WireConnection;47;2;91;0 +WireConnection;7;1;26;0 +WireConnection;86;1;26;0 +WireConnection;111;0;198;0 +WireConnection;18;0;17;0 +WireConnection;18;1;13;0 +WireConnection;88;0;89;0 +WireConnection;88;1;47;0 +WireConnection;85;0;52;0 +WireConnection;153;0;152;0 +WireConnection;153;1;88;0 +WireConnection;87;0;55;0 +WireConnection;87;1;48;0 +WireConnection;93;0;162;0 +WireConnection;93;1;96;0 +WireConnection;58;1;25;0 +WireConnection;91;0;7;0 +WireConnection;91;1;78;0 +WireConnection;99;0;100;0 +WireConnection;79;0;87;0 +WireConnection;79;1;78;0 +WireConnection;96;0;65;0 +WireConnection;96;2;99;0 +WireConnection;162;0;86;2 +WireConnection;56;0;58;0 +WireConnection;53;0;56;0 +WireConnection;53;1;85;0 +WireConnection;89;0;87;0 +WireConnection;89;1;48;4 +WireConnection;70;0;71;2 +WireConnection;70;1;147;0 +WireConnection;25;1;26;0 +WireConnection;102;0;91;0 +WireConnection;102;1;58;0 +WireConnection;102;2;153;0 +WireConnection;102;20;48;0 +WireConnection;102;3;86;1 +WireConnection;102;4;86;3 +WireConnection;102;5;93;0 +WireConnection;102;17;154;0 +ASEEND*/ +//CHKSM=FE78AAD06BFDD32A6EA9B17ADF3196523570F138 \ No newline at end of file diff --git a/Assets/SLZShaders/OpaqueHologram.shader.meta b/Assets/SLZShaders/OpaqueHologram.shader.meta new file mode 100644 index 0000000..6cbe9ba --- /dev/null +++ b/Assets/SLZShaders/OpaqueHologram.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f71cd8ed99405284ab09d18bf11d03ab +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/ParallaxCubeMap.shader b/Assets/SLZShaders/ParallaxCubeMap.shader new file mode 100644 index 0000000..0e71d0b --- /dev/null +++ b/Assets/SLZShaders/ParallaxCubeMap.shader @@ -0,0 +1,3515 @@ +// Made with Amplify Shader Editor +// Available at the Unity Asset Store - http://u3d.as/y3X +Shader "SLZ/ParallaxCubeMap" +{ + Properties + { + [HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1) + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [ASEBegin][Header(Main Surface Data)][Space(10)]_MainTex("MainTex", 2D) = "white" {} + _BaseColor("Surface Color", Color) = (1,1,1,0) + [Header(Main Surface Data)][Space(10)]_MAS("MAS", 2D) = "white" {} + [Normal]_BumpMap1("Surface Normal map", 2D) = "bump" {} + _NormalScale("NormalScale", Float) = 1 + [Header(Using Local space requires Static Batching to be disabled)][Space(5)][Toggle(_LOCALSPACE_ON)] _LocalSpace("Local Space", Float) = 0 + _WindowWorldPos("WindowWorldPos", Vector) = (0,0,0,0) + _Pos("Pos", Vector) = (0,0,0,0) + _Pos2("Pos2", Vector) = (0,0,0,0) + _Boxscale("Box scale", Vector) = (0,0,0,0) + _DistortionNormalScale("Distortion Normal Scale", Float) = 1 + [Normal]_BumpMap2("Distortion Normal map", 2D) = "bump" {} + _FresnelBlur("FresnelBlur", Range( 0 , 10)) = 0 + [HDR]_Color("Parallax Color Tint", Color) = (1,1,1,0) + _FresnelTint("Fresnel Tint", Color) = (0,0,0,0) + _MaxMip("Max Mip", Float) = 1 + _MinMip("MinMip", Float) = 0 + _CubeMap("CubeMap", CUBE) = "white" {} + _BakedMultiplier("Baked Multiplier", Float) = 1 + [ASEEnd]_WorldNormalBlend("WorldNormalBlend", Range( 0 , 1)) = 0 + [HideInInspector] _texcoord( "", 2D ) = "white" {} + + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + //_TransmissionShadow( "Transmission Shadow", Range( 0, 1 ) ) = 0.5 + //_TransStrength( "Trans Strength", Range( 0, 50 ) ) = 1 + //_TransNormal( "Trans Normal Distortion", Range( 0, 1 ) ) = 0.5 + //_TransScattering( "Trans Scattering", Range( 1, 50 ) ) = 2 + //_TransDirect( "Trans Direct", Range( 0, 1 ) ) = 0.9 + //_TransAmbient( "Trans Ambient", Range( 0, 1 ) ) = 0.1 + //_TransShadow( "Trans Shadow", Range( 0, 1 ) ) = 0.5 + //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5 + //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16 + //_TessMin( "Tess Min Distance", Float ) = 10 + //_TessMax( "Tess Max Distance", Float ) = 25 + //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16 + //_TessMaxDisp( "Tess Max Displacement", Float ) = 25 + } + + SubShader + { + LOD 0 + + + + + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Opaque" "Queue"="Geometry" } + Cull Back + ZWrite On + ZTest LEqual + Offset 0 , 0 + AlphaToMask Off + + HLSLINCLUDE + #pragma target 3.0 + + #pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + + #ifndef ASE_TESS_FUNCS + #define ASE_TESS_FUNCS + float4 FixedTess( float tessValue ) + { + return tessValue; + } + + float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos ) + { + float3 wpos = mul(o2w,vertex).xyz; + float dist = distance (wpos, cameraPos); + float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess; + return f; + } + + float4 CalcTriEdgeTessFactors (float3 triVertexFactors) + { + float4 tess; + tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z); + tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z); + tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y); + tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f; + return tess; + } + + float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams ) + { + float dist = distance (0.5 * (wpos0+wpos1), cameraPos); + float len = distance(wpos0, wpos1); + float f = max(len * scParams.y / (edgeLen * dist), 1.0); + return f; + } + + float DistanceFromPlane (float3 pos, float4 plane) + { + float d = dot (float4(pos,1.0f), plane); + return d; + } + + bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] ) + { + float4 planeTest; + planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f ); + return !all (planeTest); + } + + float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos ) + { + float3 f; + f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos); + f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos); + f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos); + + return CalcTriEdgeTessFactors (f); + } + + float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + return tess; + } + + float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + + if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes)) + { + tess = 0.0f; + } + else + { + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + } + return tess; + } + #endif //ASE_TESS_FUNCS + + ENDHLSL + + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForward" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile_fragment _ _LIGHT_LAYERS + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_FORWARD + + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + + #define ASE_NEEDS_FRAG_WORLD_VIEW_DIR + #define ASE_NEEDS_FRAG_WORLD_NORMAL + #define ASE_NEEDS_FRAG_WORLD_POSITION + #define ASE_NEEDS_FRAG_WORLD_TANGENT + #define ASE_NEEDS_FRAG_WORLD_BITANGENT + #pragma shader_feature_local _LOCALSPACE_ON + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DefaultLitVariants.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_texcoord8 : TEXCOORD8; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _FresnelTint; + float4 _BumpMap2_ST; + float4 _WindowWorldPos; + float4 _BumpMap1_ST; + float4 _BaseColor; + float4 _MAS_ST; + float3 _Boxscale; + float3 _Pos; + float3 _Pos2; + float _BakedMultiplier; + float _NormalScale; + float _DistortionNormalScale; + float _FresnelBlur; + float _MinMip; + float _MaxMip; + float _WorldNormalBlend; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _MainTex; + sampler2D _BumpMap1; + samplerCUBE _CubeMap; + sampler2D _BumpMap2; + sampler2D _MAS; + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord8.xy = v.texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + #if defined(LIGHTMAP_ON) + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + #if !defined(LIGHTMAP_ON) + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + #endif + + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) || defined(ASE_TERRAIN_INSTANCING) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float2 uv_MainTex = IN.ase_texcoord8.xy * _MainTex_ST.xy + _MainTex_ST.zw; + float4 tex2DNode11 = tex2D( _MainTex, uv_MainTex ); + float4 temp_output_120_0 = ( tex2DNode11 * _BaseColor ); + + float2 uv_BumpMap1 = IN.ase_texcoord8.xy * _BumpMap1_ST.xy + _BumpMap1_ST.zw; + float3 unpack77 = UnpackNormalScale( tex2D( _BumpMap1, uv_BumpMap1 ), _NormalScale ); + unpack77.z = lerp( 1, unpack77.z, saturate(_NormalScale) ); + + float3 lerpResult134 = lerp( -WorldViewDirection , WorldNormal , _WorldNormalBlend); + float3 temp_output_39_0 = saturate( ceil( lerpResult134 ) ); + float4 matrixToPos104 = float4( GetObjectToWorldMatrix()[0][3],GetObjectToWorldMatrix()[1][3],GetObjectToWorldMatrix()[2][3],GetObjectToWorldMatrix()[3][3]); + float3 temp_output_107_0 = (matrixToPos104).xyz; + float3 temp_output_108_0 = ( WorldPosition - temp_output_107_0 ); + #ifdef _LOCALSPACE_ON + float3 staticSwitch99 = temp_output_108_0; + #else + float3 staticSwitch99 = ( WorldPosition - (_WindowWorldPos).xyz ); + #endif + float3 break32 = ( (( ( ( ( _Boxscale + _Pos ) * temp_output_39_0 ) + ( ( -_Boxscale + _Pos2 ) * ( 1.0 - temp_output_39_0 ) ) ) - staticSwitch99 )).xyz / lerpResult134 ); + float2 uv_BumpMap2 = IN.ase_texcoord8.xy * _BumpMap2_ST.xy + _BumpMap2_ST.zw; + float3 unpack84 = UnpackNormalScale( tex2D( _BumpMap2, uv_BumpMap2 ), _DistortionNormalScale ); + unpack84.z = lerp( 1, unpack84.z, saturate(_DistortionNormalScale) ); + float3 tanToWorld0 = float3( WorldTangent.x, WorldBiTangent.x, WorldNormal.x ); + float3 tanToWorld1 = float3( WorldTangent.y, WorldBiTangent.y, WorldNormal.y ); + float3 tanToWorld2 = float3( WorldTangent.z, WorldBiTangent.z, WorldNormal.z ); + float3 ase_tanViewDir = tanToWorld0 * WorldViewDirection.x + tanToWorld1 * WorldViewDirection.y + tanToWorld2 * WorldViewDirection.z; + ase_tanViewDir = normalize(ase_tanViewDir); + float3 normalizeResult66 = normalize( ase_tanViewDir ); + float dotResult63 = dot( unpack84 , normalizeResult66 ); + float temp_output_133_0 = saturate( dotResult63 ); + float temp_output_65_0 = ( ( 1.0 - temp_output_133_0 ) * _FresnelBlur ); + float4 lerpResult117 = lerp( _FresnelTint , _Color , temp_output_133_0); + float4 lerpResult14 = lerp( float4( 0,0,0,0 ) , ( texCUBElod( _CubeMap, float4( ( ( lerpResult134 * min( min( break32.x , break32.y ) , break32.z ) ) + ( staticSwitch99 - _Pos ) ), (_MinMip + (temp_output_65_0 - 0.0) * (_MaxMip - _MinMip) / (1.0 - 0.0))) ) * lerpResult117 * temp_output_133_0 * ( 1.0 - (temp_output_120_0).a ) ) , tex2DNode11.a); + + float2 uv_MAS = IN.ase_texcoord8.xy * _MAS_ST.xy + _MAS_ST.zw; + float4 tex2DNode132 = tex2D( _MAS, uv_MAS ); + + float3 Albedo = temp_output_120_0.rgb; + float3 Normal = unpack77; + float3 Emission = lerpResult14.rgb; +#if 0 + float3 BakedEmission = ( texCUBElod( _CubeMap, float4( temp_output_108_0, 0.0) ) * _Color * _BakedMultiplier ).rgb; +#endif + float3 Specular = 0.5; + float Metallic = tex2DNode132.r; + float Smoothness = tex2DNode132.b; + float Occlusion = tex2DNode132.g; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _CLEARCOAT + float CoatMask = 0; + float CoatSmoothness = 0; + #endif + + #if defined(_FLUORESCENCE) + float4 Fluorescence = 0; + float4 Absorbance = 0; + #endif + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.viewDirectionWS = WorldViewDirection; + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + #else + inputData.normalWS = WorldNormal; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + inputData.shadowCoord = ShadowCoords; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + inputData.shadowCoord = TransformWorldToShadowCoord(inputData.positionWS); + #else + inputData.shadowCoord = float4(0, 0, 0, 0); + #endif + + + #ifdef ASE_FOG + inputData.fogCoord = IN.fogFactorAndVertexLight.x; + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzww; //TODO: Shuffle things in vertex streams so we get full RGBA color rather than RGBB here + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xyz, IN.dynamicLightmapUV.xy, IN.vertexSH, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI(IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, IN.vertexSH , inputData.normalWS); + #endif + + #else + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + #endif + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + SurfaceData surfaceData; + surfaceData.albedo = Albedo; + surfaceData.metallic = saturate(Metallic); + surfaceData.specular = Specular; + surfaceData.smoothness = saturate(Smoothness), + surfaceData.occlusion = Occlusion, + surfaceData.emission = Emission, + surfaceData.alpha = saturate(Alpha); + surfaceData.normalTS = Normal; + surfaceData.clearCoatMask = 0; + surfaceData.clearCoatSmoothness = 1; + + #ifdef _CLEARCOAT + surfaceData.clearCoatMask = saturate(CoatMask); + surfaceData.clearCoatSmoothness = saturate(CoatSmoothness); + #endif + #if defined(_FLUORESCENCE) + surfaceData.fluorescence = Fluorescence; + surfaceData.absorbance = Absorbance; + #endif + + #ifdef _DBUFFER + ApplyDecalToSurfaceData(IN.clipPos, surfaceData, inputData); + #endif + + half4 color = UniversalFragmentPBR( inputData, surfaceData); + + #ifdef LIGHTMAP_ON + float3 MetalSpec = lerp(kDieletricSpec.rgb, surfaceData.albedo , surfaceData.metallic); + color.rgb += BakedSpecular * surfaceData.occlusion * MetalSpec * inputData.bakedGI.rgb; + #endif + + #ifdef _TRANSMISSION_ASE + { + float shadow = _TransmissionShadow; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + half3 mainTransmission = max(0 , -dot(inputData.normalWS, mainLight.direction)) * mainAtten * Transmission; + color.rgb += Albedo * mainTransmission; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 transmission = max(0 , -dot(inputData.normalWS, light.direction)) * atten * Transmission; + color.rgb += Albedo * transmission; + } + #endif + } + #endif + + #ifdef _TRANSLUCENCY_ASE + { + float shadow = _TransShadow; + float normal = _TransNormal; + float scattering = _TransScattering; + float direct = _TransDirect; + float ambient = _TransAmbient; + float strength = _TransStrength; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + + half3 mainLightDir = mainLight.direction + inputData.normalWS * normal; + half mainVdotL = pow( saturate( dot( inputData.viewDirectionWS, -mainLightDir ) ), scattering ); + half3 mainTranslucency = mainAtten * ( mainVdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * mainTranslucency * strength; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 lightDir = light.direction + inputData.normalWS * normal; + half VdotL = pow( saturate( dot( inputData.viewDirectionWS, -lightDir ) ), scattering ); + half3 translucency = atten * ( VdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * translucency * strength; + } + #endif + } + #endif + + #ifdef _REFRACTION_ASE + float4 projScreenPos = ScreenPos / ScreenPos.w; + float3 refractionOffset = ( RefractionIndex - 1.0 ) * mul( UNITY_MATRIX_V, float4( WorldNormal,0 ) ).xyz * ( 1.0 - dot( WorldNormal, WorldViewDirection ) ); + projScreenPos.xy += refractionOffset.xy; + float3 refraction = SHADERGRAPH_SAMPLE_SCENE_COLOR( projScreenPos.xy ) * RefractionColor; + color.rgb = lerp( refraction, color.rgb, color.a ); + color.a = 1; + #endif + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, -inputData.viewDirectionWS, IN.fogFactorAndVertexLight.x); + #endif + #endif + + color = Volumetrics( color, inputData.positionWS); + + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return color; + } + + ENDHLSL + } + + + Pass + { + + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + + ZWrite On + ZTest LEqual + AlphaToMask Off + ColorMask 0 + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile_fragment _ _LIGHT_LAYERS + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #pragma multi_compile _ _CASTING_PUNCTUAL_LIGHT_SHADOW + + #define SHADERPASS SHADERPASS_SHADOWCASTER + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _FresnelTint; + float4 _BumpMap2_ST; + float4 _WindowWorldPos; + float4 _BumpMap1_ST; + float4 _BaseColor; + float4 _MAS_ST; + float3 _Boxscale; + float3 _Pos; + float3 _Pos2; + float _BakedMultiplier; + float _NormalScale; + float _DistortionNormalScale; + float _FresnelBlur; + float _MinMip; + float _MaxMip; + float _WorldNormalBlend; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + float3 _LightDirection; + float3 _LightPosition; + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + + float3 normalWS = TransformObjectToWorldDir(v.ase_normal); + + + #if _CASTING_PUNCTUAL_LIGHT_SHADOW + float3 lightDirectionWS = normalize(_LightPosition - positionWS); + #else + float3 lightDirectionWS = _LightDirection; + #endif + float2 vShadowOffsets = GetShadowOffsets( normalWS, lightDirectionWS ); + positionWS.xyz -= vShadowOffsets.y * lightDirectionWS.xyz * .01; + float4 clipPos = TransformObjectToHClip( float4( mul( unity_WorldToObject, float4( positionWS.xyz, 1.0 ) ).xyz, 1.0 ) ); + //float4 clipPos = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, lightDirectionWS)); + + #if UNITY_REVERSED_Z + clipPos.z = min(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #else + clipPos.z = max(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #endif + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = clipPos; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + #ifdef _ALPHATEST_SHADOW_ON + clip(Alpha - AlphaClipThresholdShadow); + #else + clip(Alpha - AlphaClipThreshold); + #endif + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + return 0; + } + + ENDHLSL + } + + + Pass + { + + Name "DepthOnly" + Tags { "LightMode"="DepthOnly" } + + ZWrite On + ColorMask 0 + AlphaToMask Off + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile_fragment _ _LIGHT_LAYERS + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _FresnelTint; + float4 _BumpMap2_ST; + float4 _WindowWorldPos; + float4 _BumpMap1_ST; + float4 _BaseColor; + float4 _MAS_ST; + float3 _Boxscale; + float3 _Pos; + float3 _Pos2; + float _BakedMultiplier; + float _NormalScale; + float _DistortionNormalScale; + float _FresnelBlur; + float _MinMip; + float _MaxMip; + float _WorldNormalBlend; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return 0; + } + ENDHLSL + } + + + Pass + { + + Name "Meta" + Tags { "LightMode"="Meta" } + + Cull Off + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile_fragment _ _LIGHT_LAYERS + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #pragma shader_feature _ EDITOR_VISUALIZATION + + #define SHADERPASS SHADERPASS_META + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/MetaInput.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #define ASE_NEEDS_FRAG_WORLD_POSITION + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + #ifdef EDITOR_VISUALIZATION + float4 VizUV : TEXCOORD2; + float4 LightCoord : TEXCOORD3; + #endif + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _FresnelTint; + float4 _BumpMap2_ST; + float4 _WindowWorldPos; + float4 _BumpMap1_ST; + float4 _BaseColor; + float4 _MAS_ST; + float3 _Boxscale; + float3 _Pos; + float3 _Pos2; + float _BakedMultiplier; + float _NormalScale; + float _DistortionNormalScale; + float _FresnelBlur; + float _MinMip; + float _MaxMip; + float _WorldNormalBlend; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _MainTex; + samplerCUBE _CubeMap; + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord4.xy = v.texcoord0.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.clipPos = MetaVertexPosition( v.vertex, v.texcoord1.xy, v.texcoord1.xy, unity_LightmapST, unity_DynamicLightmapST ); + + #ifdef EDITOR_VISUALIZATION + float2 VizUV = 0; + float4 LightCoord = 0; + UnityEditorVizData(v.vertex.xyz, v.texcoord0.xy, v.texcoord1.xy, v.texcoord2.xy, VizUV, LightCoord); + o.VizUV = float4(VizUV, 0, 0); + o.LightCoord = LightCoord; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = o.clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.texcoord0 = v.texcoord0; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.texcoord0 = patch[0].texcoord0 * bary.x + patch[1].texcoord0 * bary.y + patch[2].texcoord0 * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 uv_MainTex = IN.ase_texcoord4.xy * _MainTex_ST.xy + _MainTex_ST.zw; + float4 tex2DNode11 = tex2D( _MainTex, uv_MainTex ); + float4 temp_output_120_0 = ( tex2DNode11 * _BaseColor ); + + float4 matrixToPos104 = float4( GetObjectToWorldMatrix()[0][3],GetObjectToWorldMatrix()[1][3],GetObjectToWorldMatrix()[2][3],GetObjectToWorldMatrix()[3][3]); + float3 temp_output_107_0 = (matrixToPos104).xyz; + float3 temp_output_108_0 = ( WorldPosition - temp_output_107_0 ); + + + float3 Albedo = temp_output_120_0.rgb; + float3 Emission = ( texCUBElod( _CubeMap, float4( temp_output_108_0, 0.0) ) * _Color * _BakedMultiplier ).rgb; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + MetaInput metaInput = (MetaInput)0; + metaInput.Albedo = Albedo; + metaInput.Emission = Emission; + #ifdef EDITOR_VISUALIZATION + metaInput.VizUV = IN.VizUV.xy; + metaInput.LightCoord = IN.LightCoord; + #endif + + return MetaFragment(metaInput); + } + ENDHLSL + } + + /*ase_pass*/ + Pass + { + + Name "BakedRaytrace" + Tags{ "LightMode" = "BakedRaytrace" } + HLSLPROGRAM + + /*ase_pragma_before*/ + + #define SHADERPASS SHADERPASS_RAYTRACE + + #include "UnityRaytracingMeshUtils.cginc" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #define _EMISSION + #pragma raytracing test + #pragma shader_feature_local __ _ALBEDOMULTIPLY_ON + #pragma shader_feature_local __ _EMISSION_ON + + /*ase_pragma*/ + + struct RayPayload + { + float4 color; + float3 dir; + }; + + struct AttributeData + { + float2 barycentrics; + }; + + struct Vertex + { + float2 texcoord; + float3 normal; + }; + + Texture2D _BaseMap; + SamplerState sampler_BaseMap; + + CBUFFER_START( UnityPerMaterial ) + /*ase_srp_batcher*/ + Texture2D _EmissionMap; + SamplerState sampler_EmissionMap; + + float4 _EmissionColor; + float4 _BaseMap_ST; + float _BakedMutiplier = 1; + CBUFFER_END + + /*ase_globals*/ + + /*ase_funcs*/ + + //https://coty.tips/raytracing-in-unity/ + [shader("closesthit")] + void MyClosestHit(inout RayPayload payload, + AttributeData attributes : SV_IntersectionAttributes) { + + payload.color = float4(0,0,0,1); //Intializing + payload.dir = float3(1,0,0); + + // #if _EMISSION_ON + uint2 launchIdx = DispatchRaysIndex(); + // ShadingData shade = getShadingData( PrimitiveIndex(), attribs ); + + uint primitiveIndex = PrimitiveIndex(); + uint3 triangleIndicies = UnityRayTracingFetchTriangleIndices(primitiveIndex); + Vertex v0, v1, v2; + + v0.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.x, kVertexAttributeTexCoord0); + v1.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.y, kVertexAttributeTexCoord0); + v2.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.z, kVertexAttributeTexCoord0); + + // v0.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.x, kVertexAttributeNormal); + // v1.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.y, kVertexAttributeNormal); + // v2.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.z, kVertexAttributeNormal); + + float3 barycentrics = float3(1.0 - attributes.barycentrics.x - attributes.barycentrics.y, attributes.barycentrics.x, attributes.barycentrics.y); + + Vertex vInterpolated; + vInterpolated.texcoord = v0.texcoord * barycentrics.x + v1.texcoord * barycentrics.y + v2.texcoord * barycentrics.z; + //TODO: Extract normal direction to ignore the backside of emissive objects + //vInterpolated.normal = v0.normal * barycentrics.x + v1.normal * barycentrics.y + v2.normal * barycentrics.z; + // if ( dot(vInterpolated.normal, float3(1,0,0) < 0) ) payload.color = float4(0,10,0,1) ; + // else payload.color = float4(10,0,0,1) ; + + //TODO: Figure out how to tie Amplify into using Texture2d and SamplerState instead of the bundled sampler2D. Forcing names for now. + //#if _ALBEDOMULTIPLY_ON + float4 albedo = float4(_BaseMap.SampleLevel(sampler_BaseMap, vInterpolated.texcoord.xy * _BaseMap_ST.xy + _BaseMap_ST.zw, 0 ).rgb , 1) ; + // #else + // float4 albedo = float4(1,1,1,1); + // #endif + + payload.color = float4( (_EmissionMap.SampleLevel(sampler_EmissionMap, vInterpolated.texcoord * _BaseMap_ST.xy + _BaseMap_ST.zw,0) ).rgb * _EmissionColor.rgb * albedo.rgb * _BakedMutiplier , 1 ); + // #else + // payload.color = float4(0,0,0,1); + + // #endif + } + ENDHLSL + + } + + + Pass + { + + Name "Universal2D" + Tags { "LightMode"="Universal2D" } + + Blend One Zero, One Zero + ColorMask RGBA + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile_fragment _ _LIGHT_LAYERS + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_2D + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float4 ase_texcoord2 : TEXCOORD2; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _FresnelTint; + float4 _BumpMap2_ST; + float4 _WindowWorldPos; + float4 _BumpMap1_ST; + float4 _BaseColor; + float4 _MAS_ST; + float3 _Boxscale; + float3 _Pos; + float3 _Pos2; + float _BakedMultiplier; + float _NormalScale; + float _DistortionNormalScale; + float _FresnelBlur; + float _MinMip; + float _MaxMip; + float _WorldNormalBlend; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _MainTex; + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID( v ); + UNITY_TRANSFER_INSTANCE_ID( v, o ); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + o.ase_texcoord2.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord2.zw = 0; + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 uv_MainTex = IN.ase_texcoord2.xy * _MainTex_ST.xy + _MainTex_ST.zw; + float4 tex2DNode11 = tex2D( _MainTex, uv_MainTex ); + float4 temp_output_120_0 = ( tex2DNode11 * _BaseColor ); + + + float3 Albedo = temp_output_120_0.rgb; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + half4 color = half4( Albedo, Alpha ); + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + return color; + } + ENDHLSL + } + + + Pass + { + + Name "DepthNormals" + Tags { "LightMode"="DepthNormals" } + + ZWrite On + Blend One Zero + ZTest LEqual + ZWrite On + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile_fragment _ _LIGHT_LAYERS + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float3 worldNormal : TEXCOORD2; + float4 worldTangent : TEXCOORD3; + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _FresnelTint; + float4 _BumpMap2_ST; + float4 _WindowWorldPos; + float4 _BumpMap1_ST; + float4 _BaseColor; + float4 _MAS_ST; + float3 _Boxscale; + float3 _Pos; + float3 _Pos2; + float _BakedMultiplier; + float _NormalScale; + float _DistortionNormalScale; + float _FresnelBlur; + float _MinMip; + float _MaxMip; + float _WorldNormalBlend; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _BumpMap1; + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord4.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal( v.ase_normal ); + float4 tangentWS = float4(TransformObjectToWorldDir( v.ase_tangent.xyz), v.ase_tangent.w); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.worldNormal = normalWS; + o.worldTangent = tangentWS; + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + float3 WorldNormal = IN.worldNormal; + float4 WorldTangent = IN.worldTangent; + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 uv_BumpMap1 = IN.ase_texcoord4.xy * _BumpMap1_ST.xy + _BumpMap1_ST.zw; + float3 unpack77 = UnpackNormalScale( tex2D( _BumpMap1, uv_BumpMap1 ), _NormalScale ); + unpack77.z = lerp( 1, unpack77.z, saturate(_NormalScale) ); + + float3 Normal = unpack77; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + #if defined(_GBUFFER_NORMALS_OCT) + float2 octNormalWS = PackNormalOctQuadEncode(WorldNormal); + float2 remappedOctNormalWS = saturate(octNormalWS * 0.5 + 0.5); + half3 packedNormalWS = PackFloat2To888(remappedOctNormalWS); + return half4(packedNormalWS, 0.0); + #else + + #if defined(_NORMALMAP) + #if _NORMAL_DROPOFF_TS + float crossSign = (WorldTangent.w > 0.0 ? 1.0 : -1.0) * GetOddNegativeScale(); + float3 bitangent = crossSign * cross(WorldNormal.xyz, WorldTangent.xyz); + float3 normalWS = TransformTangentToWorld(Normal, half3x3(WorldTangent.xyz, bitangent, WorldNormal.xyz)); + #elif _NORMAL_DROPOFF_OS + float3 normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + float3 normalWS = Normal; + #endif + #else + float3 normalWS = WorldNormal; + #endif + + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + #endif + } + ENDHLSL + } + + + Pass + { + + Name "GBuffer" + Tags { "LightMode"="UniversalGBuffer" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM +#define _NORMAL_DROPOFF_TS 1#pragma multi_compile_fog#define ASE_FOG 1#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3#pragma multi_compile_fragment _ _LIGHT_LAYERS#define _EMISSION#define _NORMALMAP 1#define ASE_SRP_VERSION 999999 +#if FALSE + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile _ DYNAMICLIGHTMAP_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE + //_MAIN_LIGHT_SHADOWS_SCREEN + + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION + + #pragma multi_compile_fragment _ _SHADOWS_SOFT + #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING + #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE + //#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile _ _GBUFFER_NORMALS_OCT + //#pragma multi_compile_fragment _ _LIGHT_LAYERS + #pragma multi_compile _ _RENDER_PASS_ENABLED + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_GBUFFER + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl" + + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + #define ASE_NEEDS_FRAG_WORLD_VIEW_DIR + #define ASE_NEEDS_FRAG_WORLD_NORMAL + #define ASE_NEEDS_FRAG_WORLD_POSITION + #define ASE_NEEDS_FRAG_WORLD_TANGENT + #define ASE_NEEDS_FRAG_WORLD_BITANGENT + #pragma shader_feature_local _LOCALSPACE_ON + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_texcoord8 : TEXCOORD8; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _FresnelTint; + float4 _BumpMap2_ST; + float4 _WindowWorldPos; + float4 _BumpMap1_ST; + float4 _BaseColor; + float4 _MAS_ST; + float3 _Boxscale; + float3 _Pos; + float3 _Pos2; + float _BakedMultiplier; + float _NormalScale; + float _DistortionNormalScale; + float _FresnelBlur; + float _MinMip; + float _MaxMip; + float _WorldNormalBlend; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _MainTex; + sampler2D _BumpMap1; + samplerCUBE _CubeMap; + sampler2D _BumpMap2; + sampler2D _MAS; + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord8.xy = v.texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + FragmentOutput frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #else + ShadowCoords = float4(0, 0, 0, 0); + #endif + + + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float2 uv_MainTex = IN.ase_texcoord8.xy * _MainTex_ST.xy + _MainTex_ST.zw; + float4 tex2DNode11 = tex2D( _MainTex, uv_MainTex ); + float4 temp_output_120_0 = ( tex2DNode11 * _BaseColor ); + + float2 uv_BumpMap1 = IN.ase_texcoord8.xy * _BumpMap1_ST.xy + _BumpMap1_ST.zw; + float3 unpack77 = UnpackNormalScale( tex2D( _BumpMap1, uv_BumpMap1 ), _NormalScale ); + unpack77.z = lerp( 1, unpack77.z, saturate(_NormalScale) ); + + float3 lerpResult134 = lerp( -WorldViewDirection , WorldNormal , _WorldNormalBlend); + float3 temp_output_39_0 = saturate( ceil( lerpResult134 ) ); + float4 matrixToPos104 = float4( GetObjectToWorldMatrix()[0][3],GetObjectToWorldMatrix()[1][3],GetObjectToWorldMatrix()[2][3],GetObjectToWorldMatrix()[3][3]); + float3 temp_output_107_0 = (matrixToPos104).xyz; + float3 temp_output_108_0 = ( WorldPosition - temp_output_107_0 ); + #ifdef _LOCALSPACE_ON + float3 staticSwitch99 = temp_output_108_0; + #else + float3 staticSwitch99 = ( WorldPosition - (_WindowWorldPos).xyz ); + #endif + float3 break32 = ( (( ( ( ( _Boxscale + _Pos ) * temp_output_39_0 ) + ( ( -_Boxscale + _Pos2 ) * ( 1.0 - temp_output_39_0 ) ) ) - staticSwitch99 )).xyz / lerpResult134 ); + float2 uv_BumpMap2 = IN.ase_texcoord8.xy * _BumpMap2_ST.xy + _BumpMap2_ST.zw; + float3 unpack84 = UnpackNormalScale( tex2D( _BumpMap2, uv_BumpMap2 ), _DistortionNormalScale ); + unpack84.z = lerp( 1, unpack84.z, saturate(_DistortionNormalScale) ); + float3 tanToWorld0 = float3( WorldTangent.x, WorldBiTangent.x, WorldNormal.x ); + float3 tanToWorld1 = float3( WorldTangent.y, WorldBiTangent.y, WorldNormal.y ); + float3 tanToWorld2 = float3( WorldTangent.z, WorldBiTangent.z, WorldNormal.z ); + float3 ase_tanViewDir = tanToWorld0 * WorldViewDirection.x + tanToWorld1 * WorldViewDirection.y + tanToWorld2 * WorldViewDirection.z; + ase_tanViewDir = normalize(ase_tanViewDir); + float3 normalizeResult66 = normalize( ase_tanViewDir ); + float dotResult63 = dot( unpack84 , normalizeResult66 ); + float temp_output_133_0 = saturate( dotResult63 ); + float temp_output_65_0 = ( ( 1.0 - temp_output_133_0 ) * _FresnelBlur ); + float4 lerpResult117 = lerp( _FresnelTint , _Color , temp_output_133_0); + float4 lerpResult14 = lerp( float4( 0,0,0,0 ) , ( texCUBElod( _CubeMap, float4( ( ( lerpResult134 * min( min( break32.x , break32.y ) , break32.z ) ) + ( staticSwitch99 - _Pos ) ), (_MinMip + (temp_output_65_0 - 0.0) * (_MaxMip - _MinMip) / (1.0 - 0.0))) ) * lerpResult117 * temp_output_133_0 * ( 1.0 - (temp_output_120_0).a ) ) , tex2DNode11.a); + + float2 uv_MAS = IN.ase_texcoord8.xy * _MAS_ST.xy + _MAS_ST.zw; + float4 tex2DNode132 = tex2D( _MAS, uv_MAS ); + + float3 Albedo = temp_output_120_0.rgb; + float3 Normal = unpack77; + float3 Emission = lerpResult14.rgb; + float3 Specular = 0.5; + float Metallic = tex2DNode132.r; + float Smoothness = tex2DNode132.b; + float Occlusion = tex2DNode132.g; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.positionCS = IN.clipPos; + inputData.shadowCoord = ShadowCoords; + + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + #else + inputData.normalWS = WorldNormal; + #endif + + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + inputData.viewDirectionWS = SafeNormalize( WorldViewDirection ); + + + + #ifdef ASE_FOG + inputData.fogCoord = InitializeInputDataFog(float4(WorldPosition, 1.0), IN.fogFactorAndVertexLight.x); + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw; + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #else + #if defined(DYNAMICLIGHTMAP_ON) + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, SH, inputData.normalWS); + #else + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, SH, inputData.normalWS ); + #endif + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + #ifdef _DBUFFER + ApplyDecal(IN.clipPos, + Albedo, + Specular, + inputData.normalWS, + Metallic, + Occlusion, + Smoothness); + #endif + + BRDFData brdfData; + InitializeBRDFData + (Albedo, Metallic, Specular, Smoothness, Alpha, brdfData); + + Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, inputData.shadowMask); + half4 color; + MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, inputData.shadowMask); + color.rgb = GlobalIllumination(brdfData, inputData.bakedGI, Occlusion, inputData.positionWS, inputData.normalWS, inputData.viewDirectionWS); + color.a = Alpha; + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, IN.fogFactorAndVertexLight.x); + #endif + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return BRDFDataToGbuffer(brdfData, inputData, Smoothness, Emission + color.rgb); + } +#endif + ENDHLSL + } + + + + Pass + { + + Name "SceneSelectionPass" + Tags { "LightMode"="SceneSelectionPass" } + + Cull Off + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile_fragment _ _LIGHT_LAYERS + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _FresnelTint; + float4 _BumpMap2_ST; + float4 _WindowWorldPos; + float4 _BumpMap1_ST; + float4 _BaseColor; + float4 _MAS_ST; + float3 _Boxscale; + float3 _Pos; + float3 _Pos2; + float _BakedMultiplier; + float _NormalScale; + float _DistortionNormalScale; + float _FresnelBlur; + float _MinMip; + float _MaxMip; + float _WorldNormalBlend; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + int _ObjectId; + int _PassValue; + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = half4(_ObjectId, _PassValue, 1.0, 1.0); + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "ScenePickingPass" + Tags { "LightMode"="Picking" } + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile_fragment _ _LIGHT_LAYERS + #define _EMISSION + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _FresnelTint; + float4 _BumpMap2_ST; + float4 _WindowWorldPos; + float4 _BumpMap1_ST; + float4 _BaseColor; + float4 _MAS_ST; + float3 _Boxscale; + float3 _Pos; + float3 _Pos2; + float _BakedMultiplier; + float _NormalScale; + float _DistortionNormalScale; + float _FresnelBlur; + float _MinMip; + float _MaxMip; + float _WorldNormalBlend; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + + float4 _SelectionID; + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = 0; + outColor = _SelectionID; + + return outColor; + } + + ENDHLSL + } + + } + + CustomEditor "UnityEditor.ShaderGraphLitGUI" + Fallback "Hidden/InternalErrorShader" + +} +/*ASEBEGIN +Version=18935 +2615;112;1538;1067;5379.674;878.0857;1.071727;True;True +Node;AmplifyShaderEditor.CommentaryNode;25;-4008.162,-205.8339;Inherit;False;609.7188;476.146;Skiping if statement for android;6;54;49;47;41;40;39;If;0.9811321,0.02313991,0.02313991,1;0;0 +Node;AmplifyShaderEditor.TFHCRemapNode;111;-1308.118,-148.489;Inherit;False;5;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;1;False;3;FLOAT;0;False;4;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;126;-944.5485,650.0201;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;65;-1284.169,-479.959;Inherit;True;2;2;0;FLOAT;0;False;1;FLOAT;8;False;1;FLOAT;0 +Node;AmplifyShaderEditor.StaticSwitch;100;-4880.604,-260.9592;Inherit;False;Property;_LocalSpace;LocalSpace;15;0;Create;True;0;0;0;False;0;False;0;0;0;True;;Toggle;2;Key0;Key1;Reference;99;True;True;All;9;1;FLOAT3;0,0,0;False;0;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;3;FLOAT3;0,0,0;False;4;FLOAT3;0,0,0;False;5;FLOAT3;0,0,0;False;6;FLOAT3;0,0,0;False;7;FLOAT3;0,0,0;False;8;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SamplerNode;11;-2109.955,-1085.791;Inherit;True;Property;_MainTex;MainTex;0;1;[Header];Create;True;1;Main Surface Data;0;0;False;1;Space(10);False;11;None;4778e747c31fdd141b66c930e50cbd97;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.ColorNode;119;-1193.971,248.5731;Inherit;False;Property;_FresnelTint;Fresnel Tint;16;0;Create;True;0;0;0;False;0;False;0,0,0,0;0.02894512,0.2547169,0,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RelayNode;36;-4214.263,-438.034;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.NegateNode;59;-5399.121,-308.1193;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SamplerNode;77;-2109.682,-901.4337;Inherit;True;Property;_BumpMap1;Surface Normal map;3;1;[Normal];Create;False;0;0;0;False;0;False;11;None;None;True;0;True;bump;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.WireNode;37;-4344.163,338.1658;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;53;-2456.162,-93.83391;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.WireNode;51;-2584.162,402.1658;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SamplerNode;123;-820.9841,810.334;Inherit;True;Property;_TextureSample1;Texture Sample 1;1;0;Create;True;0;0;0;False;0;False;-1;None;46d5874372228443fa0640e1bebd08aa;True;0;False;black;LockedToCube;False;Object;-1;MipLevel;Cube;8;0;SAMPLERCUBE;;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT3;0,0,0;False;4;FLOAT3;0,0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;112;-1496.118,-6.488953;Inherit;False;Property;_MaxMip;Max Mip;17;0;Create;True;0;0;0;False;0;False;1;2;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;109;-2627.937,-681.7631;Float;False;Property;_DistortionNormalScale;Distortion Normal Scale;12;0;Create;True;0;0;0;False;0;False;1;2;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SwizzleNode;107;-5302.21,-727.2861;Inherit;False;FLOAT3;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.RelayNode;58;-4464.938,-357.7081;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SaturateNode;39;-3784.162,-157.8339;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.RangedFloatNode;129;-674.0391,1016.115;Inherit;False;Property;_BakedMultiplier;Baked Multiplier;20;0;Create;True;0;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;84;-2322.722,-714.6106;Inherit;True;Property;_BumpMap2;Distortion Normal map;13;1;[Normal];Create;False;0;0;0;False;0;False;-1;None;a6bec17ddbb49455b97ab9d95650ffc2;True;0;True;bump;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.ViewDirInputsCoordNode;62;-2594.897,-525.7339;Float;False;Tangent;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;125;-408.0619,842.7873;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SamplerNode;69;-1064.446,-248.8728;Inherit;True;Property;_CubeMapS;CubeMapS;7;2;[Header];[NoScaleOffset];Create;True;1;Parallax Options;0;0;False;1;Space(10);False;-1;None;ae25e28c233c45048b0e68d386a7dea2;True;0;False;black;LockedToCube;False;Object;-1;MipLevel;Cube;8;0;SAMPLERCUBE;;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT3;0,0,0;False;4;FLOAT3;0,0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.OneMinusNode;115;-867.7971,-853.4991;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;136;-5788.363,280.2531;Inherit;False;Property;_WorldNormalBlend;WorldNormalBlend;21;0;Create;True;0;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.CeilOpNode;40;-3960.162,-157.8339;Inherit;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;48;-1961.97,-314.1174;Inherit;True;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.ColorNode;73;-1169.222,37.35608;Inherit;False;Property;_Color;Parallax Color Tint;15;1;[HDR];Create;False;0;0;0;False;0;False;1,1,1,0;12.05757,31.12157,25.41867,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SaturateNode;133;-1674.247,-489.763;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.Vector3Node;43;-4552.163,-93.83391;Float;False;Property;_Pos;Pos;9;0;Create;True;0;0;0;False;0;False;0,0,0;-0.52,41.8,-32.84;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SimpleMinOpNode;56;-2319.395,-250.1176;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.DotProductOpNode;63;-1950.748,-558.8289;Inherit;True;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.NormalizeNode;66;-2266.636,-504.8201;Inherit;False;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.RangedFloatNode;68;-1631.478,-403.3352;Float;False;Property;_FresnelBlur;FresnelBlur;14;0;Create;True;0;0;0;False;0;False;0;10;0;10;0;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;87;-1046.167,-469.3177;Inherit;False;Property;_BaseColor;Surface Color;1;0;Create;False;0;0;0;False;0;False;1,1,1,0;0.2924528,0.2924528,0.2924528,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;34;-3268,-160.9769;Inherit;True;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;72;-589.4422,-78.17037;Inherit;True;4;4;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.Vector3Node;38;-4552.163,-253.8339;Float;False;Property;_Boxscale;Box scale;11;0;Create;True;0;0;0;False;0;False;0,0,0;18,18.8,50.6;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SimpleDivideOpNode;52;-2837.262,-157.3608;Inherit;True;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.NegateNode;44;-4392.163,-173.8339;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.RangedFloatNode;86;-288.142,142.8333;Inherit;False;Property;_Metalic;Metalic;6;0;Create;True;0;0;0;False;0;False;0;0.971;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.OneMinusNode;67;-1479.745,-517.8773;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.WorldNormalVector;138;-5809.057,117.0624;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;108;-5081.484,-504.2385;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.Vector3Node;57;-4536.163,66.1661;Float;False;Property;_Pos2;Pos2;10;0;Create;True;0;0;0;False;0;False;0,0,0;0,51.53,2.5;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.RangedFloatNode;64;-2304.001,-808.2642;Float;False;Property;_NormalScale;NormalScale;4;0;Create;True;0;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMinOpNode;46;-2489.254,-258.6125;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ObjectToWorldMatrixNode;106;-5761.084,-747.0352;Inherit;False;0;1;FLOAT4x4;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;54;-3560.162,-13.83394;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.RangedFloatNode;113;-1506.118,-85.48895;Inherit;False;Property;_MinMip;MinMip;18;0;Create;True;0;0;0;False;0;False;0;0.5;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;85;-297.142,231.8333;Inherit;False;Property;_Smoothness;Smoothness;5;0;Create;True;0;0;0;False;0;False;0;0.864;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.PosFromTransformMatrix;104;-5536.874,-755.1671;Inherit;False;1;0;FLOAT4x4;1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;False;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.StaticSwitch;99;-4859.743,-641.0718;Inherit;False;Property;_LocalSpace;Local Space;7;0;Create;True;0;0;0;False;2;Header(Using Local space requires Static Batching to be disabled);Space(5);False;0;0;0;True;;Toggle;2;Key0;Key1;Create;True;True;All;9;1;FLOAT3;0,0,0;False;0;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;3;FLOAT3;0,0,0;False;4;FLOAT3;0,0,0;False;5;FLOAT3;0,0,0;False;6;FLOAT3;0,0,0;False;7;FLOAT3;0,0,0;False;8;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.Vector4Node;70;-5516.064,-979.4739;Inherit;False;Property;_WindowWorldPos;WindowWorldPos;8;0;Create;True;0;0;0;False;0;False;0,0,0,0;-9,43,-7.02,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.LerpOp;117;-873.733,17.19793;Inherit;True;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;47;-3736.162,50.1661;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;45;-4184.162,-13.83394;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;55;-2188.324,-367.0969;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SamplerNode;132;-523.8444,357.0862;Inherit;True;Property;_MAS;MAS;2;1;[Header];Create;True;1;Main Surface Data;0;0;False;1;Space(10);False;11;None;68f1fe8d8a71b9a43a6cd8f2a07ef659;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.OneMinusNode;122;-251.5297,-172.7151;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.WorldPosInputsNode;124;-1271.651,764.764;Inherit;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.ViewDirInputsCoordNode;60;-5720.911,-310.0454;Float;True;World;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;120;-645.7218,-505.9521;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RelayNode;26;-4572.299,-545.4812;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SwizzleNode;28;-5278.598,-945.2879;Inherit;False;FLOAT3;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.WorldPosInputsNode;29;-5525.235,-539.9832;Float;True;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;49;-3736.162,-61.83394;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.TexturePropertyNode;127;-1495.626,202.5853;Inherit;True;Property;_CubeMap;CubeMap;19;0;Create;True;0;0;0;False;0;False;None;a7681cfa7ba831944ba3d8ee4f311070;False;white;LockedToCube;Cube;-1;0;2;SAMPLERCUBE;0;SAMPLERSTATE;1 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;31;-5088.497,-635.1635;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SwizzleNode;121;-402.9691,-202.5441;Inherit;False;FLOAT;3;1;2;3;1;0;COLOR;0,0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.WireNode;50;-3224.162,514.1657;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.LerpOp;14;-235.3916,-56.47568;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.BreakToComponentsNode;32;-2620.222,-229.9563;Inherit;False;FLOAT3;1;0;FLOAT3;0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15 +Node;AmplifyShaderEditor.OneMinusNode;41;-3960.162,66.1661;Inherit;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SwizzleNode;33;-3042.936,-123.68;Inherit;False;FLOAT3;0;1;2;3;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;42;-4200.162,-221.8339;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;131;-876.6942,587.5298;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.LerpOp;134;-5422.344,86.40601;Inherit;False;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;93;136.5,-113.1;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Meta;0;4;Meta;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Meta;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;98;136.5,-113.1;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ScenePickingPass;0;9;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;97;136.5,-113.1;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;SceneSelectionPass;0;8;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;91;136.5,-113.1;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ShadowCaster;0;2;ShadowCaster;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=ShadowCaster;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;95;136.5,-113.1;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthNormals;0;6;DepthNormals;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormals;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;94;136.5,-113.1;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Universal2D;0;5;Universal2D;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;90;218.1329,-123.2974;Half;False;True;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;SLZ/ParallaxCubeMap;94348b07e5e8bab40bd6c8a1e3df54cd;True;Forward;0;1;Forward;23;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalForward;False;False;0;Hidden/InternalErrorShader;0;0;Standard;48;Workflow;1;0;Surface;0;0; Refraction Model;0;0; Blend;0;0;Two Sided;1;0;Fragment Normal Space,InvertActionOnDeselection;0;0;Transmission;0;0; Transmission Shadow;0.5,False,-1;0;Translucency;0;0; Translucency Strength;1,False,-1;0; Normal Distortion;0.5,False,-1;0; Scattering;2,False,-1;0; Direct;0.9,False,-1;0; Ambient;0.1,False,-1;0; Shadow;0.5,False,-1;0;Cast Shadows;1;0; Use Shadow Threshold;0;0;Receive Shadows;1;0;GPU Instancing;0;637810008526190890;LOD CrossFade;0;637810008511809681;Built-in Fog;1;0;Lightmaps;1;0;Volumetrics;1;0;Decals;1;0;Screen Space Occlusion;1;0;Reflection Probe Blend/Projection;1;0;Light Layers;1;0;_FinalColorxAlpha;0;0;Meta Pass;1;0;GBuffer Pass;0;0;Override Baked GI;0;0;Extra Pre Pass;0;0;DOTS Instancing;0;0;Tessellation;0;0; Phong;0;0; Strength;0.5,False,-1;0; Type;0;0; Tess;16,False,-1;0; Min;10,False,-1;0; Max;25,False,-1;0; Edge Length;16,False,-1;0; Max Displacement;25,False,-1;0;Write Depth;0;0; Early Z;0;0;Vertex Position,InvertActionOnDeselection;1;0;Debug Display;0;0;Clear Coat;0;0;Fluorescence;0;0;0;10;False;True;True;True;True;True;True;True;True;True;False;;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;96;136.5,-113.1;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;GBuffer;0;7;GBuffer;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalGBuffer;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;89;136.5,-100.1;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ExtraPrePass;0;0;ExtraPrePass;5;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;0;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;92;136.5,-113.1;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthOnly;0;3;DepthOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;False;False;True;1;LightMode=DepthOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +WireConnection;111;0;65;0 +WireConnection;111;3;113;0 +WireConnection;111;4;112;0 +WireConnection;126;0;124;0 +WireConnection;126;1;107;0 +WireConnection;65;0;67;0 +WireConnection;65;1;68;0 +WireConnection;100;1;59;0 +WireConnection;36;0;58;0 +WireConnection;59;0;60;0 +WireConnection;77;5;64;0 +WireConnection;37;0;43;0 +WireConnection;53;0;26;0 +WireConnection;53;1;51;0 +WireConnection;51;0;50;0 +WireConnection;123;0;127;0 +WireConnection;123;1;108;0 +WireConnection;107;0;104;0 +WireConnection;58;0;134;0 +WireConnection;39;0;40;0 +WireConnection;84;5;109;0 +WireConnection;125;0;123;0 +WireConnection;125;1;73;0 +WireConnection;125;2;129;0 +WireConnection;69;0;127;0 +WireConnection;69;1;48;0 +WireConnection;69;2;111;0 +WireConnection;115;0;65;0 +WireConnection;40;0;36;0 +WireConnection;48;0;55;0 +WireConnection;48;1;53;0 +WireConnection;133;0;63;0 +WireConnection;56;0;46;0 +WireConnection;56;1;32;2 +WireConnection;63;0;84;0 +WireConnection;63;1;66;0 +WireConnection;66;0;62;0 +WireConnection;34;0;54;0 +WireConnection;34;1;26;0 +WireConnection;72;0;69;0 +WireConnection;72;1;117;0 +WireConnection;72;2;133;0 +WireConnection;72;3;122;0 +WireConnection;52;0;33;0 +WireConnection;52;1;58;0 +WireConnection;44;0;38;0 +WireConnection;67;0;133;0 +WireConnection;108;0;29;0 +WireConnection;108;1;107;0 +WireConnection;46;0;32;0 +WireConnection;46;1;32;1 +WireConnection;54;0;49;0 +WireConnection;54;1;47;0 +WireConnection;104;0;106;0 +WireConnection;99;1;31;0 +WireConnection;99;0;108;0 +WireConnection;117;0;119;0 +WireConnection;117;1;73;0 +WireConnection;117;2;133;0 +WireConnection;47;0;45;0 +WireConnection;47;1;41;0 +WireConnection;45;0;44;0 +WireConnection;45;1;57;0 +WireConnection;55;0;58;0 +WireConnection;55;1;56;0 +WireConnection;122;0;121;0 +WireConnection;120;0;11;0 +WireConnection;120;1;87;0 +WireConnection;26;0;99;0 +WireConnection;28;0;70;0 +WireConnection;49;0;42;0 +WireConnection;49;1;39;0 +WireConnection;31;0;29;0 +WireConnection;31;1;28;0 +WireConnection;121;0;120;0 +WireConnection;50;0;37;0 +WireConnection;14;1;72;0 +WireConnection;14;2;11;4 +WireConnection;32;0;52;0 +WireConnection;41;0;39;0 +WireConnection;33;0;34;0 +WireConnection;42;0;38;0 +WireConnection;42;1;43;0 +WireConnection;131;0;124;0 +WireConnection;134;0;59;0 +WireConnection;134;1;138;0 +WireConnection;134;2;136;0 +WireConnection;90;0;120;0 +WireConnection;90;1;77;0 +WireConnection;90;2;14;0 +WireConnection;90;20;125;0 +WireConnection;90;3;132;1 +WireConnection;90;4;132;3 +WireConnection;90;5;132;2 +ASEEND*/ +//CHKSM=67DB5F5F8405F44BD607F54FBA3E8C2ABF9DAEC0 \ No newline at end of file diff --git a/Assets/SLZShaders/ParallaxCubeMap.shader.meta b/Assets/SLZShaders/ParallaxCubeMap.shader.meta new file mode 100644 index 0000000..6a3b775 --- /dev/null +++ b/Assets/SLZShaders/ParallaxCubeMap.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 44cd4284ecfc46c4c97f571b3681e0c6 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/SLZ-Laser.shader b/Assets/SLZShaders/SLZ-Laser.shader new file mode 100644 index 0000000..7b88238 --- /dev/null +++ b/Assets/SLZShaders/SLZ-Laser.shader @@ -0,0 +1,2104 @@ +// Made with Amplify Shader Editor +// Available at the Unity Asset Store - http://u3d.as/y3X +Shader "SLZ/Laser" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1) + [ASEBegin]_LaserVector3("_LaserVector3", Vector) = (0,0,1,0) + _UVScaler("UV Scaler", Float) = 1 + [HDR]_Color("Color", Color) = (0,1,0,0) + _3dNoise("3dNoise", 3D) = "white" {} + _uniformfog("uniformfog", Range( 0 , 1)) = 0 + _Intensity("Intensity", Float) = 0 + _OffsetFactor("Offset Factor", Int) = 0 + _OffsetUnits("Offset Units", Int) = 0 + [ASEEnd]_MinIntensitiy("Min Intensitiy", Range( 0 , 1)) = 0.1 + + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5 + //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16 + //_TessMin( "Tess Min Distance", Float ) = 10 + //_TessMax( "Tess Max Distance", Float ) = 25 + //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16 + //_TessMaxDisp( "Tess Max Displacement", Float ) = 25 + } + + SubShader + { + LOD 0 + + + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Transparent" "Queue"="Transparent" } + + Cull Off + AlphaToMask Off + + HLSLINCLUDE + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma target 5.0 + + //#pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + + + #ifndef ASE_TESS_FUNCS + #define ASE_TESS_FUNCS + float4 FixedTess( float tessValue ) + { + return tessValue; + } + + float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos ) + { + float3 wpos = mul(o2w,vertex).xyz; + float dist = distance (wpos, cameraPos); + float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess; + return f; + } + + float4 CalcTriEdgeTessFactors (float3 triVertexFactors) + { + float4 tess; + tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z); + tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z); + tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y); + tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f; + return tess; + } + + float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams ) + { + float dist = distance (0.5 * (wpos0+wpos1), cameraPos); + float len = distance(wpos0, wpos1); + float f = max(len * scParams.y / (edgeLen * dist), 1.0); + return f; + } + + float DistanceFromPlane (float3 pos, float4 plane) + { + float d = dot (float4(pos,1.0f), plane); + return d; + } + + bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] ) + { + float4 planeTest; + planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f ); + return !all (planeTest); + } + + float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos ) + { + float3 f; + f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos); + f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos); + f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos); + + return CalcTriEdgeTessFactors (f); + } + + float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + return tess; + } + + float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + + if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes)) + { + tess = 0.0f; + } + else + { + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + } + return tess; + } + #endif //ASE_TESS_FUNCS + + ENDHLSL + + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForwardOnly" } + + Blend One One, One OneMinusSrcAlpha + ZWrite Off + ZTest LEqual + Offset 0 , 0 + ColorMask RGBA + + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #define ASE_SRP_VERSION 999999 + + + //#pragma multi_compile _ LIGHTMAP_ON + //#pragma multi_compile _ DIRLIGHTMAP_COMBINED + //#pragma shader_feature _ _SAMPLE_GI + //#pragma multi_compile _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + //#pragma multi_compile _ DEBUG_DISPLAY + #define SHADERPASS SHADERPASS_UNLIT + + + #pragma vertex vert + #pragma fragment frag + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/Debugging3D.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceData.hlsl" + + + #define ASE_NEEDS_FRAG_WORLD_POSITION + #define ASE_NEEDS_VERT_NORMAL + #define ASE_NEEDS_FRAG_COLOR + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + float4 ase_color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + #ifdef ASE_FOG + float fogFactor : TEXCOORD2; + #endif + float4 ase_texcoord3 : TEXCOORD3; + float4 ase_color : COLOR; + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + float3 _LaserVector3; + int _OffsetUnits; + int _OffsetFactor; + float _MinIntensitiy; + float _Intensity; + float _uniformfog; + float _UVScaler; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler3D _3dNoise; + + + inline float4 GetScreenNoiseRGBASlice27_g6( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + inline float4 GetScreenNoiseRGBASlice27_g5( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + inline float4 GetScreenNoiseRGBASlice27_g7( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + + VertexOutput VertexFunction ( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + float3 ase_worldNormal = TransformObjectToWorldNormal(v.ase_normal); + o.ase_texcoord4.xyz = ase_worldNormal; + + o.ase_texcoord3.xy = v.ase_texcoord.xy; + o.ase_color = v.ase_color; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord3.zw = 0; + o.ase_texcoord4.w = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + #ifdef ASE_FOG + o.fogFactor = ComputeFogFactor( positionCS.z ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + float4 ase_color : COLOR; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + o.ase_color = v.ase_color; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + o.ase_color = patch[0].ase_color * bary.x + patch[1].ase_color * bary.y + patch[2].ase_color * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag ( VertexOutput IN ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + float3 ase_worldViewDir = ( _WorldSpaceCameraPos.xyz - WorldPosition ); + ase_worldViewDir = normalize(ase_worldViewDir); + float dotResult1 = dot( ase_worldViewDir , _LaserVector3 ); + float clampResult89 = clamp( ( ( dotResult1 + 1.0 ) * 0.5 ) , _MinIntensitiy , 1.0 ); + float2 texCoord103 = IN.ase_texcoord3.xy * float2( 1,1 ) + float2( 0,0 ); + float4 temp_cast_0 = (1.0).xxxx; + float4 lerpResult37 = lerp( ( tex3D( _3dNoise, ( WorldPosition * float3( 0.03333,0.03333,0.03333 ) ) ) * tex3D( _3dNoise, ( WorldPosition * float3( 0.1,0.1,0.1 ) ) ) ) , temp_cast_0 , _uniformfog); + float3 temp_output_135_0 = ( WorldPosition * ( 1.0 / _UVScaler ) ); + float2 temp_output_125_0 = (temp_output_135_0).xy; + float3 ase_worldNormal = IN.ase_texcoord4.xyz; + float3 break137 = abs( ase_worldNormal ); + float temp_output_124_0 = round( break137.y ); + float temp_output_121_0 = ( 1.0 - temp_output_124_0 ); + float temp_output_120_0 = ( round( break137.z ) * temp_output_121_0 ); + float2 temp_output_123_0 = (temp_output_135_0).zy; + float2 temp_output_130_0 = (temp_output_135_0).xz; + float2 temp_output_142_0 = frac( ( ( temp_output_125_0 * temp_output_120_0 ) + ( temp_output_123_0 * ( temp_output_121_0 * ( 1.0 - saturate( temp_output_120_0 ) ) ) ) + ( temp_output_130_0 * temp_output_124_0 ) ) ); + float2 screenUV27_g6 = temp_output_142_0; + float offsetFrame27_g6 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g6 = GetScreenNoiseRGBASlice27_g6( screenUV27_g6 , offsetFrame27_g6 ); + float4 temp_output_109_0_g4 = round( localGetScreenNoiseRGBASlice27_g6 ); + float2 screenUV27_g5 = temp_output_142_0; + float offsetFrame27_g5 = 16.0; + float4 localGetScreenNoiseRGBASlice27_g5 = GetScreenNoiseRGBASlice27_g5( screenUV27_g5 , offsetFrame27_g5 ); + float4 temp_output_156_0 = ( ( temp_output_109_0_g4 * ( 1.0 - ( ( 1.0 - localGetScreenNoiseRGBASlice27_g6 ) * ( 1.0 - localGetScreenNoiseRGBASlice27_g5 ) * 2.0 ) ) ) + ( ( 1.0 - temp_output_109_0_g4 ) * ( localGetScreenNoiseRGBASlice27_g6 * localGetScreenNoiseRGBASlice27_g5 * 2.0 ) ) ); + float4 temp_output_23_0 = ( clampResult89 * _Intensity * ( 1.0 - texCoord103.y ) * IN.ase_color * _Color * lerpResult37 * temp_output_156_0 ); + float2 texCoord162 = IN.ase_texcoord3.xy * float2( 1,1 ) + float2( 0,0 ); + float2 screenUV27_g7 = texCoord162; + float offsetFrame27_g7 = 5.0; + float4 localGetScreenNoiseRGBASlice27_g7 = GetScreenNoiseRGBASlice27_g7( screenUV27_g7 , offsetFrame27_g7 ); + float dotResult157 = dot( temp_output_156_0.x , localGetScreenNoiseRGBASlice27_g7.y ); + + float3 BakedAlbedo = 0; + float3 BakedEmission = 0; + float3 Color = max( ( temp_output_23_0 + ( saturate( (0.0 + (dotResult157 - 0.7) * (1.0 - 0.0) / (1.0 - 0.7)) ) * 5.0 * temp_output_23_0 ) ) , float4( 0,0,0,0 ) ).rgb; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + + #ifdef _ALPHATEST_ON + clip( Alpha - AlphaClipThreshold ); + #endif + + #if defined(_DBUFFER) + ApplyDecalToBaseColor(IN.clipPos, Color); + #endif + + #if defined(_ALPHAPREMULTIPLY_ON) + Color *= Alpha; + #endif + + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_FOG + Color = MixFog( Color, IN.fogFactor ); + #endif + + return half4( Color, Alpha ); + } + + ENDHLSL + } + + + Pass + { + + Name "DepthOnly" + Tags { "LightMode"="DepthOnly" } + + ZWrite On + ColorMask 0 + AlphaToMask Off + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #define ASE_SRP_VERSION 999999 + + + #pragma vertex vert + #pragma fragment frag + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + float3 _LaserVector3; + int _OffsetUnits; + int _OffsetFactor; + float _MinIntensitiy; + float _Intensity; + float _uniformfog; + float _UVScaler; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.clipPos = TransformWorldToHClip( positionWS ); + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = o.clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + return 0; + } + ENDHLSL + } + + + Pass + { + + Name "Universal2D" + Tags { "LightMode"="Universal2D" } + + Blend One One, One OneMinusSrcAlpha + ZWrite Off + ZTest LEqual + Offset 0 , 0 + ColorMask RGBA + + + HLSLPROGRAM +#pragma multi_compile_instancing#define _RECEIVE_SHADOWS_OFF 1#define ASE_SRP_VERSION 999999 +#if FALSE + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma shader_feature _ _SAMPLE_GI + #pragma multi_compile _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile _ DEBUG_DISPLAY + #define SHADERPASS SHADERPASS_UNLIT + + + #pragma vertex vert + #pragma fragment frag + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/Debugging3D.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceData.hlsl" + + + #define ASE_NEEDS_FRAG_WORLD_POSITION + #define ASE_NEEDS_VERT_NORMAL + #define ASE_NEEDS_FRAG_COLOR + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + float4 ase_color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + #ifdef ASE_FOG + float fogFactor : TEXCOORD2; + #endif + float4 ase_texcoord3 : TEXCOORD3; + float4 ase_color : COLOR; + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + float3 _LaserVector3; + int _OffsetUnits; + int _OffsetFactor; + float _MinIntensitiy; + float _Intensity; + float _uniformfog; + float _UVScaler; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler3D _3dNoise; + + + inline float4 GetScreenNoiseRGBASlice27_g6( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + inline float4 GetScreenNoiseRGBASlice27_g5( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + inline float4 GetScreenNoiseRGBASlice27_g7( float2 screenUV, float offsetFrame ) + { + return GetScreenNoiseRGBAOffset(screenUV, offsetFrame); + } + + + VertexOutput VertexFunction ( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + float3 ase_worldNormal = TransformObjectToWorldNormal(v.ase_normal); + o.ase_texcoord4.xyz = ase_worldNormal; + + o.ase_texcoord3.xy = v.ase_texcoord.xy; + o.ase_color = v.ase_color; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord3.zw = 0; + o.ase_texcoord4.w = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + #ifdef ASE_FOG + o.fogFactor = ComputeFogFactor( positionCS.z ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + float4 ase_color : COLOR; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + o.ase_color = v.ase_color; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + o.ase_color = patch[0].ase_color * bary.x + patch[1].ase_color * bary.y + patch[2].ase_color * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag ( VertexOutput IN ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + float3 ase_worldViewDir = ( _WorldSpaceCameraPos.xyz - WorldPosition ); + ase_worldViewDir = normalize(ase_worldViewDir); + float dotResult1 = dot( ase_worldViewDir , _LaserVector3 ); + float clampResult89 = clamp( ( ( dotResult1 + 1.0 ) * 0.5 ) , _MinIntensitiy , 1.0 ); + float2 texCoord103 = IN.ase_texcoord3.xy * float2( 1,1 ) + float2( 0,0 ); + float4 temp_cast_0 = (1.0).xxxx; + float4 lerpResult37 = lerp( ( tex3D( _3dNoise, ( WorldPosition * float3( 0.03333,0.03333,0.03333 ) ) ) * tex3D( _3dNoise, ( WorldPosition * float3( 0.1,0.1,0.1 ) ) ) ) , temp_cast_0 , _uniformfog); + float3 temp_output_135_0 = ( WorldPosition * ( 1.0 / _UVScaler ) ); + float2 temp_output_125_0 = (temp_output_135_0).xy; + float3 ase_worldNormal = IN.ase_texcoord4.xyz; + float3 break137 = abs( ase_worldNormal ); + float temp_output_124_0 = round( break137.y ); + float temp_output_121_0 = ( 1.0 - temp_output_124_0 ); + float temp_output_120_0 = ( round( break137.z ) * temp_output_121_0 ); + float2 temp_output_123_0 = (temp_output_135_0).zy; + float2 temp_output_130_0 = (temp_output_135_0).xz; + float2 temp_output_142_0 = frac( ( ( temp_output_125_0 * temp_output_120_0 ) + ( temp_output_123_0 * ( temp_output_121_0 * ( 1.0 - saturate( temp_output_120_0 ) ) ) ) + ( temp_output_130_0 * temp_output_124_0 ) ) ); + float2 screenUV27_g6 = temp_output_142_0; + float offsetFrame27_g6 = 0.0; + float4 localGetScreenNoiseRGBASlice27_g6 = GetScreenNoiseRGBASlice27_g6( screenUV27_g6 , offsetFrame27_g6 ); + float4 temp_output_109_0_g4 = round( localGetScreenNoiseRGBASlice27_g6 ); + float2 screenUV27_g5 = temp_output_142_0; + float offsetFrame27_g5 = 16.0; + float4 localGetScreenNoiseRGBASlice27_g5 = GetScreenNoiseRGBASlice27_g5( screenUV27_g5 , offsetFrame27_g5 ); + float4 temp_output_156_0 = ( ( temp_output_109_0_g4 * ( 1.0 - ( ( 1.0 - localGetScreenNoiseRGBASlice27_g6 ) * ( 1.0 - localGetScreenNoiseRGBASlice27_g5 ) * 2.0 ) ) ) + ( ( 1.0 - temp_output_109_0_g4 ) * ( localGetScreenNoiseRGBASlice27_g6 * localGetScreenNoiseRGBASlice27_g5 * 2.0 ) ) ); + float4 temp_output_23_0 = ( clampResult89 * _Intensity * ( 1.0 - texCoord103.y ) * IN.ase_color * _Color * lerpResult37 * temp_output_156_0 ); + float2 texCoord162 = IN.ase_texcoord3.xy * float2( 1,1 ) + float2( 0,0 ); + float2 screenUV27_g7 = texCoord162; + float offsetFrame27_g7 = 5.0; + float4 localGetScreenNoiseRGBASlice27_g7 = GetScreenNoiseRGBASlice27_g7( screenUV27_g7 , offsetFrame27_g7 ); + float dotResult157 = dot( temp_output_156_0.x , localGetScreenNoiseRGBASlice27_g7.y ); + + float3 BakedAlbedo = 0; + float3 BakedEmission = 0; + float3 Color = max( ( temp_output_23_0 + ( saturate( (0.0 + (dotResult157 - 0.7) * (1.0 - 0.0) / (1.0 - 0.7)) ) * 5.0 * temp_output_23_0 ) ) , float4( 0,0,0,0 ) ).rgb; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + + #ifdef _ALPHATEST_ON + clip( Alpha - AlphaClipThreshold ); + #endif + + #if defined(_DBUFFER) + ApplyDecalToBaseColor(IN.clipPos, Color); + #endif + + #if defined(_ALPHAPREMULTIPLY_ON) + Color *= Alpha; + #endif + + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_FOG + Color = MixFog( Color, IN.fogFactor ); + #endif + + return half4( Color, Alpha ); + } +#endif + ENDHLSL + } + + + + Pass + { + + Name "SceneSelectionPass" + Tags { "LightMode"="SceneSelectionPass" } + + Cull Off + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #define ASE_SRP_VERSION 999999 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + float3 _LaserVector3; + int _OffsetUnits; + int _OffsetFactor; + float _MinIntensitiy; + float _Intensity; + float _uniformfog; + float _UVScaler; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + int _ObjectId; + int _PassValue; + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if _ALPHATEST_ON + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = half4(_ObjectId, _PassValue, 1.0, 1.0); + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "ScenePickingPass" + Tags { "LightMode"="Picking" } + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #define ASE_SRP_VERSION 999999 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + float3 _LaserVector3; + int _OffsetUnits; + int _OffsetFactor; + float _MinIntensitiy; + float _Intensity; + float _uniformfog; + float _UVScaler; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + + float4 _SelectionID; + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if _ALPHATEST_ON + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = 0; + outColor = _SelectionID; + + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "DepthNormals" + Tags { "LightMode"="DepthNormalsOnly" } + + ZTest LEqual + ZWrite On + + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #define ASE_SRP_VERSION 999999 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma multi_compile_fog + #pragma instancing_options renderinglayer + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define VARYINGS_NEED_NORMAL_WS + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float3 normalWS : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + float3 _LaserVector3; + int _OffsetUnits; + int _OffsetFactor; + float _MinIntensitiy; + float _Intensity; + float _uniformfog; + float _UVScaler; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal(v.ase_normal); + + o.clipPos = TransformWorldToHClip(positionWS); + o.normalWS.xyz = normalWS; + + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + #if _ALPHATEST_ON + clip(surfaceDescription.Alpha - surfaceDescription.AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + float3 normalWS = IN.normalWS; + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + + } + + ENDHLSL + } + + + Pass + { + + Name "DepthNormalsOnly" + Tags { "LightMode"="DepthNormalsOnly" } + + ZTest LEqual + ZWrite On + + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #define ASE_SRP_VERSION 999999 + + + #pragma exclude_renderers glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define ATTRIBUTES_NEED_TEXCOORD1 + #define VARYINGS_NEED_NORMAL_WS + #define VARYINGS_NEED_TANGENT_WS + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float3 normalWS : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + float3 _LaserVector3; + int _OffsetUnits; + int _OffsetFactor; + float _MinIntensitiy; + float _Intensity; + float _uniformfog; + float _UVScaler; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal(v.ase_normal); + + o.clipPos = TransformWorldToHClip(positionWS); + o.normalWS.xyz = normalWS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + #if _ALPHATEST_ON + clip(surfaceDescription.Alpha - surfaceDescription.AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + float3 normalWS = IN.normalWS; + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + + } + + ENDHLSL + } + + } + + CustomEditor "UnityEditor.ShaderGraphUnlitGUI" + Fallback "Hidden/InternalErrorShader" + +} +/*ASEBEGIN +Version=18935 +377;844;1538;1003;670.3203;-409.0567;1.6;True;True +Node;AmplifyShaderEditor.Vector3Node;9;-765.0245,77.5334;Float;False;Property;_LaserVector3;_LaserVector3;0;0;Create;True;0;0;0;False;0;False;0,0,1;1,0,0;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.OneMinusNode;122;-1204.418,1552.119;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.Vector3Node;102;-1879.106,-20.05547;Float;False;Constant;_Vector0;Vector 0;11;0;Create;True;0;0;0;False;0;False;-1.39,1.89,-4.4;0,0,0;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.RangedFloatNode;45;560.0096,-50.04142;Float;False;Property;_Intensity;Intensity;8;0;Create;True;0;0;0;False;0;False;0;1;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;22;530.4923,-210.9589;Float;False;Property;_Color;Color;4;1;[HDR];Create;True;0;0;0;False;0;False;0,1,0,0;0,4,0,0;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.CustomExpressionNode;165;394.6825,1407.596;Inherit;False;GetScreenNoiseRGBASlice(screenUV, offsetFrame);4;Create;2;True;screenUV;FLOAT2;0,0;In;;Inherit;False;True;offsetFrame;INT;0;In;;Inherit;False;GetScreenNoiseRGBASlice;True;False;0;;False;2;0;FLOAT2;0,0;False;1;INT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;35;95.97842,573.3421;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0.1,0.1,0.1;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.ColorNode;40;698.3932,372.058;Float;False;Property;_Color0;Color 0;5;0;Create;True;0;0;0;False;0;False;1,1,1,0;0,0,0,0;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleAddOpNode;85;-508.457,-465.3818;Inherit;True;2;2;0;FLOAT;0;False;1;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.GrabScreenPosition;164;-67.04134,1401.693;Inherit;False;0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SaturateNode;171;1129.72,836.4105;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;52;-993.6301,562.3286;Inherit;True;Property;_TextureSample1;Texture Sample 1;10;0;Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;90;-4.755432,-572.984;Float;False;Property;_MinIntensitiy;Min Intensitiy;11;0;Create;True;0;0;0;False;0;False;0.1;0.2;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;54;-1727.448,538.7517;Inherit;True;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.IntNode;50;1560.539,244.4031;Float;False;Property;_OffsetUnits;Offset Units;10;0;Create;True;0;0;0;True;0;False;0;-2;False;0;1;INT;0 +Node;AmplifyShaderEditor.PosFromTransformMatrix;93;-2172.11,95.77969;Inherit;False;1;0;FLOAT4x4;1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;False;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.MMatrixNode;98;-2336.583,24.22546;Inherit;False;0;1;FLOAT4x4;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;43;42.39294,370.058;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0.03333,0.03333,0.03333;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;120;-1642.112,1599.559;Inherit;True;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.OneMinusNode;104;-1346.772,-27.76767;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.DotProductOpNode;157;800.3277,1176.545;Inherit;True;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.DistanceOpNode;91;195.7296,-44.93008;Inherit;False;2;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.IntNode;166;295.2147,1532.956;Inherit;False;Constant;_Int0;Int 0;12;0;Create;True;0;0;0;False;0;False;3;0;False;0;1;INT;0 +Node;AmplifyShaderEditor.RangedFloatNode;180;205.533,1323.583;Inherit;False;Constant;_Float4;Float 4;12;0;Create;True;0;0;0;False;0;False;5;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;159;1332.303,500.0184;Inherit;False;3;3;0;FLOAT;0;False;1;FLOAT;2;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.OneMinusNode;121;-1864.501,1378.288;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RoundOpNode;118;-1868.552,1599.387;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RoundOpNode;124;-2066.102,1309.488;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;179;-9.467041,1027.583;Inherit;False;Constant;_Float3;Float 3;12;0;Create;True;0;0;0;False;0;False;16;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;117;-1007.621,1520.427;Inherit;True;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;103;-1597.772,-42.76767;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.IntNode;49;1545.539,162.4031;Float;False;Property;_OffsetFactor;Offset Factor;9;0;Create;True;0;0;0;True;0;False;0;-2;False;0;1;INT;0 +Node;AmplifyShaderEditor.BreakToComponentsNode;168;800.8196,948.2106;Inherit;False;FLOAT4;1;0;FLOAT4;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15 +Node;AmplifyShaderEditor.TexturePropertyNode;33;-55.02156,164.3421;Float;True;Property;_3dNoise;3dNoise;6;0;Create;True;0;0;0;False;0;False;None;6b8eb3f2e6fc9e84ab5b30e166fbe3d6;False;white;LockedToTexture3D;Texture3D;-1;0;2;SAMPLER3D;0;SAMPLERSTATE;1 +Node;AmplifyShaderEditor.RangedFloatNode;21;-2019.661,395.1832;Float;False;Property;_Tiling;Tiling;1;0;Create;True;0;0;0;False;0;False;1;9.96;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;23;975.9696,-43.11742;Inherit;True;7;7;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;COLOR;0,0,0,0;False;4;COLOR;0,0,0,0;False;5;COLOR;0,0,0,0;False;6;FLOAT4;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RelayNode;97;-1410.073,125.6048;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;169;1133.62,646.6105;Inherit;False;Constant;_Float2;Float 2;12;0;Create;True;0;0;0;False;0;False;5;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMaxOpNode;46;1542.521,-45.1845;Inherit;False;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.ViewDirInputsCoordNode;2;-948.9164,-342.8629;Float;False;World;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.LerpOp;37;964.8276,226.9459;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.TriplanarNode;19;-949.024,223.5334;Inherit;True;Spherical;World;False;Top Texture 0;_TopTexture0;gray;-1;None;Mid Texture 0;_MidTexture0;white;-1;None;Bot Texture 0;_BotTexture0;white;-1;None;Triplanar Sampler;Tangent;10;0;SAMPLER2D;;False;5;FLOAT;1;False;1;SAMPLER2D;;False;6;FLOAT;0;False;2;SAMPLER2D;;False;7;FLOAT;0;False;9;FLOAT3;0,0,0;False;8;FLOAT;1;False;3;FLOAT;1;False;4;FLOAT;0;False;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMaxOpNode;175;-615.0266,1564.239;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;161;-125.2971,1209.448;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.BreakToComponentsNode;172;623.0201,1354.51;Inherit;False;FLOAT4;1;0;FLOAT4;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15 +Node;AmplifyShaderEditor.ClampOpNode;89;92.98236,-396.4216;Inherit;True;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SwizzleNode;163;174.9157,1399.383;Inherit;False;FLOAT2;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.CustomExpressionNode;173;244.9269,1051.231;Inherit;False;GetScreenNoiseRGBASlice(screenUV, offsetFrame);4;Create;2;True;screenUV;FLOAT2;0,0;In;;Inherit;False;True;offsetFrame;INT;0;In;;Inherit;False;GetScreenNoiseRGBASlice;True;False;0;;False;2;0;FLOAT2;0,0;False;1;INT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.RangedFloatNode;42;786.3932,583.058;Float;False;Constant;_Float0;Float 0;6;0;Create;True;0;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.FunctionNode;160;333.9028,1204.648;Inherit;False;Global Blue Noise Sample;-1;;7;bac712bbbce65c14c9d4cbc808f3d0e0;0;2;8;FLOAT2;0,0;False;10;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.FunctionNode;156;581.4297,789.1207;Inherit;False;Overlay Blend;-1;;4;3987f7f74cd16f24eab3a89e587abb46;0;2;1;FLOAT4;1,1,1,1;False;2;FLOAT4;0.5,0.5,0.5,0.5019608;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.DotProductOpNode;1;-729.9703,-305.5392;Inherit;True;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.DistanceOpNode;95;-1838.11,144.7797;Inherit;True;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ObjectToWorldMatrixNode;94;-2491.452,72.9053;Inherit;False;0;1;FLOAT4x4;0 +Node;AmplifyShaderEditor.SamplerNode;34;261.9786,495.3421;Inherit;True;Property;_TextureSample0;Texture Sample 0;4;0;Create;True;0;0;0;False;0;False;-1;None;None;True;1;False;white;LockedToTexture3D;False;Instance;-1;Auto;Texture3D;8;0;SAMPLER3D;;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT3;0,0,0;False;4;FLOAT3;0,0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;38;688.7901,228.2423;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;133;-486.1653,1029.578;Inherit;True;3;3;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.RangedFloatNode;41;987.3932,501.058;Float;False;Property;_uniformfog;uniformfog;7;0;Create;True;0;0;0;False;0;False;0;0.13;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.FractNode;96;-1592.11,108.7797;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.VectorFromMatrixNode;101;-2138.085,-28.02408;Inherit;False;Row;3;1;0;FLOAT4x4;1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;False;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.VertexColorNode;48;565.2511,41.31428;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.FractNode;64;-1438.407,604.4266;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SamplerNode;26;264.9662,277.1747;Inherit;True;Property;_VLB_NoiseTex3D;_VLB_NoiseTex3D;4;0;Create;True;0;0;0;False;0;False;-1;None;None;True;1;False;white;LockedToTexture3D;False;Instance;-1;Auto;Texture3D;8;0;SAMPLER3D;;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT3;0,0,0;False;4;FLOAT3;0,0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.TFHCRemapNode;167;1073.953,1109.311;Inherit;True;5;0;FLOAT;0;False;1;FLOAT;0.7;False;2;FLOAT;1;False;3;FLOAT;0;False;4;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TexturePropertyNode;20;-1409.024,223.5334;Float;True;Property;_Noise;Noise;3;0;Create;True;0;0;0;False;0;False;None;None;False;gray;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1 +Node;AmplifyShaderEditor.WorldPosInputsNode;53;-2453.63,395.3286;Float;True;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SwizzleNode;130;-1343.046,1240.307;Inherit;True;FLOAT2;0;2;2;3;1;0;FLOAT3;0,0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleMaxOpNode;176;-652.7266,1670.839;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.FunctionNode;155;251.5327,903.8068;Inherit;False;Global Blue Noise Sample;-1;;5;bac712bbbce65c14c9d4cbc808f3d0e0;0;2;8;FLOAT2;0,0;False;10;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.WorldPosInputsNode;31;-190.0337,397.1747;Float;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SimpleAddOpNode;170;1353.32,47.31042;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;162;34.70332,1203.048;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;135;-1600.812,1020.039;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.WorldToObjectMatrix;99;-2446.205,200.4091;Inherit;False;0;1;FLOAT4x4;0 +Node;AmplifyShaderEditor.BreakToComponentsNode;137;-2400,1335.081;Inherit;True;FLOAT3;1;0;FLOAT3;0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15 +Node;AmplifyShaderEditor.SimpleDivideOpNode;116;-1754.299,880.9258;Inherit;False;2;0;FLOAT;1;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;127;-1934.299,874.9258;Inherit;False;Property;_UVScaler;UV Scaler;2;0;Create;True;0;0;0;False;0;False;1;0.3;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SaturateNode;178;-1318.326,1668.238;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.AbsOpNode;126;-2612.519,1312.915;Inherit;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.WorldPosInputsNode;128;-1940.448,1017.181;Inherit;True;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.WorldNormalVector;115;-2914.623,1308.964;Inherit;True;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;134;-753.3325,1252.033;Inherit;True;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;129;-754.0272,1023.592;Inherit;True;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.FunctionNode;143;239.9672,784.9895;Inherit;False;Global Blue Noise Sample;-1;;6;bac712bbbce65c14c9d4cbc808f3d0e0;0;2;8;FLOAT2;0,0;False;10;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.FractNode;142;-224.2212,1032.899;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SwizzleNode;123;-1353.046,1021.607;Inherit;True;FLOAT2;2;1;2;3;1;0;FLOAT3;0,0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SwizzleNode;125;-1349.146,788.5071;Inherit;True;FLOAT2;0;1;2;3;1;0;FLOAT3;0,0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;86;-244.457,-467.3818;Inherit;True;2;2;0;FLOAT;0;False;1;FLOAT;0.5;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;138;-755.5521,805.4412;Inherit;True;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;146;1979.189,-117.194;Half;False;True;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;3;SLZ/Laser;2992e84f91cbeb14eab234972e07ea9d;True;Forward;0;1;Forward;8;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Transparent=RenderType;Queue=Transparent=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;1;False;-1;1;1;False;-1;10;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;2;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;1;LightMode=UniversalForwardOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;22;Surface;1;637976943672417564; Blend;2;637976943711661604;Two Sided;0;637976943747624774;Cast Shadows;0;637976943682889326; Use Shadow Threshold;0;0;Receive Shadows;0;637976943691446800;GPU Instancing;1;0;LOD CrossFade;0;0;Built-in Fog;0;0;DOTS Instancing;0;0;Meta Pass;0;0;Extra Pre Pass;0;0;Tessellation;0;0; Phong;0;0; Strength;0.5,False,-1;0; Type;0;0; Tess;16,False,-1;0; Min;10,False,-1;0; Max;25,False,-1;0; Edge Length;16,False,-1;0; Max Displacement;25,False,-1;0;Vertex Position,InvertActionOnDeselection;1;0;0;10;False;True;False;True;False;True;True;True;True;True;False;;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;148;1979.189,-117.194;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;DepthOnly;0;3;DepthOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;False;False;True;1;LightMode=DepthOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;153;1979.189,-117.194;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;DepthNormals;0;8;DepthNormals;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormalsOnly;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;151;1979.189,-117.194;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;SceneSelectionPass;0;6;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;152;1979.189,-117.194;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;ScenePickingPass;0;7;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;145;1979.189,-117.194;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;ExtraPrePass;0;0;ExtraPrePass;5;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;0;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;154;1979.189,-117.194;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;DepthNormalsOnly;0;9;DepthNormalsOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormalsOnly;False;True;15;d3d9;d3d11_9x;d3d11;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;149;1979.189,-117.194;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;Meta;0;4;Meta;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Meta;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;147;1979.189,-117.194;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;ShadowCaster;0;2;ShadowCaster;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=ShadowCaster;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;150;1979.189,-117.194;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;Universal2D;0;5;Universal2D;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;1;False;-1;1;1;False;-1;10;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;2;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +WireConnection;122;0;178;0 +WireConnection;165;0;142;0 +WireConnection;165;1;166;0 +WireConnection;35;0;31;0 +WireConnection;85;0;1;0 +WireConnection;171;0;167;0 +WireConnection;52;0;20;0 +WireConnection;54;0;53;0 +WireConnection;54;1;21;0 +WireConnection;93;0;99;0 +WireConnection;43;0;31;0 +WireConnection;120;0;118;0 +WireConnection;120;1;121;0 +WireConnection;104;0;103;2 +WireConnection;157;0;168;0 +WireConnection;157;1;172;1 +WireConnection;159;0;171;0 +WireConnection;159;1;169;0 +WireConnection;159;2;23;0 +WireConnection;121;0;124;0 +WireConnection;118;0;137;2 +WireConnection;124;0;137;1 +WireConnection;117;0;121;0 +WireConnection;117;1;122;0 +WireConnection;168;0;156;0 +WireConnection;23;0;89;0 +WireConnection;23;1;45;0 +WireConnection;23;2;97;0 +WireConnection;23;3;48;0 +WireConnection;23;4;22;0 +WireConnection;23;5;37;0 +WireConnection;23;6;156;0 +WireConnection;97;0;104;0 +WireConnection;46;0;170;0 +WireConnection;37;0;38;0 +WireConnection;37;1;42;0 +WireConnection;37;2;41;0 +WireConnection;19;0;20;0 +WireConnection;19;3;21;0 +WireConnection;175;0;125;0 +WireConnection;175;1;123;0 +WireConnection;172;0;160;0 +WireConnection;89;0;86;0 +WireConnection;89;1;90;0 +WireConnection;163;0;164;0 +WireConnection;173;0;142;0 +WireConnection;160;8;162;0 +WireConnection;160;10;180;0 +WireConnection;156;1;143;0 +WireConnection;156;2;155;0 +WireConnection;1;0;2;0 +WireConnection;1;1;9;0 +WireConnection;95;0;102;0 +WireConnection;95;1;53;0 +WireConnection;34;0;33;0 +WireConnection;34;1;35;0 +WireConnection;38;0;26;0 +WireConnection;38;1;34;0 +WireConnection;133;0;138;0 +WireConnection;133;1;129;0 +WireConnection;133;2;134;0 +WireConnection;96;0;95;0 +WireConnection;101;0;98;0 +WireConnection;64;0;54;0 +WireConnection;26;0;33;0 +WireConnection;26;1;43;0 +WireConnection;167;0;157;0 +WireConnection;130;0;135;0 +WireConnection;176;0;130;0 +WireConnection;176;1;175;0 +WireConnection;155;8;142;0 +WireConnection;155;10;179;0 +WireConnection;170;0;23;0 +WireConnection;170;1;159;0 +WireConnection;135;0;128;0 +WireConnection;135;1;116;0 +WireConnection;137;0;126;0 +WireConnection;116;1;127;0 +WireConnection;178;0;120;0 +WireConnection;126;0;115;0 +WireConnection;134;0;130;0 +WireConnection;134;1;124;0 +WireConnection;129;0;123;0 +WireConnection;129;1;117;0 +WireConnection;143;8;142;0 +WireConnection;142;0;133;0 +WireConnection;123;0;135;0 +WireConnection;125;0;135;0 +WireConnection;86;0;85;0 +WireConnection;138;0;125;0 +WireConnection;138;1;120;0 +WireConnection;146;2;46;0 +ASEEND*/ +//CHKSM=FE74AF0220BCC755569F07C8FCC60E8253195F46 \ No newline at end of file diff --git a/Assets/SLZShaders/SLZ-Laser.shader.meta b/Assets/SLZShaders/SLZ-Laser.shader.meta new file mode 100644 index 0000000..610754f --- /dev/null +++ b/Assets/SLZShaders/SLZ-Laser.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f05a5c6a2a705054d8547ebd87b58073 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/SLZAnime.shader b/Assets/SLZShaders/SLZAnime.shader new file mode 100644 index 0000000..6d423bf --- /dev/null +++ b/Assets/SLZShaders/SLZAnime.shader @@ -0,0 +1,2573 @@ +// Made with Amplify Shader Editor +// Available at the Unity Asset Store - http://u3d.as/y3X +Shader "SLZ/Anime" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1) + [ASEBegin]_BaseMap("Base Map", 2D) = "white" {} + [NoScaleOffset]g_tBRDFMap("BRDF map", 2D) = "white" {} + [HideInInspector][Toggle(_BRDFMAP)] BRDFMAP1("Enable BRDF map", Float) = 1 + [HideInInspector][Toggle(ANIME)] ANIME("ANIME", Float) = 1 + [NoScaleOffset][SingleLineTexture]_MetallicGlossMap("MAS", 2D) = "white" {} + [HDR]_OutlineColor("Outline Color", Color) = (0.5,0.5,0.5,0) + _BumpMap("Bump Map", 2D) = "bump" {} + _Color("Color", Color) = (1,1,1,1) + _OutlineSize("Outline Size", Float) = 5 + [ASEEnd]_OutlineClamp("Outline Clamp", Float) = 10 + [HideInInspector] _texcoord( "", 2D ) = "white" {} + + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + //_TransmissionShadow( "Transmission Shadow", Range( 0, 1 ) ) = 0.5 + //_TransStrength( "Trans Strength", Range( 0, 50 ) ) = 1 + //_TransNormal( "Trans Normal Distortion", Range( 0, 1 ) ) = 0.5 + //_TransScattering( "Trans Scattering", Range( 1, 50 ) ) = 2 + //_TransDirect( "Trans Direct", Range( 0, 1 ) ) = 0.9 + //_TransAmbient( "Trans Ambient", Range( 0, 1 ) ) = 0.1 + //_TransShadow( "Trans Shadow", Range( 0, 1 ) ) = 0.5 + //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5 + //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16 + //_TessMin( "Tess Min Distance", Float ) = 10 + //_TessMax( "Tess Max Distance", Float ) = 25 + //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16 + //_TessMaxDisp( "Tess Max Displacement", Float ) = 25 + } + + SubShader + { + LOD 0 + + + + + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Opaque" "Queue"="Geometry" } + Cull Back + ZWrite On + ZTest LEqual + Offset 0,0 + AlphaToMask Off + + HLSLINCLUDE + #pragma target 4.0 + + #pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + + #ifndef ASE_TESS_FUNCS + #define ASE_TESS_FUNCS + float4 FixedTess( float tessValue ) + { + return tessValue; + } + + float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos ) + { + float3 wpos = mul(o2w,vertex).xyz; + float dist = distance (wpos, cameraPos); + float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess; + return f; + } + + float4 CalcTriEdgeTessFactors (float3 triVertexFactors) + { + float4 tess; + tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z); + tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z); + tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y); + tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f; + return tess; + } + + float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams ) + { + float dist = distance (0.5 * (wpos0+wpos1), cameraPos); + float len = distance(wpos0, wpos1); + float f = max(len * scParams.y / (edgeLen * dist), 1.0); + return f; + } + + float DistanceFromPlane (float3 pos, float4 plane) + { + float d = dot (float4(pos,1.0f), plane); + return d; + } + + bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] ) + { + float4 planeTest; + planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f ); + return !all (planeTest); + } + + float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos ) + { + float3 f; + f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos); + f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos); + f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos); + + return CalcTriEdgeTessFactors (f); + } + + float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + return tess; + } + + float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + + if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes)) + { + tess = 0.0f; + } + else + { + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + } + return tess; + } + #endif //ASE_TESS_FUNCS + + ENDHLSL + + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForward" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_FORWARD + + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + + #define ASE_NEEDS_FRAG_WORLD_NORMAL + #define ASE_NEEDS_FRAG_WORLD_VIEW_DIR + #pragma shader_feature_local ANIME + #pragma shader_feature_local _BRDFMAP + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DefaultLitVariants.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_texcoord8 : TEXCOORD8; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _Color; + float4 _OutlineColor; + float4 _BumpMap_ST; + float _OutlineSize; + float _OutlineClamp; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + TEXTURE2D(_BumpMap); + SAMPLER(sampler_BumpMap); + TEXTURE2D(_MetallicGlossMap); + SAMPLER(sampler_MetallicGlossMap); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord8.xy = v.texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + #if defined(LIGHTMAP_ON) + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + #if !defined(LIGHTMAP_ON) + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + #endif + + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) || defined(ASE_TERRAIN_INSTANCING) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float2 uv_BaseMap = IN.ase_texcoord8.xy * _BaseMap_ST.xy + _BaseMap_ST.zw; + float4 temp_output_109_0_g2 = round( ( SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ) * _Color ) ); + float dotResult19 = dot( WorldNormal , WorldViewDirection ); + float4 lerpResult22 = lerp( ( ( temp_output_109_0_g2 * ( 1.0 - ( ( 1.0 - ( SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ) * _Color ) ) * ( 1.0 - _OutlineColor ) * 2.0 ) ) ) + ( ( 1.0 - temp_output_109_0_g2 ) * ( ( SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ) * _Color ) * _OutlineColor * 2.0 ) ) ) , ( SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ) * _Color ) , saturate( ( pow( dotResult19 , _OutlineSize ) * _OutlineClamp ) )); + + float2 uv_BumpMap = IN.ase_texcoord8.xy * _BumpMap_ST.xy + _BumpMap_ST.zw; + + float2 uv_MetallicGlossMap56 = IN.ase_texcoord8.xy; + float4 tex2DNode56 = SAMPLE_TEXTURE2D( _MetallicGlossMap, sampler_MetallicGlossMap, uv_MetallicGlossMap56 ); + + float3 Albedo = lerpResult22.rgb; + float3 Normal = UnpackNormalScale( SAMPLE_TEXTURE2D_BIAS( _BumpMap, sampler_BumpMap, uv_BumpMap, 0.0 ), 1.0f ); + float3 Emission = 0; +#if 0 + float3 BakedEmission = 0; +#endif + float3 Specular = 0.5; + float Metallic = tex2DNode56.r; + float Smoothness = tex2DNode56.b; + float Occlusion = tex2DNode56.g; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _CLEARCOAT + float CoatMask = 0; + float CoatSmoothness = 0; + #endif + + #if defined(_FLUORESCENCE) + float4 Fluorescence = 0; + float4 Absorbance = 0; + #endif + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.viewDirectionWS = WorldViewDirection; + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + #else + inputData.normalWS = WorldNormal; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + inputData.shadowCoord = ShadowCoords; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + inputData.shadowCoord = TransformWorldToShadowCoord(inputData.positionWS); + #else + inputData.shadowCoord = float4(0, 0, 0, 0); + #endif + + + #ifdef ASE_FOG + inputData.fogCoord = IN.fogFactorAndVertexLight.x; + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzww; //TODO: Shuffle things in vertex streams so we get full RGBA color rather than RGBB here + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xyz, IN.dynamicLightmapUV.xy, IN.vertexSH, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI(IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, IN.vertexSH , inputData.normalWS); + #endif + + #else + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + #endif + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + SurfaceData surfaceData; + surfaceData.albedo = Albedo; + surfaceData.metallic = saturate(Metallic); + surfaceData.specular = Specular; + surfaceData.smoothness = saturate(Smoothness), + surfaceData.occlusion = Occlusion, + surfaceData.emission = Emission, + surfaceData.alpha = saturate(Alpha); + surfaceData.normalTS = Normal; + surfaceData.clearCoatMask = 0; + surfaceData.clearCoatSmoothness = 1; + + #ifdef _CLEARCOAT + surfaceData.clearCoatMask = saturate(CoatMask); + surfaceData.clearCoatSmoothness = saturate(CoatSmoothness); + #endif + #if defined(_FLUORESCENCE) + surfaceData.fluorescence = Fluorescence; + surfaceData.absorbance = Absorbance; + #endif + + #ifdef _DBUFFER + ApplyDecalToSurfaceData(IN.clipPos, surfaceData, inputData); + #endif + + half4 color = UniversalFragmentPBR( inputData, surfaceData); + + #ifdef LIGHTMAP_ON + float3 MetalSpec = lerp(kDieletricSpec.rgb, surfaceData.albedo , surfaceData.metallic); + color.rgb += BakedSpecular * surfaceData.occlusion * MetalSpec * inputData.bakedGI.rgb; + #endif + + #ifdef _TRANSMISSION_ASE + { + float shadow = _TransmissionShadow; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + half3 mainTransmission = max(0 , -dot(inputData.normalWS, mainLight.direction)) * mainAtten * Transmission; + color.rgb += Albedo * mainTransmission; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 transmission = max(0 , -dot(inputData.normalWS, light.direction)) * atten * Transmission; + color.rgb += Albedo * transmission; + } + #endif + } + #endif + + #ifdef _TRANSLUCENCY_ASE + { + float shadow = _TransShadow; + float normal = _TransNormal; + float scattering = _TransScattering; + float direct = _TransDirect; + float ambient = _TransAmbient; + float strength = _TransStrength; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + + half3 mainLightDir = mainLight.direction + inputData.normalWS * normal; + half mainVdotL = pow( saturate( dot( inputData.viewDirectionWS, -mainLightDir ) ), scattering ); + half3 mainTranslucency = mainAtten * ( mainVdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * mainTranslucency * strength; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 lightDir = light.direction + inputData.normalWS * normal; + half VdotL = pow( saturate( dot( inputData.viewDirectionWS, -lightDir ) ), scattering ); + half3 translucency = atten * ( VdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * translucency * strength; + } + #endif + } + #endif + + #ifdef _REFRACTION_ASE + float4 projScreenPos = ScreenPos / ScreenPos.w; + float3 refractionOffset = ( RefractionIndex - 1.0 ) * mul( UNITY_MATRIX_V, float4( WorldNormal,0 ) ).xyz * ( 1.0 - dot( WorldNormal, WorldViewDirection ) ); + projScreenPos.xy += refractionOffset.xy; + float3 refraction = SHADERGRAPH_SAMPLE_SCENE_COLOR( projScreenPos.xy ) * RefractionColor; + color.rgb = lerp( refraction, color.rgb, color.a ); + color.a = 1; + #endif + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, -inputData.viewDirectionWS, IN.fogFactorAndVertexLight.x); + #endif + #endif + + color = Volumetrics( color, inputData.positionWS); + + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return color; + } + + ENDHLSL + } + + + Pass + { + + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + + ZWrite On + ZTest LEqual + AlphaToMask Off + ColorMask 0 + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #pragma multi_compile _ _CASTING_PUNCTUAL_LIGHT_SHADOW + + #define SHADERPASS SHADERPASS_SHADOWCASTER + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #pragma shader_feature_local ANIME + #pragma shader_feature_local _BRDFMAP + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _Color; + float4 _OutlineColor; + float4 _BumpMap_ST; + float _OutlineSize; + float _OutlineClamp; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + float3 _LightDirection; + float3 _LightPosition; + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + + float3 normalWS = TransformObjectToWorldDir(v.ase_normal); + + + #if _CASTING_PUNCTUAL_LIGHT_SHADOW + float3 lightDirectionWS = normalize(_LightPosition - positionWS); + #else + float3 lightDirectionWS = _LightDirection; + #endif + float2 vShadowOffsets = GetShadowOffsets( normalWS, lightDirectionWS ); + positionWS.xyz -= vShadowOffsets.y * lightDirectionWS.xyz * .01; + float4 clipPos = TransformObjectToHClip( float4( mul( unity_WorldToObject, float4( positionWS.xyz, 1.0 ) ).xyz, 1.0 ) ); + //float4 clipPos = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, lightDirectionWS)); + + #if UNITY_REVERSED_Z + clipPos.z = min(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #else + clipPos.z = max(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #endif + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = clipPos; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + #ifdef _ALPHATEST_SHADOW_ON + clip(Alpha - AlphaClipThresholdShadow); + #else + clip(Alpha - AlphaClipThreshold); + #endif + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + return 0; + } + + ENDHLSL + } + + + Pass + { + + Name "DepthOnly" + Tags { "LightMode"="DepthOnly" } + + ZWrite On + ColorMask 0 + AlphaToMask Off + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #pragma shader_feature_local ANIME + #pragma shader_feature_local _BRDFMAP + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _Color; + float4 _OutlineColor; + float4 _BumpMap_ST; + float _OutlineSize; + float _OutlineClamp; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return 0; + } + ENDHLSL + } + + /*ase_pass*/ + Pass + { + + Name "Universal2D" + Tags{"LightMode" = "Universal2D"} + + Blend One Zero + ColorMask RGBA + + HLSLPROGRAM + + /*ase_pragma_before*/ + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_2D + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + /*ase_pragma*/ + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + /*ase_vdata:p=p;n=n*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + /*ase_interp(2,):sp=sp;wp=tc0;sc=tc1*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + /*ase_srp_batcher*/ + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + /*ase_globals*/ + + /*ase_funcs*/ + + VertexOutput VertexFunction( VertexInput v /*ase_vert_input*/ ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID( v ); + UNITY_TRANSFER_INSTANCE_ID( v, o ); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + /*ase_vert_code:v=VertexInput;o=VertexOutput*/ + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = /*ase_vert_out:Vertex Offset;Float3;3;-1;_Vertex*/defaultVertexValue/*end*/; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = /*ase_vert_out:Vertex Normal;Float3;4;-1;_Normal*/v.ase_normal/*end*/; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + /*ase_vcontrol*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + /*ase_control_code:v=VertexInput;o=VertexControl*/ + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + /*ase_domain_code:patch=VertexControl;o=VertexInput;bary=SV_DomainLocation*/ + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN /*ase_frag_input*/ ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + /*ase_frag_code:IN=VertexOutput*/ + + float3 Albedo = /*ase_frag_out:Albedo;Float3;0;-1;_Albedo*/float3(0.5, 0.5, 0.5)/*end*/; + float Alpha = /*ase_frag_out:Alpha;Float;1;-1;_Alpha*/1/*end*/; + float AlphaClipThreshold = /*ase_frag_out:Alpha Clip Threshold;Float;2;-1;_AlphaClip*/0.5/*end*/; + + half4 color = half4( Albedo, Alpha ); + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + return color; + } + ENDHLSL + } + + + Pass + { + + Name "DepthNormals" + Tags { "LightMode"="DepthNormals" } + + ZWrite On + Blend One Zero + ZTest LEqual + ZWrite On + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + + #pragma shader_feature_local ANIME + #pragma shader_feature_local _BRDFMAP + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float3 worldNormal : TEXCOORD2; + float4 worldTangent : TEXCOORD3; + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _Color; + float4 _OutlineColor; + float4 _BumpMap_ST; + float _OutlineSize; + float _OutlineClamp; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BumpMap); + SAMPLER(sampler_BumpMap); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord4.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal( v.ase_normal ); + float4 tangentWS = float4(TransformObjectToWorldDir( v.ase_tangent.xyz), v.ase_tangent.w); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.worldNormal = normalWS; + o.worldTangent = tangentWS; + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + float3 WorldNormal = IN.worldNormal; + float4 WorldTangent = IN.worldTangent; + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 uv_BumpMap = IN.ase_texcoord4.xy * _BumpMap_ST.xy + _BumpMap_ST.zw; + + float3 Normal = UnpackNormalScale( SAMPLE_TEXTURE2D_BIAS( _BumpMap, sampler_BumpMap, uv_BumpMap, 0.0 ), 1.0f ); + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + #if defined(_GBUFFER_NORMALS_OCT) + float2 octNormalWS = PackNormalOctQuadEncode(WorldNormal); + float2 remappedOctNormalWS = saturate(octNormalWS * 0.5 + 0.5); + half3 packedNormalWS = PackFloat2To888(remappedOctNormalWS); + return half4(packedNormalWS, 0.0); + #else + + #if defined(_NORMALMAP) + #if _NORMAL_DROPOFF_TS + float crossSign = (WorldTangent.w > 0.0 ? 1.0 : -1.0) * GetOddNegativeScale(); + float3 bitangent = crossSign * cross(WorldNormal.xyz, WorldTangent.xyz); + float3 normalWS = TransformTangentToWorld(Normal, half3x3(WorldTangent.xyz, bitangent, WorldNormal.xyz)); + #elif _NORMAL_DROPOFF_OS + float3 normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + float3 normalWS = Normal; + #endif + #else + float3 normalWS = WorldNormal; + #endif + + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + #endif + } + ENDHLSL + } + + + Pass + { + + Name "GBuffer" + Tags { "LightMode"="UniversalGBuffer" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM +#define _NORMAL_DROPOFF_TS 1#pragma multi_compile_fog#define ASE_FOG 1#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED#define _DISABLE_LIGHTMAPS#define _NORMALMAP 1#define ASE_SRP_VERSION 999999#define ASE_USING_SAMPLING_MACROS 1 +#if FALSE + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile _ DYNAMICLIGHTMAP_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE + //_MAIN_LIGHT_SHADOWS_SCREEN + + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION + + #pragma multi_compile_fragment _ _SHADOWS_SOFT + #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING + #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE + //#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile _ _GBUFFER_NORMALS_OCT + //#pragma multi_compile_fragment _ _LIGHT_LAYERS + #pragma multi_compile _ _RENDER_PASS_ENABLED + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_GBUFFER + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl" + + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + #define ASE_NEEDS_FRAG_WORLD_NORMAL + #define ASE_NEEDS_FRAG_WORLD_VIEW_DIR + #pragma shader_feature_local ANIME + #pragma shader_feature_local _BRDFMAP + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_texcoord8 : TEXCOORD8; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _BaseMap_ST; + float4 _Color; + float4 _OutlineColor; + float4 _BumpMap_ST; + float _OutlineSize; + float _OutlineClamp; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BaseMap); + SAMPLER(sampler_BaseMap); + TEXTURE2D(_BumpMap); + SAMPLER(sampler_BumpMap); + TEXTURE2D(_MetallicGlossMap); + SAMPLER(sampler_MetallicGlossMap); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord8.xy = v.texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + FragmentOutput frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #else + ShadowCoords = float4(0, 0, 0, 0); + #endif + + + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float2 uv_BaseMap = IN.ase_texcoord8.xy * _BaseMap_ST.xy + _BaseMap_ST.zw; + float4 temp_output_109_0_g2 = round( ( SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ) * _Color ) ); + float dotResult19 = dot( WorldNormal , WorldViewDirection ); + float4 lerpResult22 = lerp( ( ( temp_output_109_0_g2 * ( 1.0 - ( ( 1.0 - ( SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ) * _Color ) ) * ( 1.0 - _OutlineColor ) * 2.0 ) ) ) + ( ( 1.0 - temp_output_109_0_g2 ) * ( ( SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ) * _Color ) * _OutlineColor * 2.0 ) ) ) , ( SAMPLE_TEXTURE2D( _BaseMap, sampler_BaseMap, uv_BaseMap ) * _Color ) , saturate( ( pow( dotResult19 , _OutlineSize ) * _OutlineClamp ) )); + + float2 uv_BumpMap = IN.ase_texcoord8.xy * _BumpMap_ST.xy + _BumpMap_ST.zw; + + float2 uv_MetallicGlossMap56 = IN.ase_texcoord8.xy; + float4 tex2DNode56 = SAMPLE_TEXTURE2D( _MetallicGlossMap, sampler_MetallicGlossMap, uv_MetallicGlossMap56 ); + + float3 Albedo = lerpResult22.rgb; + float3 Normal = UnpackNormalScale( SAMPLE_TEXTURE2D_BIAS( _BumpMap, sampler_BumpMap, uv_BumpMap, 0.0 ), 1.0f ); + float3 Emission = 0; + float3 Specular = 0.5; + float Metallic = tex2DNode56.r; + float Smoothness = tex2DNode56.b; + float Occlusion = tex2DNode56.g; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.positionCS = IN.clipPos; + inputData.shadowCoord = ShadowCoords; + + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + #else + inputData.normalWS = WorldNormal; + #endif + + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + inputData.viewDirectionWS = SafeNormalize( WorldViewDirection ); + + + + #ifdef ASE_FOG + inputData.fogCoord = InitializeInputDataFog(float4(WorldPosition, 1.0), IN.fogFactorAndVertexLight.x); + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw; + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #else + #if defined(DYNAMICLIGHTMAP_ON) + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, SH, inputData.normalWS); + #else + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, SH, inputData.normalWS ); + #endif + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + #ifdef _DBUFFER + ApplyDecal(IN.clipPos, + Albedo, + Specular, + inputData.normalWS, + Metallic, + Occlusion, + Smoothness); + #endif + + BRDFData brdfData; + InitializeBRDFData + (Albedo, Metallic, Specular, Smoothness, Alpha, brdfData); + + Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, inputData.shadowMask); + half4 color; + MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, inputData.shadowMask); + color.rgb = GlobalIllumination(brdfData, inputData.bakedGI, Occlusion, inputData.positionWS, inputData.normalWS, inputData.viewDirectionWS); + color.a = Alpha; + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, IN.fogFactorAndVertexLight.x); + #endif + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return BRDFDataToGbuffer(brdfData, inputData, Smoothness, Emission + color.rgb); + } +#endif + ENDHLSL + } + + + /*ase_pass*/ + Pass + { + + Name "ScenePickingPass" + Tags + { + "LightMode" = "Picking" + } + + HLSLPROGRAM + + /*ase_pragma_before*/ + + #pragma only_renderers gles gles3 glcore d3d11 + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + /*ase_pragma*/ + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + /*ase_vdata:p=p;n=n*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + /*ase_interp(0,):sp=sp*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + /*ase_srp_batcher*/ + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + /*ase_globals*/ + + /*ase_funcs*/ + + + float4 _SelectionID; + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v /*ase_vert_input*/ ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + /*ase_vert_code:v=VertexInput;o=VertexOutput*/ + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = /*ase_vert_out:Vertex Offset;Float3;2;-1;_Vertex*/defaultVertexValue/*end*/; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = /*ase_vert_out:Vertex Normal;Float3;3;-1;_Normal*/v.ase_normal/*end*/; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + /*ase_vcontrol*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + /*ase_control_code:v=VertexInput;o=VertexControl*/ + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + /*ase_domain_code:patch=VertexControl;o=VertexInput;bary=SV_DomainLocation*/ + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN /*ase_frag_input*/) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + /*ase_frag_code:IN=VertexOutput*/ + surfaceDescription.Alpha = /*ase_frag_out:Alpha;Float;0;-1;_Alpha*/1/*end*/; + surfaceDescription.AlphaClipThreshold = /*ase_frag_out:Alpha Clip Threshold;Float;1;-1;_AlphaClip*/0.5/*end*/; + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = 0; + outColor = _SelectionID; + + return outColor; + } + + ENDHLSL + } + + } + + CustomEditor "UnityEditor.ShaderGraphLitGUI" + Fallback "Hidden/InternalErrorShader" + +} +/*ASEBEGIN +Version=18935 +282;389;1538;967;-251.4649;56.78186;1;True;True +Node;AmplifyShaderEditor.WorldNormalVector;20;-1178.038,-800.0544;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.ViewDirInputsCoordNode;21;-1164.038,-646.0543;Inherit;False;World;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.SamplerNode;12;-626,-130.5;Inherit;True;Property;_BaseMap;Base Map;0;0;Create;True;0;0;0;False;0;False;-1;None;1b0370b3c9a51e344837a960d4e98216;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.DotProductOpNode;19;-948.3429,-690.2742;Inherit;True;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;58;-535.4602,65.32556;Inherit;False;Property;_Color;Color;7;0;Create;True;0;0;0;False;0;False;1,1,1,1;1,1,1,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;64;-881.8295,-829.9539;Inherit;False;Property;_OutlineSize;Outline Size;8;0;Create;True;0;0;0;False;0;False;5;5;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;57;-277.4602,-118.6744;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;65;-894.0175,-923.028;Inherit;False;Property;_OutlineClamp;Outline Clamp;9;0;Create;True;0;0;0;False;0;False;10;10;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.PowerNode;61;-722.274,-842.1419;Inherit;False;False;2;0;FLOAT;0;False;1;FLOAT;3.46;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;23;-202.9191,-515.0224;Inherit;False;Property;_OutlineColor;Outline Color;5;1;[HDR];Create;True;0;0;0;False;0;False;0.5,0.5,0.5,0;1,1,1,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;62;-571.5825,-833.2779;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RelayNode;31;-117.7546,-132.4103;Inherit;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SaturateNode;63;-390.9748,-808.9012;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FunctionNode;26;65.0983,-395.4177;Inherit;True;Overlay Blend;-1;;2;3987f7f74cd16f24eab3a89e587abb46;0;2;1;COLOR;1,1,1,1;False;2;COLOR;0.5,0.5,0.5,0.5019608;False;1;COLOR;0 +Node;AmplifyShaderEditor.SamplerNode;56;803.6033,-89.51141;Inherit;True;Property;_MetallicGlossMap;MAS;4;2;[NoScaleOffset];[SingleLineTexture];Create;False;0;0;0;False;0;False;-1;None;bf9e26486b4e6724cbf6c1b8d641c6f3;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.OneMinusNode;42;177.5196,-14.34025;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TexturePropertyNode;32;788.3314,473.3041;Inherit;True;Property;g_tBRDFMap;BRDF map;1;1;[NoScaleOffset];Fetch;False;0;0;0;True;0;False;a3bdd83838d6c4b40aafefcae6402faf;6dc78741d54741a4c90a0fb74bd75f20;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1 +Node;AmplifyShaderEditor.SamplerNode;39;364.7328,87.02249;Inherit;True;Property;_BumpMap;Bump Map;6;0;Create;True;0;0;0;False;0;False;-1;None;d840231ec2f3db34a802f4b2d03b1ce9;True;0;True;bump;Auto;True;Object;-1;MipBias;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.StaticSwitch;66;1090.453,366.7114;Inherit;False;Property;ANIME;ANIME;3;0;Create;False;0;0;0;True;1;HideInInspector;False;0;1;1;True;ANIME;Toggle;2;Key0;Key1;Create;True;False;All;9;1;FLOAT;0;False;0;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.LerpOp;22;411.7003,-254;Inherit;True;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.StaticSwitch;36;786.2081,367.3107;Inherit;False;Property;BRDFMAP1;Enable BRDF map;2;0;Create;False;0;0;0;True;1;HideInInspector;False;0;1;1;True;_BRDFMAP;Toggle;2;Key0;Key1;Create;True;False;All;9;1;FLOAT;0;False;0;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;43;204.8196,107.8598;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;5;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;6;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Universal2D;0;5;Universal2D;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;5;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Meta;0;4;Meta;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Meta;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;1;0,-154.2;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ExtraPrePass;0;0;ExtraPrePass;5;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;0;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;9;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;SceneSelectionPass;0;8;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;7;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthNormals;0;6;DepthNormals;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormals;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;2;1103.537,-158.6321;Half;False;True;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;SLZ/Anime;94348b07e5e8bab40bd6c8a1e3df54cd;True;Forward;0;1;Forward;23;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;True;True;1;False;-1;True;3;False;-1;True;False;-1;False;-1;-1;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;4;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalForward;False;False;0;Hidden/InternalErrorShader;0;0;Standard;48;Workflow;1;0;Surface;0;637847984488696701; Refraction Model;0;0; Blend;0;0;Two Sided;1;0;Fragment Normal Space,InvertActionOnDeselection;0;0;Transmission;0;0; Transmission Shadow;0.5,False,-1;0;Translucency;0;0; Translucency Strength;1,False,-1;0; Normal Distortion;0.5,False,-1;0; Scattering;2,False,-1;0; Direct;0.9,False,-1;0; Ambient;0.1,False,-1;0; Shadow;0.5,False,-1;0;Cast Shadows;1;637849008675289663; Use Shadow Threshold;0;0;Receive Shadows;1;0;GPU Instancing;0;637848059191800682;LOD CrossFade;0;637847983780200660;Built-in Fog;1;0;Lightmaps;0;637956961665508411;Volumetrics;1;0;Decals;0;637849004488270298;Screen Space Occlusion;1;0;Reflection Probe Blend/Projection;1;0;Light Layers;0;637849004259350588;_FinalColorxAlpha;0;637848253284931523;Meta Pass;0;637956962340762388;GBuffer Pass;0;0;Override Baked GI;0;0;Extra Pre Pass;0;0;DOTS Instancing;0;0;Tessellation;0;0; Phong;0;0; Strength;0.5,False,-1;0; Type;0;0; Tess;16,False,-1;0; Min;10,False,-1;0; Max;25,False,-1;0; Edge Length;16,False,-1;0; Max Displacement;25,False,-1;0;Write Depth;0;637848252840677912; Early Z;0;0;Vertex Position,InvertActionOnDeselection;1;0;Debug Display;0;0;Clear Coat;0;0;Fluorescence;0;0;0;10;False;True;True;True;False;False;True;True;False;False;False;;True;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;3;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ShadowCaster;0;2;ShadowCaster;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=ShadowCaster;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;8;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;GBuffer;0;7;GBuffer;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalGBuffer;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;4;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthOnly;0;3;DepthOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;False;False;True;1;LightMode=DepthOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;10;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ScenePickingPass;0;9;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +WireConnection;19;0;20;0 +WireConnection;19;1;21;0 +WireConnection;57;0;12;0 +WireConnection;57;1;58;0 +WireConnection;61;0;19;0 +WireConnection;61;1;64;0 +WireConnection;62;0;61;0 +WireConnection;62;1;65;0 +WireConnection;31;0;57;0 +WireConnection;63;0;62;0 +WireConnection;26;1;31;0 +WireConnection;26;2;23;0 +WireConnection;42;0;19;0 +WireConnection;22;0;26;0 +WireConnection;22;1;31;0 +WireConnection;22;2;63;0 +WireConnection;43;0;42;0 +WireConnection;2;0;22;0 +WireConnection;2;1;39;0 +WireConnection;2;3;56;1 +WireConnection;2;4;56;3 +WireConnection;2;5;56;2 +ASEEND*/ +//CHKSM=314A70616A5EB7D01FEF6EC6C063946CE320E6E3 \ No newline at end of file diff --git a/Assets/SLZShaders/SLZAnime.shader.meta b/Assets/SLZShaders/SLZAnime.shader.meta new file mode 100644 index 0000000..b9df5fb --- /dev/null +++ b/Assets/SLZShaders/SLZAnime.shader.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 97791a0150e87a14bbe1a5d46267be8a +ShaderImporter: + externalObjects: {} + defaultTextures: + - _BaseMap: {instanceID: 0} + - g_tBRDFMap: {instanceID: 0} + - _MetallicGlossMap: {fileID: 2800000, guid: 703311043c2b2a14fa1fd24eec4d6b39, type: 3} + - _BumpMap: {instanceID: 0} + - _texcoord: {instanceID: 0} + - unity_Lightmaps: {instanceID: 0} + - unity_LightmapsInd: {instanceID: 0} + - unity_ShadowMasks: {instanceID: 0} + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Scanline.shader b/Assets/SLZShaders/Scanline.shader new file mode 100644 index 0000000..ef71b87 --- /dev/null +++ b/Assets/SLZShaders/Scanline.shader @@ -0,0 +1,3315 @@ +// Made with Amplify Shader Editor +// Available at the Unity Asset Store - http://u3d.as/y3X +Shader "SLZ/Scanline" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [ASEBegin][NoScaleOffset]_EmissionMap("Emission Map", 2D) = "white" {} + _MainTex("MainTex", 2D) = "white" {} + _Color("Color", Color) = (1,1,1,1) + [HDR]_EmissionColor("Emission Color", Color) = (0,0,0,0) + _Glossiness("Glossiness", Range( 0 , 1)) = 1 + _Metallic("Metallic", Range( 0 , 1)) = 0 + _EmissionFalloff("Emission Falloff", Range( 0 , 5)) = 1 + _ScanlineSpeed("Scanline Speed", Float) = 0.1 + _ScanlineIntensity("Scanline Intensity", Range( 0 , 1)) = 0.5 + _ScanlineCount("Scanline Count", Float) = 32 + _Pixels("Pixels", 2D) = "white" {} + _Fluorescence("Fluorescence", Color) = (0.4083748,0.5377358,0.4464222,1) + _Absorbance("Absorbance", Color) = (0.042,0.112,0.517,1) + [ASEEnd]_CoatSmoothness("Coat Smoothness", Range( 0 , 1)) = 0 + [HideInInspector] _texcoord( "", 2D ) = "white" {} + + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + //_TransmissionShadow( "Transmission Shadow", Range( 0, 1 ) ) = 0.5 + //_TransStrength( "Trans Strength", Range( 0, 50 ) ) = 1 + //_TransNormal( "Trans Normal Distortion", Range( 0, 1 ) ) = 0.5 + //_TransScattering( "Trans Scattering", Range( 1, 50 ) ) = 2 + //_TransDirect( "Trans Direct", Range( 0, 1 ) ) = 0.9 + //_TransAmbient( "Trans Ambient", Range( 0, 1 ) ) = 0.1 + //_TransShadow( "Trans Shadow", Range( 0, 1 ) ) = 0.5 + //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5 + //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16 + //_TessMin( "Tess Min Distance", Float ) = 10 + //_TessMax( "Tess Max Distance", Float ) = 25 + //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16 + //_TessMaxDisp( "Tess Max Displacement", Float ) = 25 + } + + SubShader + { + LOD 0 + +HLSLINCLUDE +#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" +ENDHLSL + + + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Opaque" "Queue"="Geometry" } + Cull Back + ZWrite On + ZTest LEqual + Offset 0 , 0 + AlphaToMask Off + + HLSLINCLUDE + #pragma target 3.0 + + #pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + + #ifndef ASE_TESS_FUNCS + #define ASE_TESS_FUNCS + float4 FixedTess( float tessValue ) + { + return tessValue; + } + + float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos ) + { + float3 wpos = mul(o2w,vertex).xyz; + float dist = distance (wpos, cameraPos); + float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess; + return f; + } + + float4 CalcTriEdgeTessFactors (float3 triVertexFactors) + { + float4 tess; + tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z); + tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z); + tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y); + tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f; + return tess; + } + + float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams ) + { + float dist = distance (0.5 * (wpos0+wpos1), cameraPos); + float len = distance(wpos0, wpos1); + float f = max(len * scParams.y / (edgeLen * dist), 1.0); + return f; + } + + float DistanceFromPlane (float3 pos, float4 plane) + { + float d = dot (float4(pos,1.0f), plane); + return d; + } + + bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] ) + { + float4 planeTest; + planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f ); + return !all (planeTest); + } + + float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos ) + { + float3 f; + f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos); + f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos); + f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos); + + return CalcTriEdgeTessFactors (f); + } + + float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + return tess; + } + + float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + + if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes)) + { + tess = 0.0f; + } + else + { + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + } + return tess; + } + #endif //ASE_TESS_FUNCS + + ENDHLSL + + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForwardOnly" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _CLEARCOAT 1 + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_FORWARD + + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + + #define ASE_NEEDS_FRAG_WORLD_NORMAL + #define ASE_NEEDS_FRAG_WORLD_VIEW_DIR + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DefaultLitVariants.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_texcoord8 : TEXCOORD8; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _Pixels_TexelSize; + float4 _Pixels_ST; + float4 _EmissionColor; + float4 _Fluorescence; + float4 _Absorbance; + float _ScanlineSpeed; + float _ScanlineCount; + float _ScanlineIntensity; + float _EmissionFalloff; + float _Metallic; + float _Glossiness; + float _CoatSmoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_MainTex); + SAMPLER(sampler_MainTex); + TEXTURE2D(_EmissionMap); + TEXTURE2D(_Pixels); + SAMPLER(sampler_EmissionMap); + SAMPLER(sampler_Pixels); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord8.xy = v.texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + #if defined(LIGHTMAP_ON) + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + #if !defined(LIGHTMAP_ON) + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float2 uv_MainTex = IN.ase_texcoord8.xy * _MainTex_ST.xy + _MainTex_ST.zw; + float4 temp_output_7_0 = ( SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, uv_MainTex ) * _Color ); + + float2 uv_Pixels = IN.ase_texcoord8.xy * _Pixels_ST.xy + _Pixels_ST.zw; + float2 appendResult51 = (float2(uv_MainTex.x , ( uv_MainTex.y + ( ( 0.2 / _Pixels_TexelSize.w ) * round( frac( ( _TimeParameters.x * 10.0 ) ) ) * round( frac( ( uv_Pixels.y * 0.5 ) ) ) ) ))); + float2 texCoord23 = IN.ase_texcoord8.xy * float2( 1,1 ) + float2( 0,0 ); + float lerpResult32 = lerp( 1.0 , distance( frac( ( ( texCoord23.y + frac( ( _TimeParameters.x * _ScanlineSpeed ) ) ) * _ScanlineCount ) ) , 0.5 ) , _ScanlineIntensity); + float4 temp_output_8_0 = ( SAMPLE_TEXTURE2D( _EmissionMap, sampler_EmissionMap, appendResult51 ) * _EmissionColor * lerpResult32 * ( SAMPLE_TEXTURE2D( _Pixels, sampler_Pixels, uv_Pixels ) * 1.0 ) ); + float dotResult16 = dot( WorldNormal , WorldViewDirection ); + float clampResult22 = clamp( pow( abs( dotResult16 ) , ( _EmissionFalloff * 2.0 ) ) , 0.0 , 1.0 ); + + float3 Albedo = temp_output_7_0.rgb; + float3 Normal = float3(0, 0, 1); + float3 Emission = ( temp_output_8_0 * clampResult22 ).rgb; +#if 0 + float3 BakedEmission = 0; +#endif + float3 Specular = 0.5; + float Metallic = _Metallic; + float Smoothness = _Glossiness; + float Occlusion = 1; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _CLEARCOAT + float CoatMask = 1.0; + float CoatSmoothness = _CoatSmoothness; + #endif + + #if defined(_FLUORESCENCE) + float4 Fluorescence = _Fluorescence; + float4 Absorbance = _Absorbance; + #endif + + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.viewDirectionWS = WorldViewDirection; + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + #else + inputData.normalWS = WorldNormal; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + inputData.shadowCoord = ShadowCoords; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + inputData.shadowCoord = TransformWorldToShadowCoord(inputData.positionWS); + #else + inputData.shadowCoord = float4(0, 0, 0, 0); + #endif + + + #ifdef ASE_FOG + inputData.fogCoord = IN.fogFactorAndVertexLight.x; + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzww; //TODO: Shuffle things in vertex streams so we get full RGBA color rather than RGBB here + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xyz, IN.dynamicLightmapUV.xy, IN.vertexSH, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI(IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, IN.vertexSH , inputData.normalWS); + #endif + + #else + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + #endif + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + SurfaceData surfaceData; + surfaceData.albedo = Albedo; + surfaceData.metallic = saturate(Metallic); + surfaceData.specular = Specular; + surfaceData.smoothness = saturate(Smoothness), + surfaceData.occlusion = Occlusion, + surfaceData.emission = Emission, + surfaceData.alpha = saturate(Alpha); + surfaceData.normalTS = Normal; + surfaceData.clearCoatMask = 0; + surfaceData.clearCoatSmoothness = 1; + + #ifdef _CLEARCOAT + surfaceData.clearCoatMask = saturate(CoatMask); + surfaceData.clearCoatSmoothness = saturate(CoatSmoothness); + #endif + #if defined(_FLUORESCENCE) + surfaceData.fluorescence = Fluorescence; + surfaceData.absorbance = Absorbance; + #endif + + #ifdef _DBUFFER + ApplyDecalToSurfaceData(IN.clipPos, surfaceData, inputData); + #endif + + half4 color = UniversalFragmentPBR( inputData, surfaceData); + + #ifdef LIGHTMAP_ON + float3 MetalSpec = lerp(kDieletricSpec.rgb, surfaceData.albedo , surfaceData.metallic); + color.rgb += BakedSpecular * surfaceData.occlusion * MetalSpec * inputData.bakedGI.rgb; + #endif + + #ifdef _TRANSMISSION_ASE + { + float shadow = _TransmissionShadow; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + half3 mainTransmission = max(0 , -dot(inputData.normalWS, mainLight.direction)) * mainAtten * Transmission; + color.rgb += Albedo * mainTransmission; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 transmission = max(0 , -dot(inputData.normalWS, light.direction)) * atten * Transmission; + color.rgb += Albedo * transmission; + } + #endif + } + #endif + + #ifdef _TRANSLUCENCY_ASE + { + float shadow = _TransShadow; + float normal = _TransNormal; + float scattering = _TransScattering; + float direct = _TransDirect; + float ambient = _TransAmbient; + float strength = _TransStrength; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + + half3 mainLightDir = mainLight.direction + inputData.normalWS * normal; + half mainVdotL = pow( saturate( dot( inputData.viewDirectionWS, -mainLightDir ) ), scattering ); + half3 mainTranslucency = mainAtten * ( mainVdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * mainTranslucency * strength; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 lightDir = light.direction + inputData.normalWS * normal; + half VdotL = pow( saturate( dot( inputData.viewDirectionWS, -lightDir ) ), scattering ); + half3 translucency = atten * ( VdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * translucency * strength; + } + #endif + } + #endif + + #ifdef _REFRACTION_ASE + float4 projScreenPos = ScreenPos / ScreenPos.w; + float3 refractionOffset = ( RefractionIndex - 1.0 ) * mul( UNITY_MATRIX_V, float4( WorldNormal,0 ) ).xyz * ( 1.0 - dot( WorldNormal, WorldViewDirection ) ); + projScreenPos.xy += refractionOffset.xy; + float3 refraction = SHADERGRAPH_SAMPLE_SCENE_COLOR( projScreenPos.xy ) * RefractionColor; + color.rgb = lerp( refraction, color.rgb, color.a ); + color.a = 1; + #endif + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, -inputData.viewDirectionWS, IN.fogFactorAndVertexLight.x); + #endif + #endif + + color = Volumetrics( color, inputData.positionWS); + + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return color; + } + + ENDHLSL + } + + + Pass + { + + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + + ZWrite On + ZTest LEqual + AlphaToMask Off + ColorMask 0 + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _CLEARCOAT 1 + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #pragma multi_compile _ _CASTING_PUNCTUAL_LIGHT_SHADOW + + #define SHADERPASS SHADERPASS_SHADOWCASTER + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _Pixels_TexelSize; + float4 _Pixels_ST; + float4 _EmissionColor; + float4 _Fluorescence; + float4 _Absorbance; + float _ScanlineSpeed; + float _ScanlineCount; + float _ScanlineIntensity; + float _EmissionFalloff; + float _Metallic; + float _Glossiness; + float _CoatSmoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + float3 _LightDirection; + float3 _LightPosition; + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + + float3 normalWS = TransformObjectToWorldDir(v.ase_normal); + + + #if _CASTING_PUNCTUAL_LIGHT_SHADOW + float3 lightDirectionWS = normalize(_LightPosition - positionWS); + #else + float3 lightDirectionWS = _LightDirection; + #endif + float2 vShadowOffsets = GetShadowOffsets( normalWS, lightDirectionWS ); + positionWS.xyz += vShadowOffsets.y * lightDirectionWS.xyz / 1000; + float4 clipPos = TransformObjectToHClip( float4( mul( unity_WorldToObject, float4( positionWS.xyz, 1.0 ) ).xyz, 1.0 ) ); + //float4 clipPos = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, lightDirectionWS)); + + #if UNITY_REVERSED_Z + clipPos.z = min(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #else + clipPos.z = max(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #endif + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = clipPos; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _ALPHATEST_ON + #ifdef _ALPHATEST_SHADOW_ON + clip(Alpha - AlphaClipThresholdShadow); + #else + clip(Alpha - AlphaClipThreshold); + #endif + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + return 0; + } + + ENDHLSL + } + + + Pass + { + + Name "DepthOnly" + Tags { "LightMode"="DepthOnly" } + + ZWrite On + ColorMask 0 + AlphaToMask Off + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _CLEARCOAT 1 + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _Pixels_TexelSize; + float4 _Pixels_ST; + float4 _EmissionColor; + float4 _Fluorescence; + float4 _Absorbance; + float _ScanlineSpeed; + float _ScanlineCount; + float _ScanlineIntensity; + float _EmissionFalloff; + float _Metallic; + float _Glossiness; + float _CoatSmoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return 0; + } + ENDHLSL + } + + + Pass + { + + Name "Meta" + Tags { "LightMode"="Meta" } + + Cull Off + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _CLEARCOAT 1 + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #pragma shader_feature _ EDITOR_VISUALIZATION + + #define SHADERPASS SHADERPASS_META + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/MetaInput.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + #ifdef EDITOR_VISUALIZATION + float4 VizUV : TEXCOORD2; + float4 LightCoord : TEXCOORD3; + #endif + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _Pixels_TexelSize; + float4 _Pixels_ST; + float4 _EmissionColor; + float4 _Fluorescence; + float4 _Absorbance; + float _ScanlineSpeed; + float _ScanlineCount; + float _ScanlineIntensity; + float _EmissionFalloff; + float _Metallic; + float _Glossiness; + float _CoatSmoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_MainTex); + SAMPLER(sampler_MainTex); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord4.xy = v.texcoord0.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.clipPos = MetaVertexPosition( v.vertex, v.texcoord1.xy, v.texcoord1.xy, unity_LightmapST, unity_DynamicLightmapST ); + + #ifdef EDITOR_VISUALIZATION + float2 VizUV = 0; + float4 LightCoord = 0; + UnityEditorVizData(v.vertex.xyz, v.texcoord0.xy, v.texcoord1.xy, v.texcoord2.xy, VizUV, LightCoord); + o.VizUV = float4(VizUV, 0, 0); + o.LightCoord = LightCoord; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = o.clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.texcoord0 = v.texcoord0; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.texcoord0 = patch[0].texcoord0 * bary.x + patch[1].texcoord0 * bary.y + patch[2].texcoord0 * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 uv_MainTex = IN.ase_texcoord4.xy * _MainTex_ST.xy + _MainTex_ST.zw; + float4 temp_output_7_0 = ( SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, uv_MainTex ) * _Color ); + + + float3 Albedo = temp_output_7_0.rgb; + float3 Emission = 0; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + MetaInput metaInput = (MetaInput)0; + metaInput.Albedo = Albedo; + metaInput.Emission = Emission; + #ifdef EDITOR_VISUALIZATION + metaInput.VizUV = IN.VizUV.xy; + metaInput.LightCoord = IN.LightCoord; + #endif + + return MetaFragment(metaInput); + } + ENDHLSL + } + + /*ase_pass*/ + Pass + { + + Name "BakedRaytrace" + Tags{ "LightMode" = "BakedRaytrace" } + HLSLPROGRAM + + /*ase_pragma_before*/ + + #define SHADERPASS SHADERPASS_RAYTRACE + + #include "UnityRaytracingMeshUtils.cginc" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #define _EMISSION + #pragma raytracing test + #pragma shader_feature_local __ _ALBEDOMULTIPLY_ON + #pragma shader_feature_local __ _EMISSION_ON + + /*ase_pragma*/ + + struct RayPayload + { + float4 color; + float3 dir; + }; + + struct AttributeData + { + float2 barycentrics; + }; + + struct Vertex + { + float2 texcoord; + float3 normal; + }; + + Texture2D _BaseMap; + SamplerState sampler_BaseMap; + + CBUFFER_START( UnityPerMaterial ) + /*ase_srp_batcher*/ + Texture2D _EmissionMap; + SamplerState sampler_EmissionMap; + + float4 _EmissionColor; + float4 _BaseMap_ST; + float _BakedMutiplier = 1; + CBUFFER_END + + /*ase_globals*/ + + /*ase_funcs*/ + + //https://coty.tips/raytracing-in-unity/ + [shader("closesthit")] + void MyClosestHit(inout RayPayload payload, + AttributeData attributes : SV_IntersectionAttributes) { + + payload.color = float4(0,0,0,1); //Intializing + payload.dir = float3(1,0,0); + + // #if _EMISSION_ON + uint2 launchIdx = DispatchRaysIndex(); + // ShadingData shade = getShadingData( PrimitiveIndex(), attribs ); + + uint primitiveIndex = PrimitiveIndex(); + uint3 triangleIndicies = UnityRayTracingFetchTriangleIndices(primitiveIndex); + Vertex v0, v1, v2; + + v0.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.x, kVertexAttributeTexCoord0); + v1.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.y, kVertexAttributeTexCoord0); + v2.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.z, kVertexAttributeTexCoord0); + + // v0.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.x, kVertexAttributeNormal); + // v1.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.y, kVertexAttributeNormal); + // v2.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.z, kVertexAttributeNormal); + + float3 barycentrics = float3(1.0 - attributes.barycentrics.x - attributes.barycentrics.y, attributes.barycentrics.x, attributes.barycentrics.y); + + Vertex vInterpolated; + vInterpolated.texcoord = v0.texcoord * barycentrics.x + v1.texcoord * barycentrics.y + v2.texcoord * barycentrics.z; + //TODO: Extract normal direction to ignore the backside of emissive objects + //vInterpolated.normal = v0.normal * barycentrics.x + v1.normal * barycentrics.y + v2.normal * barycentrics.z; + // if ( dot(vInterpolated.normal, float3(1,0,0) < 0) ) payload.color = float4(0,10,0,1) ; + // else payload.color = float4(10,0,0,1) ; + + //TODO: Figure out how to tie Amplify into using Texture2d and SamplerState instead of the bundled sampler2D. Forcing names for now. + //#if _ALBEDOMULTIPLY_ON + float4 albedo = float4(_BaseMap.SampleLevel(sampler_BaseMap, vInterpolated.texcoord.xy * _BaseMap_ST.xy + _BaseMap_ST.zw, 0 ).rgb , 1) ; + // #else + // float4 albedo = float4(1,1,1,1); + // #endif + + payload.color = float4( (_EmissionMap.SampleLevel(sampler_EmissionMap, vInterpolated.texcoord * _BaseMap_ST.xy + _BaseMap_ST.zw,0) ).rgb * _EmissionColor.rgb * albedo.rgb * _BakedMutiplier , 1 ); + // #else + // payload.color = float4(0,0,0,1); + + // #endif + } + ENDHLSL + + } + + + Pass + { + + Name "Universal2D" + Tags { "LightMode"="Universal2D" } + + Blend One Zero, One Zero + ColorMask RGBA + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _CLEARCOAT 1 + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_2D + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float4 ase_texcoord2 : TEXCOORD2; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _Pixels_TexelSize; + float4 _Pixels_ST; + float4 _EmissionColor; + float4 _Fluorescence; + float4 _Absorbance; + float _ScanlineSpeed; + float _ScanlineCount; + float _ScanlineIntensity; + float _EmissionFalloff; + float _Metallic; + float _Glossiness; + float _CoatSmoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_MainTex); + SAMPLER(sampler_MainTex); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID( v ); + UNITY_TRANSFER_INSTANCE_ID( v, o ); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + o.ase_texcoord2.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord2.zw = 0; + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 uv_MainTex = IN.ase_texcoord2.xy * _MainTex_ST.xy + _MainTex_ST.zw; + float4 temp_output_7_0 = ( SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, uv_MainTex ) * _Color ); + + + float3 Albedo = temp_output_7_0.rgb; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + half4 color = half4( Albedo, Alpha ); + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + return color; + } + ENDHLSL + } + + + Pass + { + + Name "DepthNormals" + Tags { "LightMode"="DepthNormalsOnly" } + + ZWrite On + Blend One Zero + ZTest LEqual + ZWrite On + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _CLEARCOAT 1 + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float3 worldNormal : TEXCOORD2; + float4 worldTangent : TEXCOORD3; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _Pixels_TexelSize; + float4 _Pixels_ST; + float4 _EmissionColor; + float4 _Fluorescence; + float4 _Absorbance; + float _ScanlineSpeed; + float _ScanlineCount; + float _ScanlineIntensity; + float _EmissionFalloff; + float _Metallic; + float _Glossiness; + float _CoatSmoothness; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal( v.ase_normal ); + float4 tangentWS = float4(TransformObjectToWorldDir( v.ase_tangent.xyz), v.ase_tangent.w); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.worldNormal = normalWS; + o.worldTangent = tangentWS; + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + float3 WorldNormal = IN.worldNormal; + float4 WorldTangent = IN.worldTangent; + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float3 Normal = float3(0, 0, 1); + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + #if defined(_GBUFFER_NORMALS_OCT) + float2 octNormalWS = PackNormalOctQuadEncode(WorldNormal); + float2 remappedOctNormalWS = saturate(octNormalWS * 0.5 + 0.5); + half3 packedNormalWS = PackFloat2To888(remappedOctNormalWS); + return half4(packedNormalWS, 0.0); + #else + + #if defined(_NORMALMAP) + #if _NORMAL_DROPOFF_TS + float crossSign = (WorldTangent.w > 0.0 ? 1.0 : -1.0) * GetOddNegativeScale(); + float3 bitangent = crossSign * cross(WorldNormal.xyz, WorldTangent.xyz); + float3 normalWS = TransformTangentToWorld(Normal, half3x3(WorldTangent.xyz, bitangent, WorldNormal.xyz)); + #elif _NORMAL_DROPOFF_OS + float3 normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + float3 normalWS = Normal; + #endif + #else + float3 normalWS = WorldNormal; + #endif + + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + #endif + } + ENDHLSL + } + + /*ase_pass*/ + Pass + { + + Name "GBuffer" + Tags{"LightMode" = "None" } + + Blend One Zero + ColorMask RGBA + /*ase_stencil*/ + + HLSLPROGRAM +/*ase_pragma_before*/ +#if FALSE + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile _ DYNAMICLIGHTMAP_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE + //_MAIN_LIGHT_SHADOWS_SCREEN + + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION + + #pragma multi_compile_fragment _ _SHADOWS_SOFT + #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING + #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE + //#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile _ _GBUFFER_NORMALS_OCT + //#pragma multi_compile_fragment _ _LIGHT_LAYERS + #pragma multi_compile _ _RENDER_PASS_ENABLED + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_GBUFFER + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl" + + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + /*ase_pragma*/ + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vdata:p=p;n=n;t=t;uv0=tc0;uv1=tc1;uv2=tc2*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + /*ase_interp(8,):sp=sp;sc=tc2;wn.xyz=tc3.xyz;wt.xyz=tc4.xyz;wbt.xyz=tc5.xyz;wp.x=tc3.w;wp.y=tc4.w;wp.z=tc5.w;spu=tc6*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + /*ase_srp_batcher*/ + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + /*ase_globals*/ + + /*ase_funcs*/ + + VertexOutput VertexFunction( VertexInput v /*ase_vert_input*/ ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + /*ase_vert_code:v=VertexInput;o=VertexOutput*/ + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = /*ase_vert_out:Vertex Offset;Float3;8;-1;_Vertex*/defaultVertexValue/*end*/; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = /*ase_vert_out:Vertex Normal;Float3;10;-1;_Normal*/v.ase_normal/*end*/; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vcontrol*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + /*ase_control_code:v=VertexInput;o=VertexControl*/ + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + /*ase_domain_code:patch=VertexControl;o=VertexInput;bary=SV_DomainLocation*/ + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + FragmentOutput frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + /*ase_frag_input*/ ) + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #else + ShadowCoords = float4(0, 0, 0, 0); + #endif + + + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + /*ase_frag_code:IN=VertexOutput*/ + float3 Albedo = /*ase_frag_out:Albedo;Float3;0;-1;_Albedo*/float3(0.5, 0.5, 0.5)/*end*/; + float3 Normal = /*ase_frag_out:Normal;Float3;1;-1;_FragNormal*/float3(0, 0, 1)/*end*/; + float3 Emission = /*ase_frag_out:Emission;Float3;2;-1;_Emission*/0/*end*/; + float3 Specular = /*ase_frag_out:Specular;Float3;9;-1;_Specular*/0.5/*end*/; + float Metallic = /*ase_frag_out:Metallic;Float;3;-1;_Metallic*/0/*end*/; + float Smoothness = /*ase_frag_out:Smoothness;Float;4;-1;_Smoothness*/0.5/*end*/; + float Occlusion = /*ase_frag_out:Occlusion;Float;5;-1;_Occlusion*/1/*end*/; + float Alpha = /*ase_frag_out:Alpha;Float;6;-1;_Alpha*/1/*end*/; + float AlphaClipThreshold = /*ase_frag_out:Alpha Clip Threshold;Float;7;-1;_AlphaClip*/0.5/*end*/; + float AlphaClipThresholdShadow = /*ase_frag_out:Alpha Clip Threshold Shadow;Float;16;-1;_AlphaClipShadow*/0.5/*end*/; + float3 BakedGI = /*ase_frag_out:Baked GI;Float3;11;-1;_BakedGI*/0/*end*/; + float3 RefractionColor = /*ase_frag_out:Refraction Color;Float3;12;-1;_RefractionColor*/1/*end*/; + float RefractionIndex = /*ase_frag_out:Refraction Index;Float;13;-1;_RefractionIndex*/1/*end*/; + float3 Transmission = /*ase_frag_out:Transmission;Float3;14;-1;_Transmission*/1/*end*/; + float3 Translucency = /*ase_frag_out:Translucency;Float3;15;-1;_Translucency*/1/*end*/; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = /*ase_frag_out:Depth Value;Float;17;-1;_DepthValue*/0/*end*/; + #endif + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.positionCS = IN.clipPos; + inputData.shadowCoord = ShadowCoords; + + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + #else + inputData.normalWS = WorldNormal; + #endif + + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + inputData.viewDirectionWS = SafeNormalize( WorldViewDirection ); + + + + #ifdef ASE_FOG + inputData.fogCoord = InitializeInputDataFog(float4(WorldPosition, 1.0), IN.fogFactorAndVertexLight.x); + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw; + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #else + #if defined(DYNAMICLIGHTMAP_ON) + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, SH, inputData.normalWS); + #else + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, SH, inputData.normalWS ); + #endif + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + #ifdef _DBUFFER + ApplyDecal(IN.clipPos, + Albedo, + Specular, + inputData.normalWS, + Metallic, + Occlusion, + Smoothness); + #endif + + BRDFData brdfData; + InitializeBRDFData + (Albedo, Metallic, Specular, Smoothness, Alpha, brdfData); + + Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, inputData.shadowMask); + half4 color; + MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, inputData.shadowMask); + color.rgb = GlobalIllumination(brdfData, inputData.bakedGI, Occlusion, inputData.positionWS, inputData.normalWS, inputData.viewDirectionWS); + color.a = Alpha; + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, IN.fogFactorAndVertexLight.x); + #endif + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return BRDFDataToGbuffer(brdfData, inputData, Smoothness, Emission + color.rgb); + } +#endif + ENDHLSL + } + + + + Pass + { + + Name "SceneSelectionPass" + Tags { "LightMode"="SceneSelectionPass" } + + Cull Off + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _CLEARCOAT 1 + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _Pixels_TexelSize; + float4 _Pixels_ST; + float4 _EmissionColor; + float4 _Fluorescence; + float4 _Absorbance; + float _ScanlineSpeed; + float _ScanlineCount; + float _ScanlineIntensity; + float _EmissionFalloff; + float _Metallic; + float _Glossiness; + float _CoatSmoothness; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + int _ObjectId; + int _PassValue; + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if _ALPHATEST_ON + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = half4(_ObjectId, _PassValue, 1.0, 1.0); + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "ScenePickingPass" + Tags { "LightMode"="Picking" } + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _FLUORESCENCE 1 + #define _CLEARCOAT 1 + #define _EMISSION + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_ST; + float4 _Color; + float4 _Pixels_TexelSize; + float4 _Pixels_ST; + float4 _EmissionColor; + float4 _Fluorescence; + float4 _Absorbance; + float _ScanlineSpeed; + float _ScanlineCount; + float _ScanlineIntensity; + float _EmissionFalloff; + float _Metallic; + float _Glossiness; + float _CoatSmoothness; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + + float4 _SelectionID; + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if _ALPHATEST_ON + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = 0; + outColor = _SelectionID; + + return outColor; + } + + ENDHLSL + } + + } + + CustomEditor "UnityEditor.ShaderGraphLitGUI" + Fallback "Hidden/InternalErrorShader" + +} +/*ASEBEGIN +Version=18935 +2103;205;1980;1007;98.6217;593.2677;1;True;True +Node;AmplifyShaderEditor.SimpleTimeNode;28;-1963.34,166.5412;Inherit;True;1;0;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FractNode;52;-1703.675,-305.0131;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.LerpOp;32;-593.2473,506.1884;Inherit;False;3;0;FLOAT;1;False;1;FLOAT;1;False;2;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FractNode;48;-1606.187,161.5722;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RoundOpNode;55;-1460.675,-306.0131;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;37;-1208.74,766.7116;Inherit;True;Property;_Pixels;Pixels;11;0;Create;True;0;0;0;False;0;False;-1;None;81cc8fbe3bd52d149b2b91936b92bfb8;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;42;-876.7444,939.3727;Float;False;Constant;_Float0;Float 0;13;0;Create;True;0;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;31;-2014.177,302.619;Float;False;Property;_ScanlineSpeed;Scanline Speed;8;0;Create;True;0;0;0;False;0;False;0.1;1;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.FractNode;30;-1461.066,363.6114;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;38;-2194.587,-120.0314;Inherit;False;0;37;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;46;-1252.587,186.9722;Inherit;False;3;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;23;-1786.443,775.0053;Inherit;True;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.DistanceOpNode;26;-869.1917,504.3452;Inherit;True;2;0;FLOAT;0;False;1;FLOAT;0.5;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;29;-1332.832,513.4062;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.DynamicAppendNode;51;-1081.675,-50.01314;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.RangedFloatNode;34;-1361.512,659.3875;Float;False;Property;_ScanlineCount;Scanline Count;10;0;Create;True;0;0;0;False;0;False;32;3;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.RoundOpNode;49;-1430.675,148.9869;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;35;-1499.84,-96.83577;Inherit;False;0;4;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;12;-196,92;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;74;386.5176,288.4572;Inherit;False;Property;_CoatSmoothness;Coat Smoothness;14;0;Create;True;0;0;0;False;0;False;0;1;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.FractNode;25;-1048.214,501.6933;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;43;-1244.988,-10.22783;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;24;-1191.586,501.8281;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;5;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;75;584.5176,187.4572;Inherit;False;Constant;_Float1;Float 1;15;0;Create;True;0;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;50;-1746.675,168.9869;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;10;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TexelSizeNode;53;-2117.675,-349.0131;Inherit;False;37;1;0;SAMPLER2D;_Sampler053;False;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleDivideOpNode;44;-1724.488,-65.9278;Inherit;True;2;0;FLOAT;0.2;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;54;-1832.675,-304.0131;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0.5;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;6;-587,285;Float;False;Property;_EmissionColor;Emission Color;3;1;[HDR];Create;True;0;0;0;False;0;False;0,0,0,0;0,0,0,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;7;-279,-45;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;8;-331,204;Inherit;True;4;4;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;3;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.FractNode;45;-1212.287,308.4723;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;5;-586,67;Float;False;Property;_Color;Color;2;0;Create;True;0;0;0;False;0;False;1,1,1,1;0.1894357,0.3113207,0.3329999,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;41;-706.7444,867.3727;Inherit;True;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;13;271,164;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.ColorNode;56;519.4634,393.2017;Float;False;Property;_Fluorescence;Fluorescence;12;0;Create;True;0;0;0;False;0;False;0.4083748,0.5377358,0.4464222,1;0.2499554,0.3867924,0.2920591,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;47;-1814.187,550.2723;Inherit;True;2;2;0;FLOAT;0;False;1;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;33;-913.2633,762.6552;Float;False;Property;_ScanlineIntensity;Scanline Intensity;9;0;Create;True;0;0;0;False;0;False;0.5;0.124;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;3;-924.6398,177.2817;Inherit;True;Property;_EmissionMap;Emission Map;0;1;[NoScaleOffset];Create;True;0;0;0;False;0;False;-1;None;3f0c59aec3c6e74448770f9846152333;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.AbsOpNode;19;75.29994,587.6;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;4;-919.6398,-44.71831;Inherit;True;Property;_MainTex;MainTex;1;0;Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.ViewDirInputsCoordNode;15;-389.0001,690.2;Float;False;World;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.PowerNode;18;84.89996,662.5002;Inherit;False;False;2;0;FLOAT;0;False;1;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ToggleSwitchNode;11;-7,130;Float;False;Property;S_EMISSIVE_MULTI;Emissive Multiplication;6;0;Create;False;0;0;0;False;0;False;0;True;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;20;-196.6515,739.8146;Float;False;Property;_EmissionFalloff;Emission Falloff;7;0;Create;True;0;0;0;False;0;False;1;0.88;0;5;0;1;FLOAT;0 +Node;AmplifyShaderEditor.ClampOpNode;22;244.7485,581.1144;Inherit;True;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;9;425,-124;Float;False;Property;_Glossiness;Glossiness;4;0;Create;True;0;0;0;False;0;False;1;0.04;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;10;425,-50;Float;False;Property;_Metallic;Metallic;5;0;Create;True;0;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;21;79.84846,764.2144;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;2;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;57;544.4634,556.2017;Float;False;Property;_Absorbance;Absorbance;13;0;Create;True;0;0;0;False;0;False;0.042,0.112,0.517,1;0.04199992,0.4259999,0.837,1;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.DotProductOpNode;16;-169.6,525.7999;Inherit;True;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.WorldNormalVector;14;-385.5001,555.4998;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;69;774,-61;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Universal2D;0;5;Universal2D;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;71;774,-61;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;GBuffer;0;7;GBuffer;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalGBuffer;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;72;774,-61;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;SceneSelectionPass;0;8;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;73;774,-61;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ScenePickingPass;0;9;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;64;774,-61;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ExtraPrePass;0;0;ExtraPrePass;5;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;0;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;65;774,-61;Half;False;True;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;SLZ/Scanline;94348b07e5e8bab40bd6c8a1e3df54cd;True;Forward;0;1;Forward;23;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalForwardOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;47;Workflow;1;0;Surface;0;0; Refraction Model;0;0; Blend;0;0;Two Sided;1;0;Fragment Normal Space,InvertActionOnDeselection;0;0;Transmission;0;0; Transmission Shadow;0.5,False,-1;0;Translucency;0;0; Translucency Strength;1,False,-1;0; Normal Distortion;0.5,False,-1;0; Scattering;2,False,-1;0; Direct;0.9,False,-1;0; Ambient;0.1,False,-1;0; Shadow;0.5,False,-1;0;Cast Shadows;1;0; Use Shadow Threshold;0;0;Receive Shadows;1;0;GPU Instancing;1;0;LOD CrossFade;0;637836073346625293;Built-in Fog;1;0;Lightmaps;1;0;Volumetrics;1;0;Decals;0;637892668756952080;Screen Space Occlusion;1;0;Light Layers;0;637892668835458876;_FinalColorxAlpha;0;0;Meta Pass;1;0;GBuffer Pass;0;0;Override Baked GI;0;0;Extra Pre Pass;0;0;DOTS Instancing;0;0;Tessellation;0;0; Phong;0;0; Strength;0.5,False,-1;0; Type;0;0; Tess;16,False,-1;0; Min;10,False,-1;0; Max;25,False,-1;0; Edge Length;16,False,-1;0; Max Displacement;25,False,-1;0;Write Depth;0;0; Early Z;0;0;Vertex Position,InvertActionOnDeselection;1;0;Debug Display;0;0;Clear Coat;1;637892669717331784;Fluorescence;1;637892668684714568;0;10;False;True;True;True;True;True;True;False;True;True;False;;True;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;66;774,-61;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ShadowCaster;0;2;ShadowCaster;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=ShadowCaster;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;67;774,-61;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthOnly;0;3;DepthOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;False;False;True;1;LightMode=DepthOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;68;774,-61;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Meta;0;4;Meta;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Meta;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;70;774,-61;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthNormals;0;6;DepthNormals;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormalsOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +WireConnection;52;0;54;0 +WireConnection;32;1;26;0 +WireConnection;32;2;33;0 +WireConnection;48;0;50;0 +WireConnection;55;0;52;0 +WireConnection;30;0;47;0 +WireConnection;46;0;44;0 +WireConnection;46;1;49;0 +WireConnection;46;2;55;0 +WireConnection;26;0;25;0 +WireConnection;29;0;23;2 +WireConnection;29;1;30;0 +WireConnection;51;0;35;1 +WireConnection;51;1;43;0 +WireConnection;49;0;48;0 +WireConnection;12;0;7;0 +WireConnection;12;1;8;0 +WireConnection;25;0;24;0 +WireConnection;43;0;35;2 +WireConnection;43;1;46;0 +WireConnection;24;0;29;0 +WireConnection;24;1;34;0 +WireConnection;50;0;28;0 +WireConnection;44;1;53;4 +WireConnection;54;0;38;2 +WireConnection;7;0;4;0 +WireConnection;7;1;5;0 +WireConnection;8;0;3;0 +WireConnection;8;1;6;0 +WireConnection;8;2;32;0 +WireConnection;8;3;41;0 +WireConnection;41;0;37;0 +WireConnection;41;1;42;0 +WireConnection;13;0;8;0 +WireConnection;13;1;22;0 +WireConnection;47;0;28;0 +WireConnection;47;1;31;0 +WireConnection;3;1;51;0 +WireConnection;19;0;16;0 +WireConnection;4;1;35;0 +WireConnection;18;0;19;0 +WireConnection;18;1;21;0 +WireConnection;11;0;8;0 +WireConnection;11;1;12;0 +WireConnection;22;0;18;0 +WireConnection;21;0;20;0 +WireConnection;16;0;14;0 +WireConnection;16;1;15;0 +WireConnection;65;0;7;0 +WireConnection;65;2;13;0 +WireConnection;65;3;10;0 +WireConnection;65;4;9;0 +WireConnection;65;18;75;0 +WireConnection;65;19;74;0 +WireConnection;65;21;56;0 +WireConnection;65;22;57;0 +ASEEND*/ +//CHKSM=A61871AC4C1B0DB16147C28EFAC8E31AD93C90EC \ No newline at end of file diff --git a/Assets/SLZShaders/Scanline.shader.meta b/Assets/SLZShaders/Scanline.shader.meta new file mode 100644 index 0000000..6535007 --- /dev/null +++ b/Assets/SLZShaders/Scanline.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: ae467daa42d17ee45b6947a14ec8ec96 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/SimpleSkybox.shader b/Assets/SLZShaders/SimpleSkybox.shader new file mode 100644 index 0000000..34ed14f --- /dev/null +++ b/Assets/SLZShaders/SimpleSkybox.shader @@ -0,0 +1,1786 @@ +// Made with Amplify Shader Editor +// Available at the Unity Asset Store - http://u3d.as/y3X +Shader "SLZ/Simple Geo Skybox" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1) + [ASEEnd][ASEBegin][HDR][NoScaleOffset]_BaseMap("BaseMap", CUBE) = "white" {} + + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5 + //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16 + //_TessMin( "Tess Min Distance", Float ) = 10 + //_TessMax( "Tess Max Distance", Float ) = 25 + //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16 + //_TessMaxDisp( "Tess Max Displacement", Float ) = 25 + } + + SubShader + { + LOD 0 + + + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Opaque" "Queue"="Geometry" } + + Cull Back + AlphaToMask Off + + HLSLINCLUDE + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma target 5.0 + + //#pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + + + #ifndef ASE_TESS_FUNCS + #define ASE_TESS_FUNCS + float4 FixedTess( float tessValue ) + { + return tessValue; + } + + float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos ) + { + float3 wpos = mul(o2w,vertex).xyz; + float dist = distance (wpos, cameraPos); + float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess; + return f; + } + + float4 CalcTriEdgeTessFactors (float3 triVertexFactors) + { + float4 tess; + tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z); + tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z); + tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y); + tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f; + return tess; + } + + float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams ) + { + float dist = distance (0.5 * (wpos0+wpos1), cameraPos); + float len = distance(wpos0, wpos1); + float f = max(len * scParams.y / (edgeLen * dist), 1.0); + return f; + } + + float DistanceFromPlane (float3 pos, float4 plane) + { + float d = dot (float4(pos,1.0f), plane); + return d; + } + + bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] ) + { + float4 planeTest; + planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f ); + return !all (planeTest); + } + + float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos ) + { + float3 f; + f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos); + f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos); + f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos); + + return CalcTriEdgeTessFactors (f); + } + + float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + return tess; + } + + float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + + if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes)) + { + tess = 0.0f; + } + else + { + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + } + return tess; + } + #endif //ASE_TESS_FUNCS + + ENDHLSL + + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForwardOnly" } + + Blend One Zero, One Zero + ZWrite On + ZTest LEqual + Offset 0,0 + ColorMask RGBA + + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_SRP_VERSION 999999 + + + //#pragma multi_compile _ LIGHTMAP_ON + //#pragma multi_compile _ DIRLIGHTMAP_COMBINED + //#pragma shader_feature _ _SAMPLE_GI + //#pragma multi_compile _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + //#pragma multi_compile _ DEBUG_DISPLAY + #define SHADERPASS SHADERPASS_UNLIT + + + #pragma vertex vert + #pragma fragment frag + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/Debugging3D.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceData.hlsl" + + + #define ASE_NEEDS_FRAG_WORLD_POSITION + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + #ifdef ASE_FOG + float fogFactor : TEXCOORD2; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + samplerCUBE _BaseMap; + + + + VertexOutput VertexFunction ( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + #ifdef ASE_FOG + o.fogFactor = ComputeFogFactor( positionCS.z ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag ( VertexOutput IN ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + float3 ase_worldViewDir = ( _WorldSpaceCameraPos.xyz - WorldPosition ); + ase_worldViewDir = normalize(ase_worldViewDir); + half4 texCUBENode5 = texCUBElod( _BaseMap, float4( -ase_worldViewDir, 0.0) ); + + half3 BakedAlbedo = 0; + half3 BakedEmission = 0; + half3 Color = texCUBENode5.rgb; + half Alpha = 1; + half AlphaClipThreshold = 0.5; + half AlphaClipThresholdShadow = 0.5; + + #ifdef _ALPHATEST_ON + clip( Alpha - AlphaClipThreshold ); + #endif + + #if defined(_DBUFFER) + ApplyDecalToBaseColor(IN.clipPos, Color); + #endif + + #if defined(_ALPHAPREMULTIPLY_ON) + Color *= Alpha; + #endif + + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + + #ifdef ASE_FOG + //Color = MixFog( Color, IN.fogFactor ); + half3 viewDirectionWS = normalize(IN.worldPos - _WorldSpaceCameraPos); + Color.rgb = MixFog(Color.rgb, viewDirectionWS, IN.fogFactor); + #endif + half4 output = half4(Color, Alpha); + #ifdef _VOLUMETRICS_ENABLED + output = Volumetrics(output, IN.worldPos); + #endif + + return output; + } + + ENDHLSL + } + + + Pass + { + + Name "DepthOnly" + Tags { "LightMode"="DepthOnly" } + + ZWrite On + ColorMask 0 + AlphaToMask Off + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #define ASE_NEEDS_FRAG_WORLD_POSITION + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_SRP_VERSION 999999 + + + #pragma vertex vert + #pragma fragment frag + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.clipPos = TransformWorldToHClip( positionWS ); + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = o.clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + return 0; + } + ENDHLSL + } + + + Pass + { + + Name "Universal2D" + Tags { "LightMode"="Universal2D" } + + Blend One Zero, One Zero + ZWrite On + ZTest LEqual + Offset 0,0 + ColorMask RGBA + + + HLSLPROGRAM +#pragma multi_compile_instancing#define _RECEIVE_SHADOWS_OFF 1#pragma multi_compile_fog#define ASE_FOG 1#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED#define ASE_SRP_VERSION 999999 +#if FALSE + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma shader_feature _ _SAMPLE_GI + #pragma multi_compile _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile _ DEBUG_DISPLAY + #define SHADERPASS SHADERPASS_UNLIT + + + #pragma vertex vert + #pragma fragment frag + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/Debugging3D.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceData.hlsl" + + + #define ASE_NEEDS_FRAG_WORLD_POSITION + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + #ifdef ASE_FOG + float fogFactor : TEXCOORD2; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + samplerCUBE _BaseMap; + + + + VertexOutput VertexFunction ( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + #ifdef ASE_FOG + o.fogFactor = ComputeFogFactor( positionCS.z ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag ( VertexOutput IN ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + float3 ase_worldViewDir = ( _WorldSpaceCameraPos.xyz - WorldPosition ); + ase_worldViewDir = normalize(ase_worldViewDir); + half4 texCUBENode5 = texCUBElod( _BaseMap, float4( -ase_worldViewDir, 0.0) ); + + float3 BakedAlbedo = 0; + float3 BakedEmission = 0; + float3 Color = texCUBENode5.rgb; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + + #ifdef _ALPHATEST_ON + clip( Alpha - AlphaClipThreshold ); + #endif + + #if defined(_DBUFFER) + ApplyDecalToBaseColor(IN.clipPos, Color); + #endif + + #if defined(_ALPHAPREMULTIPLY_ON) + Color *= Alpha; + #endif + + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_FOG + Color = MixFog( Color, IN.fogFactor ); + #endif + + return half4( Color, Alpha ); + } +#endif + ENDHLSL + } + + + + Pass + { + + Name "SceneSelectionPass" + Tags { "LightMode"="SceneSelectionPass" } + + Cull Off + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #define ASE_NEEDS_FRAG_WORLD_POSITION + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_SRP_VERSION 999999 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + int _ObjectId; + int _PassValue; + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if _ALPHATEST_ON + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = half4(_ObjectId, _PassValue, 1.0, 1.0); + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "ScenePickingPass" + Tags { "LightMode"="Picking" } + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #define ASE_NEEDS_FRAG_WORLD_POSITION + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_SRP_VERSION 999999 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + + float4 _SelectionID; + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if _ALPHATEST_ON + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = 0; + outColor = _SelectionID; + + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "DepthNormals" + Tags { "LightMode"="DepthNormalsOnly" } + + ZTest LEqual + ZWrite On + + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #define ASE_NEEDS_FRAG_WORLD_POSITION + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_SRP_VERSION 999999 + + + #pragma only_renderers d3d11 glcore gles gles3 + //#pragma multi_compile_fog + #pragma instancing_options renderinglayer + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define VARYINGS_NEED_NORMAL_WS + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float3 normalWS : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal(v.ase_normal); + + o.clipPos = TransformWorldToHClip(positionWS); + o.normalWS.xyz = normalWS; + + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + #if _ALPHATEST_ON + clip(surfaceDescription.Alpha - surfaceDescription.AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + float3 normalWS = IN.normalWS; + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + + } + + ENDHLSL + } + + + Pass + { + + Name "DepthNormalsOnly" + Tags { "LightMode"="DepthNormalsOnly" } + + ZTest LEqual + ZWrite On + + + HLSLPROGRAM + + #pragma multi_compile_instancing + #define _RECEIVE_SHADOWS_OFF 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #define ASE_NEEDS_FRAG_WORLD_POSITION + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_SRP_VERSION 999999 + + + #pragma exclude_renderers glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define ATTRIBUTES_NEED_TEXCOORD1 + #define VARYINGS_NEED_NORMAL_WS + #define VARYINGS_NEED_TANGENT_WS + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float3 normalWS : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal(v.ase_normal); + + o.clipPos = TransformWorldToHClip(positionWS); + o.normalWS.xyz = normalWS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + #if _ALPHATEST_ON + clip(surfaceDescription.Alpha - surfaceDescription.AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + float3 normalWS = IN.normalWS; + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + + } + + ENDHLSL + } + + } + + CustomEditor "UnityEditor.ShaderGraphUnlitGUI" + Fallback "Hidden/InternalErrorShader" + +} +/*ASEBEGIN +Version=18935 +2678;198;1538;978;933.8952;716.6381;1.807404;True;True +Node;AmplifyShaderEditor.ViewDirInputsCoordNode;6;-971.2615,-126.0529;Inherit;False;World;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.RangedFloatNode;13;-595.4363,49.93512;Inherit;False;Constant;_Float0;Float 0;1;0;Create;True;0;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorSpaceDouble;10;-441.8362,157.5351;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.WorldPosInputsNode;26;-70.63371,71.13003;Inherit;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.FunctionNode;44;205.1276,65.41274;Inherit;False;VolumetricsUnlit;-1;;1;800698b1441791d449f3e84fa3283d1e;0;2;2;FLOAT4;0,0,0,0;False;3;FLOAT3;0,0,0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.NegateNode;7;-691.2615,-99.05289;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.SamplerNode;5;-436.2615,-88.05289;Inherit;True;Property;_BaseMap;BaseMap;0;2;[HDR];[NoScaleOffset];Create;True;0;0;0;False;0;False;-1;None;115f13f0a868a454e9cdcee7cf7dba60;True;0;False;white;LockedToCube;False;Object;-1;MipLevel;Cube;8;0;SAMPLERCUBE;;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT3;0,0,0;False;4;FLOAT3;0,0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;43;405.1046,-78.74908;Inherit;False;Constant;_Float1;Float 1;1;0;Create;True;0;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;11;-211.4362,152.4351;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;54;587.1003,-38.3;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;DepthNormalsOnly;0;9;DepthNormalsOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormalsOnly;False;True;15;d3d9;d3d11_9x;d3d11;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;46;779.1003,-51.3;Half;False;True;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;3;SLZ/Simple Geo Skybox;2992e84f91cbeb14eab234972e07ea9d;True;Forward;0;1;Forward;8;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;True;True;1;False;-1;True;3;False;-1;True;False;0;False;-1;0;False;-1;True;1;LightMode=UniversalForwardOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;23;Surface;0;0; Blend;0;0;Two Sided;1;0;Cast Shadows;0;637807401842264069; Use Shadow Threshold;0;0;Receive Shadows;0;637807401834704909;GPU Instancing;1;0;LOD CrossFade;0;0;Built-in Fog;1;637993323652933281;Volumetrics;1;638005268622411681;DOTS Instancing;0;0;Meta Pass;0;0;Extra Pre Pass;0;0;Tessellation;0;0; Phong;0;0; Strength;0.5,False,-1;0; Type;0;0; Tess;16,False,-1;0; Min;10,False,-1;0; Max;25,False,-1;0; Edge Length;16,False,-1;0; Max Displacement;25,False,-1;0;Vertex Position,InvertActionOnDeselection;1;0;0;10;False;True;False;True;False;True;True;True;True;True;False;;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;50;587.1003,-38.3;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;Universal2D;0;5;Universal2D;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;False;0;False;-1;0;False;-1;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;52;587.1003,-38.3;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;ScenePickingPass;0;7;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;48;587.1003,-38.3;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;DepthOnly;0;3;DepthOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;False;False;True;1;LightMode=DepthOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;47;587.1003,-38.3;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;ShadowCaster;0;2;ShadowCaster;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=ShadowCaster;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;53;587.1003,-38.3;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;DepthNormals;0;8;DepthNormals;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormalsOnly;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;49;587.1003,-38.3;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;Meta;0;4;Meta;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Meta;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;45;587.1003,-38.3;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;ExtraPrePass;0;0;ExtraPrePass;5;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;0;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;51;587.1003,-38.3;Float;False;False;-1;2;UnityEditor.ShaderGraphUnlitGUI;0;1;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;SceneSelectionPass;0;6;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;7;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +WireConnection;44;2;5;0 +WireConnection;44;3;26;0 +WireConnection;7;0;6;0 +WireConnection;5;1;7;0 +WireConnection;5;2;13;0 +WireConnection;11;0;5;0 +WireConnection;11;1;10;0 +WireConnection;46;2;5;0 +ASEEND*/ +//CHKSM=FE0C017DDD4CAF33D48E7830284AFEDD48DFDB24 \ No newline at end of file diff --git a/Assets/SLZShaders/SimpleSkybox.shader.meta b/Assets/SLZShaders/SimpleSkybox.shader.meta new file mode 100644 index 0000000..e7fd647 --- /dev/null +++ b/Assets/SLZShaders/SimpleSkybox.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7276a03ae0651b1419b50e2c76272732 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/TMP_SDF-URP Lit Baked.shader b/Assets/SLZShaders/TMP_SDF-URP Lit Baked.shader new file mode 100644 index 0000000..e15eb19 --- /dev/null +++ b/Assets/SLZShaders/TMP_SDF-URP Lit Baked.shader @@ -0,0 +1,4027 @@ +Shader "Baked Shadergraphs/TMP_SDF-URP Lit" +{ + Properties + { + [NoScaleOffset]_MainTex("_MainTex", 2D) = "white" {} + _OutlineOffset1("_OutlineOffset1", Vector) = (0, 0, 0, 0) + _OutlineOffset2("_OutlineOffset2", Vector) = (0, 0, 0, 0) + _OutlineOffset3("_OutlineOffset3", Vector) = (0, 0, 0, 0) + _GradientScale("_GradientScale", Float) = 10 + [HDR]_FaceColor("_FaceColor", Color) = (1, 1, 1, 1) + _IsoPerimeter("Outline Width", Vector) = (0, 0, 0, 0) + [HDR]_OutlineColor1("_OutlineColor1", Color) = (0, 1, 0.9600265, 1) + [HDR]_OutlineColor2("_OutlineColor2", Color) = (0, 0.06557035, 1, 1) + [HDR]_OutlineColor3("_OutlineColor3", Color) = (0, 0, 0, 0) + [ToggleUI]_OutlineMode("_OutlineMode", Float) = 0 + _Softness("_Softness", Vector) = (0, 0, 0, 0) + [NoScaleOffset]_FaceTex("_FaceTex", 2D) = "white" {} + _FaceUVSpeed("_FaceUVSpeed", Vector) = (0, 0, 0, 0) + _FaceTex_ST("_FaceTex_ST", Vector) = (2, 2, 0, 0) + _OutlineTex_ST("_OutlineTex_ST", Vector) = (1, 1, 0, 0) + _OutlineUVSpeed("_OutlineUVSpeed", Vector) = (0, 0, 0, 0) + _UnderlayColor("_UnderlayColor", Color) = (0, 0, 0, 1) + _UnderlayOffset("_UnderlayOffset", Vector) = (0, 0, 0, 0) + _UnderlayDilate("_UnderlayDilate", Float) = 0 + _UnderlaySoftness("_UnderlaySoftness", Float) = 0 + [ToggleUI]_BevelType("_BevelType", Float) = 0 + _BevelAmount("_BevelAmount", Range(0, 1)) = 0 + _BevelOffset("_BevelOffset", Range(-0.5, 0.5)) = 0 + _BevelWidth("_BevelWidth", Range(0, 0.5)) = 0.5 + _BevelRoundness("_BevelRoundness", Range(0, 1)) = 0 + _BevelClamp("_BevelClamp", Range(0, 1)) = 0 + [HDR]_SpecularColor("Light color", Color) = (1, 1, 1, 1) + _LightAngle("_LightAngle", Range(0, 6.28)) = 0 + _SpecularPower("_SpecularPower", Range(0, 4)) = 0 + _Reflectivity("Reflectivity Power", Range(5, 15)) = 5 + _Diffuse("Diffuse Shadow", Range(0, 1)) = 0.3 + _Ambient("Ambient Shadow", Range(0, 1)) = 0.3 + [NoScaleOffset]_OutlineTex("_OutlineTex", 2D) = "white" {} + _ScaleRatioA("_ScaleRatioA", Float) = 0 + Emissive("Emissive", Color) = (0, 0, 0, 0) + _smoothness("Smoothness", Range(0, 1)) = 0.5 + _Metalic("Metalic", Range(0, 1)) = 0 + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + } + SubShader + { + Tags + { + "RenderPipeline"="UniversalPipeline" + "RenderType"="Transparent" + "UniversalMaterialType" = "Lit" + "Queue"="Transparent" + "ShaderGraphShader"="true" + "ShaderGraphTargetId"="UniversalLitSubTarget" + } + Pass + { + Name "Universal Forward" + Tags + { + "LightMode" = "UniversalForward" + } + + // Render State + Cull Off + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + ZTest LEqual + ZWrite Off + + // Debug + // + + // -------------------------------------------------- + // Pass + + HLSLPROGRAM + + // Pragmas + #pragma target 4.5 + #pragma exclude_renderers gles gles3 glcore + #pragma multi_compile_instancing + #pragma multi_compile_fog + //#pragma instancing_options renderinglayer + //#pragma multi_compile _ DOTS_INSTANCING_ON + #pragma vertex vert + #pragma fragment frag + + // DotsInstancingOptions: + // HybridV1InjectedBuiltinProperties: + + // Keywords + //#pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION + #pragma multi_compile _ _VOLUMETRICS_ENABLED + #define _DISABLE_LIGHTMAPS + #define _DISABLE_REFLECTIONPROBES + #define _DISABLE_SSAO + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DefaultLitVariants.hlsl" + /* + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile _ DYNAMICLIGHTMAP_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN + #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS + #pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION + #pragma multi_compile_fragment _ _SHADOWS_SOFT + #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING + #pragma multi_compile _ SHADOWS_SHADOWMASK + #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile_fragment _ _LIGHT_LAYERS + #pragma multi_compile_fragment _ DEBUG_DISPLAY + #pragma multi_compile_fragment _ _LIGHT_COOKIES + #pragma multi_compile _ _CLUSTERED_RENDERING + */ + // GraphKeywords: + + // Defines + + #define _NORMALMAP 1 + #define _NORMAL_DROPOFF_TS 1 + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define ATTRIBUTES_NEED_TEXCOORD0 + #define ATTRIBUTES_NEED_TEXCOORD1 + #define ATTRIBUTES_NEED_TEXCOORD2 + #define ATTRIBUTES_NEED_TEXCOORD3 + #define ATTRIBUTES_NEED_COLOR + #define VARYINGS_NEED_POSITION_WS + #define VARYINGS_NEED_NORMAL_WS + #define VARYINGS_NEED_TANGENT_WS + #define VARYINGS_NEED_TEXCOORD0 + #define VARYINGS_NEED_TEXCOORD1 + #define VARYINGS_NEED_TEXCOORD2 + #define VARYINGS_NEED_TEXCOORD3 + #define VARYINGS_NEED_COLOR + #define VARYINGS_NEED_VIEWDIRECTION_WS + #define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT + #define VARYINGS_NEED_SHADOW_COORD + #define VARYINGS_NEED_CULLFACE + #define FEATURES_GRAPH_VERTEX + /* WARNING: $splice Could not find named fragment 'PassInstancing' */ + #define SHADERPASS SHADERPASS_FORWARD + #define _FOG_FRAGMENT 1 + #define _SURFACE_TYPE_TRANSPARENT 1 + #define _ALPHATEST_ON 1 + /* WARNING: $splice Could not find named fragment 'DotsInstancingVars' */ + + + // custom interpolator pre-include + /* WARNING: $splice Could not find named fragment 'sgci_CustomInterpolatorPreInclude' */ + + // Includes + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + // -------------------------------------------------- + // Structs and Packing + + // custom interpolators pre packing + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPrePacking' */ + + struct Attributes + { + float3 positionOS : POSITION; + float3 normalOS : NORMAL; + float4 tangentOS : TANGENT; + float4 uv0 : TEXCOORD0; + float4 uv1 : TEXCOORD1; + float4 uv2 : TEXCOORD2; + float4 uv3 : TEXCOORD3; + float4 color : COLOR; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : INSTANCEID_SEMANTIC; + #endif + }; + struct Varyings + { + float4 positionCS : SV_POSITION; + float3 positionWS; + float3 normalWS; + float4 tangentWS; + float4 texCoord0; + float4 texCoord1; + float4 texCoord2; + float4 texCoord3; + float4 color; + float3 viewDirectionWS; + #if defined(LIGHTMAP_ON) + float2 staticLightmapUV; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV; + #endif + #if !defined(LIGHTMAP_ON) + float3 sh; + #endif + float4 fogFactorAndVertexLight; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord; + #endif + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + struct SurfaceDescriptionInputs + { + float3 TangentSpaceNormal; + float4 uv0; + float4 uv1; + float4 uv2; + float4 uv3; + float4 VertexColor; + float FaceSign; + }; + struct VertexDescriptionInputs + { + float3 ObjectSpaceNormal; + float3 ObjectSpaceTangent; + float3 ObjectSpacePosition; + }; + struct PackedVaryings + { + float4 positionCS : SV_POSITION; + float3 interp0 : INTERP0; + float3 interp1 : INTERP1; + float4 interp2 : INTERP2; + float4 interp3 : INTERP3; + float4 interp4 : INTERP4; + float4 interp5 : INTERP5; + float4 interp6 : INTERP6; + float4 interp7 : INTERP7; + float3 interp8 : INTERP8; + float2 interp9 : INTERP9; + float2 interp10 : INTERP10; + float3 interp11 : INTERP11; + float4 interp12 : INTERP12; + float4 interp13 : INTERP13; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + + PackedVaryings PackVaryings (Varyings input) + { + PackedVaryings output; + ZERO_INITIALIZE(PackedVaryings, output); + output.positionCS = input.positionCS; + output.interp0.xyz = input.positionWS; + output.interp1.xyz = input.normalWS; + output.interp2.xyzw = input.tangentWS; + output.interp3.xyzw = input.texCoord0; + output.interp4.xyzw = input.texCoord1; + output.interp5.xyzw = input.texCoord2; + output.interp6.xyzw = input.texCoord3; + output.interp7.xyzw = input.color; + output.interp8.xyz = input.viewDirectionWS; + #if defined(LIGHTMAP_ON) + output.interp9.xy = input.staticLightmapUV; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + output.interp10.xy = input.dynamicLightmapUV; + #endif + #if !defined(LIGHTMAP_ON) + output.interp11.xyz = input.sh; + #endif + output.interp12.xyzw = input.fogFactorAndVertexLight; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + output.interp13.xyzw = input.shadowCoord; + #endif + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + Varyings UnpackVaryings (PackedVaryings input) + { + Varyings output; + output.positionCS = input.positionCS; + output.positionWS = input.interp0.xyz; + output.normalWS = input.interp1.xyz; + output.tangentWS = input.interp2.xyzw; + output.texCoord0 = input.interp3.xyzw; + output.texCoord1 = input.interp4.xyzw; + output.texCoord2 = input.interp5.xyzw; + output.texCoord3 = input.interp6.xyzw; + output.color = input.interp7.xyzw; + output.viewDirectionWS = input.interp8.xyz; + #if defined(LIGHTMAP_ON) + output.staticLightmapUV = input.interp9.xy; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + output.dynamicLightmapUV = input.interp10.xy; + #endif + #if !defined(LIGHTMAP_ON) + output.sh = input.interp11.xyz; + #endif + output.fogFactorAndVertexLight = input.interp12.xyzw; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + output.shadowCoord = input.interp13.xyzw; + #endif + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + + // -------------------------------------------------- + // Graph + + // Graph Properties + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_TexelSize; + float2 _OutlineOffset1; + float2 _OutlineOffset2; + float2 _OutlineOffset3; + float _GradientScale; + float4 _FaceColor; + float4 _IsoPerimeter; + float4 _OutlineColor1; + float4 _OutlineColor2; + float4 _OutlineColor3; + float _OutlineMode; + float3 _Softness; + float4 _FaceTex_TexelSize; + float2 _FaceUVSpeed; + float4 _FaceTex_ST; + float4 _OutlineTex_ST; + float2 _OutlineUVSpeed; + float4 _UnderlayColor; + float2 _UnderlayOffset; + float _UnderlayDilate; + float _UnderlaySoftness; + float _BevelType; + float _BevelAmount; + float _BevelOffset; + float _BevelWidth; + float _BevelRoundness; + float _BevelClamp; + float4 _SpecularColor; + float _LightAngle; + float _SpecularPower; + float _Reflectivity; + float _Diffuse; + float _Ambient; + float4 _OutlineTex_TexelSize; + float _ScaleRatioA; + float4 Emissive; + float _smoothness; + float _Metalic; + CBUFFER_END + + // Object and Global properties + SAMPLER(SamplerState_Linear_Repeat); + TEXTURE2D(_MainTex); + SAMPLER(sampler_MainTex); + TEXTURE2D(_FaceTex); + SAMPLER(sampler_FaceTex); + SAMPLER(SamplerState_Linear_Clamp); + TEXTURE2D(_OutlineTex); + SAMPLER(sampler_OutlineTex); + + // Graph Includes + #include "Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl" + + // -- Property used by ScenePickingPass + #ifdef SCENEPICKINGPASS + float4 _SelectionID; + #endif + + // -- Properties used by SceneSelectionPass + #ifdef SCENESELECTIONPASS + int _ObjectId; + int _PassValue; + #endif + + // Graph Functions + + void Unity_Combine_float(float R, float G, float B, float A, out float4 RGBA, out float3 RGB, out float2 RG) + { + RGBA = float4(R, G, B, A); + RGB = float3(R, G, B); + RG = float2(R, G); + } + + void Unity_Divide_float4(float4 A, float4 B, out float4 Out) + { + Out = A / B; + } + + void Unity_Multiply_float2_float2(float2 A, float2 B, out float2 Out) + { + Out = A * B; + } + + void Unity_Subtract_float2(float2 A, float2 B, out float2 Out) + { + Out = A - B; + } + + void Unity_Multiply_float4_float4(float4 A, float4 B, out float4 Out) + { + Out = A * B; + } + + // Custom interpolators pre vertex + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreVertex' */ + + // Graph Vertex + struct VertexDescription + { + float3 Position; + float3 Normal; + float3 Tangent; + }; + + VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN) + { + VertexDescription description = (VertexDescription)0; + description.Position = IN.ObjectSpacePosition; + description.Normal = IN.ObjectSpaceNormal; + description.Tangent = IN.ObjectSpaceTangent; + return description; + } + + // Custom interpolators, pre surface + #ifdef FEATURES_GRAPH_VERTEX + Varyings CustomInterpolatorPassThroughFunc(inout Varyings output, VertexDescription input) + { + return output; + } + #define CUSTOMINTERPOLATOR_VARYPASSTHROUGH_FUNC + #endif + + // Graph Pixel + struct SurfaceDescription + { + float3 BaseColor; + float3 NormalTS; + float3 Emission; + float Metallic; + float Smoothness; + float Occlusion; + float Alpha; + float AlphaClipThreshold; + }; + + SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN) + { + SurfaceDescription surface = (SurfaceDescription)0; + float4 _UV_533a59502f0abc8bb2c09828f32ebead_Out_0 = IN.uv0; + UnityTexture2D _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.z; + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Height_2 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.w; + float _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3; + ScreenSpaceRatio_float((_UV_533a59502f0abc8bb2c09828f32ebead_Out_0.xy), _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0, 0, _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3); + UnityTexture2D _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(IN.uv0.xy)); + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_R_4 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.r; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_G_5 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.g; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_B_6 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.b; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.a; + float4 _UV_b26868a97b712882abeca1b58698beb0_Out_0 = IN.uv0; + float2 _Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0 = _OutlineOffset1; + float _Property_c650c0154e947e898564d7d1d007d48e_Out_0 = _GradientScale; + UnityTexture2D _Property_6e377359c1349380b9482e9613fcec6b_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.z; + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.w; + float4 _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4; + float3 _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5; + float2 _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6; + Unity_Combine_float(_TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0, _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2, 0, 0, _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5, _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6); + float4 _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2; + Unity_Divide_float4((_Property_c650c0154e947e898564d7d1d007d48e_Out_0.xxxx), _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2); + float2 _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2; + Unity_Multiply_float2_float2(_Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2); + float2 _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2, _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2); + float4 _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_8ecda3d29d47068e8b76538959fab084_Out_2)); + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_R_4 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.r; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_G_5 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.g; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_B_6 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.b; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.a; + float2 _Property_5a3269796f550283a99abee895aeedd4_Out_0 = _OutlineOffset2; + float2 _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2; + Unity_Multiply_float2_float2((_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Property_5a3269796f550283a99abee895aeedd4_Out_0, _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2); + float2 _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2, _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2); + float4 _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2)); + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_R_4 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.r; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_G_5 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.g; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_B_6 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.b; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.a; + float2 _Property_20cbcbce438f6581847bd3da66673af8_Out_0 = _OutlineOffset3; + float2 _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2; + Unity_Multiply_float2_float2(_Property_20cbcbce438f6581847bd3da66673af8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2); + float2 _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2, _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2); + float4 _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2)); + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_R_4 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.r; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_G_5 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.g; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_B_6 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.b; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.a; + float4 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4; + float3 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5; + float2 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6; + Unity_Combine_float(_SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7, _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7, _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7, _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6); + float _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0 = _GradientScale; + float4 _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0 = _IsoPerimeter; + float3 _Property_05d545af6f7ff08387320e1130c67389_Out_0 = _Softness; + float _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0 = _OutlineMode; + float4 _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6; + ComputeSDF44_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0, _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0, (float4(_Property_05d545af6f7ff08387320e1130c67389_Out_0, 1.0)), _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0, _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6); + float4 _Property_eaed1eca838e7183ae708f9502a50dba_Out_0 = _FaceColor; + UnityTexture2D _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0 = UnityBuildTexture2DStructNoScale(_FaceTex); + float4 _UV_90e11fefcc71b18b8d88b417548d224f_Out_0 = IN.uv0; + float4 _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0 = _FaceTex_ST; + float2 _Property_ced4707a1339568eb002c789407f8a3b_Out_0 = _FaceUVSpeed; + float2 _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3; + GenerateUV_float((_UV_90e11fefcc71b18b8d88b417548d224f_Out_0.xy), _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0, _Property_ced4707a1339568eb002c789407f8a3b_Out_0, _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3); + float4 _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0 = SAMPLE_TEXTURE2D(_Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.tex, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.samplerstate, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.GetTransformedUV(_GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3)); + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_R_4 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.r; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_G_5 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.g; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_B_6 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.b; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_A_7 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.a; + float4 _Multiply_48133834a18f14828ac11b58bc205702_Out_2; + Unity_Multiply_float4_float4(_Property_eaed1eca838e7183ae708f9502a50dba_Out_0, _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0, _Multiply_48133834a18f14828ac11b58bc205702_Out_2); + float4 _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2; + Unity_Multiply_float4_float4(IN.VertexColor, _Multiply_48133834a18f14828ac11b58bc205702_Out_2, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2); + float4 _Property_4637336160f04f8397ca8f3b6531e88e_Out_0 = _OutlineColor1; + UnityTexture2D _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0 = UnityBuildTexture2DStructNoScale(_OutlineTex); + float4 _UV_343788cf38e6598db275321a22b05984_Out_0 = IN.uv0; + float4 _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0 = _OutlineTex_ST; + float2 _Property_11ca84fc4adc63868541229e4f404eae_Out_0 = _OutlineUVSpeed; + float2 _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3; + GenerateUV_float((_UV_343788cf38e6598db275321a22b05984_Out_0.xy), _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0, _Property_11ca84fc4adc63868541229e4f404eae_Out_0, _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3); + float4 _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0 = SAMPLE_TEXTURE2D(_Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.tex, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.samplerstate, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.GetTransformedUV(_GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3)); + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_R_4 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.r; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_G_5 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.g; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_B_6 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.b; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_A_7 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.a; + float4 _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2; + Unity_Multiply_float4_float4(_Property_4637336160f04f8397ca8f3b6531e88e_Out_0, _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2); + float4 _Property_6e8acbed3933c6819383cb89fe70a942_Out_0 = _OutlineColor2; + float2 _Property_baa8c75173022e86bde4cc075585af43_Out_0 = _OutlineOffset3; + float4 _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5; + Layer4_float(_ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2, _Property_6e8acbed3933c6819383cb89fe70a942_Out_0, (float4(_Property_baa8c75173022e86bde4cc075585af43_Out_0, 0.0, 1.0)), _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5); + UnityTexture2D _Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + UnityTexture2D _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_abc928409a963289955625c60e3c3674_Width_0 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.z; + float _TexelSize_abc928409a963289955625c60e3c3674_Height_2 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.w; + float4 _UV_7afe81a63629c789aece6cf7ed368769_Out_0 = IN.uv0; + float _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0 = max(0, IN.FaceSign.x); + float3 _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5; + GetSurfaceNormal_float(_Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0.tex, _TexelSize_abc928409a963289955625c60e3c3674_Width_0, _TexelSize_abc928409a963289955625c60e3c3674_Height_2, (_UV_7afe81a63629c789aece6cf7ed368769_Out_0).x, _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5); + float4 _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2; + EvaluateLight_float(_Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5, _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2); + UnityTexture2D _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _UV_87b50231796c43898a28be7b2f8daea3_Out_0 = IN.uv0; + float2 _Property_c20a130451687b8c87b5a623d8ca6d73_Out_0 = _UnderlayOffset; + float2 _Multiply_7d754a30a319c9839ca945e596548e63_Out_2; + Unity_Multiply_float2_float2(_Property_c20a130451687b8c87b5a623d8ca6d73_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2); + float2 _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2; + Unity_Subtract_float2((_UV_87b50231796c43898a28be7b2f8daea3_Out_0.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2, _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2); + float4 _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0 = SAMPLE_TEXTURE2D(_Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.tex, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.samplerstate, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.GetTransformedUV(_Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2)); + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_R_4 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.r; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_G_5 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.g; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_B_6 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.b; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_A_7 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.a; + float _Property_cb906f6db0fb388a91590590b04091ab_Out_0 = _GradientScale; + float _Property_22272afe5996178386aac669fbda451b_Out_0 = _UnderlayDilate; + float _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0 = _UnderlaySoftness; + float _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0; + ComputeSDF_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, (_SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0).x, _Property_cb906f6db0fb388a91590590b04091ab_Out_0, _Property_22272afe5996178386aac669fbda451b_Out_0, _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0, _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0); + float4 _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0 = _UnderlayColor; + float4 _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2; + Layer1_float(_ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0, _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2); + float4 _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2; + Composite_float(_EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2, _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2); + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_R_1 = IN.VertexColor[0]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_G_2 = IN.VertexColor[1]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_B_3 = IN.VertexColor[2]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4 = IN.VertexColor[3]; + float4 _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2; + Unity_Multiply_float4_float4(_CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2, (_Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4.xxxx), _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2); + float4 _Property_c74b31cf958e978797249554cd8dd6be_Out_0 = Emissive; + float4 _Multiply_e1a973f199b55389b5df6b0985db43a7_Out_2; + Unity_Multiply_float4_float4(_Property_c74b31cf958e978797249554cd8dd6be_Out_0, _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2, _Multiply_e1a973f199b55389b5df6b0985db43a7_Out_2); + float _Split_9b3e8141df129b848c4c1b364b613b86_R_1 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[0]; + float _Split_9b3e8141df129b848c4c1b364b613b86_G_2 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[1]; + float _Split_9b3e8141df129b848c4c1b364b613b86_B_3 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[2]; + float _Split_9b3e8141df129b848c4c1b364b613b86_A_4 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[3]; + float4 _Multiply_b32230c509acbc8f89fb8f34c19f9513_Out_2; + Unity_Multiply_float4_float4(_Multiply_e1a973f199b55389b5df6b0985db43a7_Out_2, (_Split_9b3e8141df129b848c4c1b364b613b86_A_4.xxxx), _Multiply_b32230c509acbc8f89fb8f34c19f9513_Out_2); + float _Property_c8a6020bb811b98d84a5e74d0bd3ee3b_Out_0 = _Metalic; + float _Property_7f5c7787a25f4c86a3ab8cfae98caa25_Out_0 = _smoothness; + surface.BaseColor = (_Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2.xyz); + surface.NormalTS = _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5; + surface.Emission = (_Multiply_b32230c509acbc8f89fb8f34c19f9513_Out_2.xyz); + surface.Metallic = _Property_c8a6020bb811b98d84a5e74d0bd3ee3b_Out_0; + surface.Smoothness = _Property_7f5c7787a25f4c86a3ab8cfae98caa25_Out_0; + surface.Occlusion = 1; + surface.Alpha = _Split_9b3e8141df129b848c4c1b364b613b86_A_4; + surface.AlphaClipThreshold = 0.5; + return surface; + } + + // -------------------------------------------------- + // Build Graph Inputs + #ifdef HAVE_VFX_MODIFICATION + #define VFX_SRP_ATTRIBUTES Attributes + #define VFX_SRP_VARYINGS Varyings + #define VFX_SRP_SURFACE_INPUTS SurfaceDescriptionInputs + #endif + VertexDescriptionInputs BuildVertexDescriptionInputs(Attributes input) + { + VertexDescriptionInputs output; + ZERO_INITIALIZE(VertexDescriptionInputs, output); + + output.ObjectSpaceNormal = input.normalOS; + output.ObjectSpaceTangent = input.tangentOS.xyz; + output.ObjectSpacePosition = input.positionOS; + + return output; + } + SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) + { + SurfaceDescriptionInputs output; + ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + + #ifdef HAVE_VFX_MODIFICATION + // FragInputs from VFX come from two places: Interpolator or CBuffer. + /* WARNING: $splice Could not find named fragment 'VFXSetFragInputs' */ + + #endif + + + + + + output.TangentSpaceNormal = float3(0.0f, 0.0f, 1.0f); + + + output.uv0 = input.texCoord0; + output.uv1 = input.texCoord1; + output.uv2 = input.texCoord2; + output.uv3 = input.texCoord3; + output.VertexColor = input.color; + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); + #else + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #endif + BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + + return output; + } + + // -------------------------------------------------- + // Main + + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/PBRForwardPass.hlsl" + + // -------------------------------------------------- + // Visual Effect Vertex Invocations + #ifdef HAVE_VFX_MODIFICATION + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl" + #endif + + ENDHLSL + } + Pass + { + Name "ShadowCaster" + Tags + { + "LightMode" = "ShadowCaster" + } + + // Render State + Cull Off + ZTest LEqual + ZWrite On + ColorMask 0 + + // Debug + // + + // -------------------------------------------------- + // Pass + + HLSLPROGRAM + + // Pragmas + #pragma target 4.5 + #pragma exclude_renderers gles gles3 glcore + #pragma multi_compile_instancing + // #pragma multi_compile _ DOTS_INSTANCING_ON + #pragma vertex vert + #pragma fragment frag + + // DotsInstancingOptions: + // HybridV1InjectedBuiltinProperties: + + // Keywords + #pragma multi_compile_vertex _ _CASTING_PUNCTUAL_LIGHT_SHADOW + // GraphKeywords: + + // Defines + + #define _NORMALMAP 1 + #define _NORMAL_DROPOFF_TS 1 + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define ATTRIBUTES_NEED_TEXCOORD0 + #define ATTRIBUTES_NEED_TEXCOORD1 + #define ATTRIBUTES_NEED_TEXCOORD2 + #define ATTRIBUTES_NEED_TEXCOORD3 + #define ATTRIBUTES_NEED_COLOR + #define VARYINGS_NEED_NORMAL_WS + #define VARYINGS_NEED_TEXCOORD0 + #define VARYINGS_NEED_TEXCOORD1 + #define VARYINGS_NEED_TEXCOORD2 + #define VARYINGS_NEED_TEXCOORD3 + #define VARYINGS_NEED_COLOR + #define VARYINGS_NEED_CULLFACE + #define FEATURES_GRAPH_VERTEX + /* WARNING: $splice Could not find named fragment 'PassInstancing' */ + #define SHADERPASS SHADERPASS_SHADOWCASTER + #define _ALPHATEST_ON 1 + /* WARNING: $splice Could not find named fragment 'DotsInstancingVars' */ + + + // custom interpolator pre-include + /* WARNING: $splice Could not find named fragment 'sgci_CustomInterpolatorPreInclude' */ + + // Includes + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + // -------------------------------------------------- + // Structs and Packing + + // custom interpolators pre packing + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPrePacking' */ + + struct Attributes + { + float3 positionOS : POSITION; + float3 normalOS : NORMAL; + float4 tangentOS : TANGENT; + float4 uv0 : TEXCOORD0; + float4 uv1 : TEXCOORD1; + float4 uv2 : TEXCOORD2; + float4 uv3 : TEXCOORD3; + float4 color : COLOR; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : INSTANCEID_SEMANTIC; + #endif + }; + struct Varyings + { + float4 positionCS : SV_POSITION; + float3 normalWS; + float4 texCoord0; + float4 texCoord1; + float4 texCoord2; + float4 texCoord3; + float4 color; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + struct SurfaceDescriptionInputs + { + float4 uv0; + float4 uv1; + float4 uv2; + float4 uv3; + float4 VertexColor; + float FaceSign; + }; + struct VertexDescriptionInputs + { + float3 ObjectSpaceNormal; + float3 ObjectSpaceTangent; + float3 ObjectSpacePosition; + }; + struct PackedVaryings + { + float4 positionCS : SV_POSITION; + float3 interp0 : INTERP0; + float4 interp1 : INTERP1; + float4 interp2 : INTERP2; + float4 interp3 : INTERP3; + float4 interp4 : INTERP4; + float4 interp5 : INTERP5; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + + PackedVaryings PackVaryings (Varyings input) + { + PackedVaryings output; + ZERO_INITIALIZE(PackedVaryings, output); + output.positionCS = input.positionCS; + output.interp0.xyz = input.normalWS; + output.interp1.xyzw = input.texCoord0; + output.interp2.xyzw = input.texCoord1; + output.interp3.xyzw = input.texCoord2; + output.interp4.xyzw = input.texCoord3; + output.interp5.xyzw = input.color; + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + Varyings UnpackVaryings (PackedVaryings input) + { + Varyings output; + output.positionCS = input.positionCS; + output.normalWS = input.interp0.xyz; + output.texCoord0 = input.interp1.xyzw; + output.texCoord1 = input.interp2.xyzw; + output.texCoord2 = input.interp3.xyzw; + output.texCoord3 = input.interp4.xyzw; + output.color = input.interp5.xyzw; + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + + // -------------------------------------------------- + // Graph + + // Graph Properties + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_TexelSize; + float2 _OutlineOffset1; + float2 _OutlineOffset2; + float2 _OutlineOffset3; + float _GradientScale; + float4 _FaceColor; + float4 _IsoPerimeter; + float4 _OutlineColor1; + float4 _OutlineColor2; + float4 _OutlineColor3; + float _OutlineMode; + float3 _Softness; + float4 _FaceTex_TexelSize; + float2 _FaceUVSpeed; + float4 _FaceTex_ST; + float4 _OutlineTex_ST; + float2 _OutlineUVSpeed; + float4 _UnderlayColor; + float2 _UnderlayOffset; + float _UnderlayDilate; + float _UnderlaySoftness; + float _BevelType; + float _BevelAmount; + float _BevelOffset; + float _BevelWidth; + float _BevelRoundness; + float _BevelClamp; + float4 _SpecularColor; + float _LightAngle; + float _SpecularPower; + float _Reflectivity; + float _Diffuse; + float _Ambient; + float4 _OutlineTex_TexelSize; + float _ScaleRatioA; + float4 Emissive; + float _smoothness; + float _Metalic; + CBUFFER_END + + // Object and Global properties + SAMPLER(SamplerState_Linear_Repeat); + TEXTURE2D(_MainTex); + SAMPLER(sampler_MainTex); + TEXTURE2D(_FaceTex); + SAMPLER(sampler_FaceTex); + SAMPLER(SamplerState_Linear_Clamp); + TEXTURE2D(_OutlineTex); + SAMPLER(sampler_OutlineTex); + + // Graph Includes + #include "Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl" + + // -- Property used by ScenePickingPass + #ifdef SCENEPICKINGPASS + float4 _SelectionID; + #endif + + // -- Properties used by SceneSelectionPass + #ifdef SCENESELECTIONPASS + int _ObjectId; + int _PassValue; + #endif + + // Graph Functions + + void Unity_Combine_float(float R, float G, float B, float A, out float4 RGBA, out float3 RGB, out float2 RG) + { + RGBA = float4(R, G, B, A); + RGB = float3(R, G, B); + RG = float2(R, G); + } + + void Unity_Divide_float4(float4 A, float4 B, out float4 Out) + { + Out = A / B; + } + + void Unity_Multiply_float2_float2(float2 A, float2 B, out float2 Out) + { + Out = A * B; + } + + void Unity_Subtract_float2(float2 A, float2 B, out float2 Out) + { + Out = A - B; + } + + void Unity_Multiply_float4_float4(float4 A, float4 B, out float4 Out) + { + Out = A * B; + } + + // Custom interpolators pre vertex + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreVertex' */ + + // Graph Vertex + struct VertexDescription + { + float3 Position; + float3 Normal; + float3 Tangent; + }; + + VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN) + { + VertexDescription description = (VertexDescription)0; + description.Position = IN.ObjectSpacePosition; + description.Normal = IN.ObjectSpaceNormal; + description.Tangent = IN.ObjectSpaceTangent; + return description; + } + + // Custom interpolators, pre surface + #ifdef FEATURES_GRAPH_VERTEX + Varyings CustomInterpolatorPassThroughFunc(inout Varyings output, VertexDescription input) + { + return output; + } + #define CUSTOMINTERPOLATOR_VARYPASSTHROUGH_FUNC + #endif + + // Graph Pixel + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN) + { + SurfaceDescription surface = (SurfaceDescription)0; + float4 _UV_533a59502f0abc8bb2c09828f32ebead_Out_0 = IN.uv0; + UnityTexture2D _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.z; + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Height_2 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.w; + float _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3; + ScreenSpaceRatio_float((_UV_533a59502f0abc8bb2c09828f32ebead_Out_0.xy), _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0, 0, _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3); + UnityTexture2D _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(IN.uv0.xy)); + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_R_4 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.r; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_G_5 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.g; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_B_6 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.b; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.a; + float4 _UV_b26868a97b712882abeca1b58698beb0_Out_0 = IN.uv0; + float2 _Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0 = _OutlineOffset1; + float _Property_c650c0154e947e898564d7d1d007d48e_Out_0 = _GradientScale; + UnityTexture2D _Property_6e377359c1349380b9482e9613fcec6b_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.z; + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.w; + float4 _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4; + float3 _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5; + float2 _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6; + Unity_Combine_float(_TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0, _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2, 0, 0, _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5, _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6); + float4 _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2; + Unity_Divide_float4((_Property_c650c0154e947e898564d7d1d007d48e_Out_0.xxxx), _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2); + float2 _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2; + Unity_Multiply_float2_float2(_Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2); + float2 _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2, _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2); + float4 _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_8ecda3d29d47068e8b76538959fab084_Out_2)); + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_R_4 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.r; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_G_5 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.g; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_B_6 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.b; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.a; + float2 _Property_5a3269796f550283a99abee895aeedd4_Out_0 = _OutlineOffset2; + float2 _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2; + Unity_Multiply_float2_float2((_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Property_5a3269796f550283a99abee895aeedd4_Out_0, _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2); + float2 _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2, _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2); + float4 _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2)); + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_R_4 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.r; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_G_5 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.g; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_B_6 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.b; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.a; + float2 _Property_20cbcbce438f6581847bd3da66673af8_Out_0 = _OutlineOffset3; + float2 _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2; + Unity_Multiply_float2_float2(_Property_20cbcbce438f6581847bd3da66673af8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2); + float2 _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2, _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2); + float4 _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2)); + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_R_4 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.r; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_G_5 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.g; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_B_6 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.b; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.a; + float4 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4; + float3 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5; + float2 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6; + Unity_Combine_float(_SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7, _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7, _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7, _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6); + float _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0 = _GradientScale; + float4 _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0 = _IsoPerimeter; + float3 _Property_05d545af6f7ff08387320e1130c67389_Out_0 = _Softness; + float _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0 = _OutlineMode; + float4 _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6; + ComputeSDF44_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0, _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0, (float4(_Property_05d545af6f7ff08387320e1130c67389_Out_0, 1.0)), _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0, _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6); + float4 _Property_eaed1eca838e7183ae708f9502a50dba_Out_0 = _FaceColor; + UnityTexture2D _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0 = UnityBuildTexture2DStructNoScale(_FaceTex); + float4 _UV_90e11fefcc71b18b8d88b417548d224f_Out_0 = IN.uv0; + float4 _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0 = _FaceTex_ST; + float2 _Property_ced4707a1339568eb002c789407f8a3b_Out_0 = _FaceUVSpeed; + float2 _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3; + GenerateUV_float((_UV_90e11fefcc71b18b8d88b417548d224f_Out_0.xy), _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0, _Property_ced4707a1339568eb002c789407f8a3b_Out_0, _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3); + float4 _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0 = SAMPLE_TEXTURE2D(_Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.tex, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.samplerstate, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.GetTransformedUV(_GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3)); + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_R_4 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.r; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_G_5 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.g; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_B_6 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.b; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_A_7 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.a; + float4 _Multiply_48133834a18f14828ac11b58bc205702_Out_2; + Unity_Multiply_float4_float4(_Property_eaed1eca838e7183ae708f9502a50dba_Out_0, _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0, _Multiply_48133834a18f14828ac11b58bc205702_Out_2); + float4 _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2; + Unity_Multiply_float4_float4(IN.VertexColor, _Multiply_48133834a18f14828ac11b58bc205702_Out_2, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2); + float4 _Property_4637336160f04f8397ca8f3b6531e88e_Out_0 = _OutlineColor1; + UnityTexture2D _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0 = UnityBuildTexture2DStructNoScale(_OutlineTex); + float4 _UV_343788cf38e6598db275321a22b05984_Out_0 = IN.uv0; + float4 _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0 = _OutlineTex_ST; + float2 _Property_11ca84fc4adc63868541229e4f404eae_Out_0 = _OutlineUVSpeed; + float2 _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3; + GenerateUV_float((_UV_343788cf38e6598db275321a22b05984_Out_0.xy), _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0, _Property_11ca84fc4adc63868541229e4f404eae_Out_0, _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3); + float4 _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0 = SAMPLE_TEXTURE2D(_Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.tex, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.samplerstate, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.GetTransformedUV(_GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3)); + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_R_4 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.r; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_G_5 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.g; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_B_6 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.b; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_A_7 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.a; + float4 _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2; + Unity_Multiply_float4_float4(_Property_4637336160f04f8397ca8f3b6531e88e_Out_0, _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2); + float4 _Property_6e8acbed3933c6819383cb89fe70a942_Out_0 = _OutlineColor2; + float2 _Property_baa8c75173022e86bde4cc075585af43_Out_0 = _OutlineOffset3; + float4 _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5; + Layer4_float(_ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2, _Property_6e8acbed3933c6819383cb89fe70a942_Out_0, (float4(_Property_baa8c75173022e86bde4cc075585af43_Out_0, 0.0, 1.0)), _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5); + UnityTexture2D _Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + UnityTexture2D _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_abc928409a963289955625c60e3c3674_Width_0 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.z; + float _TexelSize_abc928409a963289955625c60e3c3674_Height_2 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.w; + float4 _UV_7afe81a63629c789aece6cf7ed368769_Out_0 = IN.uv0; + float _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0 = max(0, IN.FaceSign.x); + float3 _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5; + GetSurfaceNormal_float(_Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0.tex, _TexelSize_abc928409a963289955625c60e3c3674_Width_0, _TexelSize_abc928409a963289955625c60e3c3674_Height_2, (_UV_7afe81a63629c789aece6cf7ed368769_Out_0).x, _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5); + float4 _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2; + EvaluateLight_float(_Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5, _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2); + UnityTexture2D _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _UV_87b50231796c43898a28be7b2f8daea3_Out_0 = IN.uv0; + float2 _Property_c20a130451687b8c87b5a623d8ca6d73_Out_0 = _UnderlayOffset; + float2 _Multiply_7d754a30a319c9839ca945e596548e63_Out_2; + Unity_Multiply_float2_float2(_Property_c20a130451687b8c87b5a623d8ca6d73_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2); + float2 _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2; + Unity_Subtract_float2((_UV_87b50231796c43898a28be7b2f8daea3_Out_0.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2, _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2); + float4 _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0 = SAMPLE_TEXTURE2D(_Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.tex, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.samplerstate, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.GetTransformedUV(_Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2)); + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_R_4 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.r; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_G_5 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.g; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_B_6 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.b; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_A_7 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.a; + float _Property_cb906f6db0fb388a91590590b04091ab_Out_0 = _GradientScale; + float _Property_22272afe5996178386aac669fbda451b_Out_0 = _UnderlayDilate; + float _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0 = _UnderlaySoftness; + float _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0; + ComputeSDF_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, (_SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0).x, _Property_cb906f6db0fb388a91590590b04091ab_Out_0, _Property_22272afe5996178386aac669fbda451b_Out_0, _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0, _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0); + float4 _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0 = _UnderlayColor; + float4 _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2; + Layer1_float(_ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0, _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2); + float4 _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2; + Composite_float(_EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2, _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2); + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_R_1 = IN.VertexColor[0]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_G_2 = IN.VertexColor[1]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_B_3 = IN.VertexColor[2]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4 = IN.VertexColor[3]; + float4 _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2; + Unity_Multiply_float4_float4(_CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2, (_Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4.xxxx), _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2); + float _Split_9b3e8141df129b848c4c1b364b613b86_R_1 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[0]; + float _Split_9b3e8141df129b848c4c1b364b613b86_G_2 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[1]; + float _Split_9b3e8141df129b848c4c1b364b613b86_B_3 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[2]; + float _Split_9b3e8141df129b848c4c1b364b613b86_A_4 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[3]; + surface.Alpha = _Split_9b3e8141df129b848c4c1b364b613b86_A_4; + surface.AlphaClipThreshold = 0.5; + return surface; + } + + // -------------------------------------------------- + // Build Graph Inputs + #ifdef HAVE_VFX_MODIFICATION + #define VFX_SRP_ATTRIBUTES Attributes + #define VFX_SRP_VARYINGS Varyings + #define VFX_SRP_SURFACE_INPUTS SurfaceDescriptionInputs + #endif + VertexDescriptionInputs BuildVertexDescriptionInputs(Attributes input) + { + VertexDescriptionInputs output; + ZERO_INITIALIZE(VertexDescriptionInputs, output); + + output.ObjectSpaceNormal = input.normalOS; + output.ObjectSpaceTangent = input.tangentOS.xyz; + output.ObjectSpacePosition = input.positionOS; + + return output; + } + SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) + { + SurfaceDescriptionInputs output; + ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + + #ifdef HAVE_VFX_MODIFICATION + // FragInputs from VFX come from two places: Interpolator or CBuffer. + /* WARNING: $splice Could not find named fragment 'VFXSetFragInputs' */ + + #endif + + + + + + + + output.uv0 = input.texCoord0; + output.uv1 = input.texCoord1; + output.uv2 = input.texCoord2; + output.uv3 = input.texCoord3; + output.VertexColor = input.color; + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); + #else + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #endif + BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + + return output; + } + + // -------------------------------------------------- + // Main + + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShadowCasterPass.hlsl" + + // -------------------------------------------------- + // Visual Effect Vertex Invocations + #ifdef HAVE_VFX_MODIFICATION + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl" + #endif + + ENDHLSL + } + Pass + { + Name "DepthNormals" + Tags + { + "LightMode" = "DepthNormals" + } + + // Render State + Cull Off + ZTest LEqual + ZWrite On + + // Debug + // + + // -------------------------------------------------- + // Pass + + HLSLPROGRAM + + // Pragmas + #pragma target 4.5 + #pragma exclude_renderers gles gles3 glcore + #pragma multi_compile_instancing + //#pragma multi_compile _ DOTS_INSTANCING_ON + #pragma vertex vert + #pragma fragment frag + + // DotsInstancingOptions: + // HybridV1InjectedBuiltinProperties: + + // Keywords + // PassKeywords: + // GraphKeywords: + + // Defines + + #define _NORMALMAP 1 + #define _NORMAL_DROPOFF_TS 1 + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define ATTRIBUTES_NEED_TEXCOORD0 + #define ATTRIBUTES_NEED_TEXCOORD1 + #define ATTRIBUTES_NEED_TEXCOORD2 + #define ATTRIBUTES_NEED_TEXCOORD3 + #define ATTRIBUTES_NEED_COLOR + #define VARYINGS_NEED_NORMAL_WS + #define VARYINGS_NEED_TANGENT_WS + #define VARYINGS_NEED_TEXCOORD0 + #define VARYINGS_NEED_TEXCOORD1 + #define VARYINGS_NEED_TEXCOORD2 + #define VARYINGS_NEED_TEXCOORD3 + #define VARYINGS_NEED_COLOR + #define VARYINGS_NEED_CULLFACE + #define FEATURES_GRAPH_VERTEX + /* WARNING: $splice Could not find named fragment 'PassInstancing' */ + #define SHADERPASS SHADERPASS_DEPTHNORMALS + #define _ALPHATEST_ON 1 + /* WARNING: $splice Could not find named fragment 'DotsInstancingVars' */ + + + // custom interpolator pre-include + /* WARNING: $splice Could not find named fragment 'sgci_CustomInterpolatorPreInclude' */ + + // Includes + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + // -------------------------------------------------- + // Structs and Packing + + // custom interpolators pre packing + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPrePacking' */ + + struct Attributes + { + float3 positionOS : POSITION; + float3 normalOS : NORMAL; + float4 tangentOS : TANGENT; + float4 uv0 : TEXCOORD0; + float4 uv1 : TEXCOORD1; + float4 uv2 : TEXCOORD2; + float4 uv3 : TEXCOORD3; + float4 color : COLOR; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : INSTANCEID_SEMANTIC; + #endif + }; + struct Varyings + { + float4 positionCS : SV_POSITION; + float3 normalWS; + float4 tangentWS; + float4 texCoord0; + float4 texCoord1; + float4 texCoord2; + float4 texCoord3; + float4 color; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + struct SurfaceDescriptionInputs + { + float3 TangentSpaceNormal; + float4 uv0; + float4 uv1; + float4 uv2; + float4 uv3; + float4 VertexColor; + float FaceSign; + }; + struct VertexDescriptionInputs + { + float3 ObjectSpaceNormal; + float3 ObjectSpaceTangent; + float3 ObjectSpacePosition; + }; + struct PackedVaryings + { + float4 positionCS : SV_POSITION; + float3 interp0 : INTERP0; + float4 interp1 : INTERP1; + float4 interp2 : INTERP2; + float4 interp3 : INTERP3; + float4 interp4 : INTERP4; + float4 interp5 : INTERP5; + float4 interp6 : INTERP6; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + + PackedVaryings PackVaryings (Varyings input) + { + PackedVaryings output; + ZERO_INITIALIZE(PackedVaryings, output); + output.positionCS = input.positionCS; + output.interp0.xyz = input.normalWS; + output.interp1.xyzw = input.tangentWS; + output.interp2.xyzw = input.texCoord0; + output.interp3.xyzw = input.texCoord1; + output.interp4.xyzw = input.texCoord2; + output.interp5.xyzw = input.texCoord3; + output.interp6.xyzw = input.color; + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + Varyings UnpackVaryings (PackedVaryings input) + { + Varyings output; + output.positionCS = input.positionCS; + output.normalWS = input.interp0.xyz; + output.tangentWS = input.interp1.xyzw; + output.texCoord0 = input.interp2.xyzw; + output.texCoord1 = input.interp3.xyzw; + output.texCoord2 = input.interp4.xyzw; + output.texCoord3 = input.interp5.xyzw; + output.color = input.interp6.xyzw; + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + + // -------------------------------------------------- + // Graph + + // Graph Properties + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_TexelSize; + float2 _OutlineOffset1; + float2 _OutlineOffset2; + float2 _OutlineOffset3; + float _GradientScale; + float4 _FaceColor; + float4 _IsoPerimeter; + float4 _OutlineColor1; + float4 _OutlineColor2; + float4 _OutlineColor3; + float _OutlineMode; + float3 _Softness; + float4 _FaceTex_TexelSize; + float2 _FaceUVSpeed; + float4 _FaceTex_ST; + float4 _OutlineTex_ST; + float2 _OutlineUVSpeed; + float4 _UnderlayColor; + float2 _UnderlayOffset; + float _UnderlayDilate; + float _UnderlaySoftness; + float _BevelType; + float _BevelAmount; + float _BevelOffset; + float _BevelWidth; + float _BevelRoundness; + float _BevelClamp; + float4 _SpecularColor; + float _LightAngle; + float _SpecularPower; + float _Reflectivity; + float _Diffuse; + float _Ambient; + float4 _OutlineTex_TexelSize; + float _ScaleRatioA; + float4 Emissive; + float _smoothness; + float _Metalic; + CBUFFER_END + + // Object and Global properties + SAMPLER(SamplerState_Linear_Repeat); + TEXTURE2D(_MainTex); + SAMPLER(sampler_MainTex); + TEXTURE2D(_FaceTex); + SAMPLER(sampler_FaceTex); + SAMPLER(SamplerState_Linear_Clamp); + TEXTURE2D(_OutlineTex); + SAMPLER(sampler_OutlineTex); + + // Graph Includes + #include "Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl" + + // -- Property used by ScenePickingPass + #ifdef SCENEPICKINGPASS + float4 _SelectionID; + #endif + + // -- Properties used by SceneSelectionPass + #ifdef SCENESELECTIONPASS + int _ObjectId; + int _PassValue; + #endif + + // Graph Functions + + void Unity_Combine_float(float R, float G, float B, float A, out float4 RGBA, out float3 RGB, out float2 RG) + { + RGBA = float4(R, G, B, A); + RGB = float3(R, G, B); + RG = float2(R, G); + } + + void Unity_Divide_float4(float4 A, float4 B, out float4 Out) + { + Out = A / B; + } + + void Unity_Multiply_float2_float2(float2 A, float2 B, out float2 Out) + { + Out = A * B; + } + + void Unity_Subtract_float2(float2 A, float2 B, out float2 Out) + { + Out = A - B; + } + + void Unity_Multiply_float4_float4(float4 A, float4 B, out float4 Out) + { + Out = A * B; + } + + // Custom interpolators pre vertex + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreVertex' */ + + // Graph Vertex + struct VertexDescription + { + float3 Position; + float3 Normal; + float3 Tangent; + }; + + VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN) + { + VertexDescription description = (VertexDescription)0; + description.Position = IN.ObjectSpacePosition; + description.Normal = IN.ObjectSpaceNormal; + description.Tangent = IN.ObjectSpaceTangent; + return description; + } + + // Custom interpolators, pre surface + #ifdef FEATURES_GRAPH_VERTEX + Varyings CustomInterpolatorPassThroughFunc(inout Varyings output, VertexDescription input) + { + return output; + } + #define CUSTOMINTERPOLATOR_VARYPASSTHROUGH_FUNC + #endif + + // Graph Pixel + struct SurfaceDescription + { + float3 NormalTS; + float Alpha; + float AlphaClipThreshold; + }; + + SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN) + { + SurfaceDescription surface = (SurfaceDescription)0; + UnityTexture2D _Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + UnityTexture2D _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_abc928409a963289955625c60e3c3674_Width_0 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.z; + float _TexelSize_abc928409a963289955625c60e3c3674_Height_2 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.w; + float4 _UV_7afe81a63629c789aece6cf7ed368769_Out_0 = IN.uv0; + float _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0 = max(0, IN.FaceSign.x); + float3 _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5; + GetSurfaceNormal_float(_Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0.tex, _TexelSize_abc928409a963289955625c60e3c3674_Width_0, _TexelSize_abc928409a963289955625c60e3c3674_Height_2, (_UV_7afe81a63629c789aece6cf7ed368769_Out_0).x, _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5); + float4 _UV_533a59502f0abc8bb2c09828f32ebead_Out_0 = IN.uv0; + UnityTexture2D _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.z; + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Height_2 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.w; + float _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3; + ScreenSpaceRatio_float((_UV_533a59502f0abc8bb2c09828f32ebead_Out_0.xy), _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0, 0, _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3); + UnityTexture2D _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(IN.uv0.xy)); + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_R_4 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.r; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_G_5 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.g; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_B_6 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.b; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.a; + float4 _UV_b26868a97b712882abeca1b58698beb0_Out_0 = IN.uv0; + float2 _Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0 = _OutlineOffset1; + float _Property_c650c0154e947e898564d7d1d007d48e_Out_0 = _GradientScale; + UnityTexture2D _Property_6e377359c1349380b9482e9613fcec6b_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.z; + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.w; + float4 _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4; + float3 _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5; + float2 _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6; + Unity_Combine_float(_TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0, _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2, 0, 0, _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5, _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6); + float4 _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2; + Unity_Divide_float4((_Property_c650c0154e947e898564d7d1d007d48e_Out_0.xxxx), _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2); + float2 _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2; + Unity_Multiply_float2_float2(_Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2); + float2 _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2, _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2); + float4 _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_8ecda3d29d47068e8b76538959fab084_Out_2)); + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_R_4 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.r; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_G_5 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.g; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_B_6 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.b; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.a; + float2 _Property_5a3269796f550283a99abee895aeedd4_Out_0 = _OutlineOffset2; + float2 _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2; + Unity_Multiply_float2_float2((_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Property_5a3269796f550283a99abee895aeedd4_Out_0, _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2); + float2 _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2, _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2); + float4 _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2)); + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_R_4 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.r; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_G_5 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.g; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_B_6 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.b; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.a; + float2 _Property_20cbcbce438f6581847bd3da66673af8_Out_0 = _OutlineOffset3; + float2 _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2; + Unity_Multiply_float2_float2(_Property_20cbcbce438f6581847bd3da66673af8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2); + float2 _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2, _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2); + float4 _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2)); + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_R_4 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.r; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_G_5 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.g; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_B_6 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.b; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.a; + float4 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4; + float3 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5; + float2 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6; + Unity_Combine_float(_SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7, _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7, _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7, _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6); + float _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0 = _GradientScale; + float4 _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0 = _IsoPerimeter; + float3 _Property_05d545af6f7ff08387320e1130c67389_Out_0 = _Softness; + float _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0 = _OutlineMode; + float4 _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6; + ComputeSDF44_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0, _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0, (float4(_Property_05d545af6f7ff08387320e1130c67389_Out_0, 1.0)), _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0, _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6); + float4 _Property_eaed1eca838e7183ae708f9502a50dba_Out_0 = _FaceColor; + UnityTexture2D _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0 = UnityBuildTexture2DStructNoScale(_FaceTex); + float4 _UV_90e11fefcc71b18b8d88b417548d224f_Out_0 = IN.uv0; + float4 _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0 = _FaceTex_ST; + float2 _Property_ced4707a1339568eb002c789407f8a3b_Out_0 = _FaceUVSpeed; + float2 _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3; + GenerateUV_float((_UV_90e11fefcc71b18b8d88b417548d224f_Out_0.xy), _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0, _Property_ced4707a1339568eb002c789407f8a3b_Out_0, _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3); + float4 _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0 = SAMPLE_TEXTURE2D(_Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.tex, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.samplerstate, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.GetTransformedUV(_GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3)); + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_R_4 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.r; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_G_5 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.g; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_B_6 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.b; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_A_7 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.a; + float4 _Multiply_48133834a18f14828ac11b58bc205702_Out_2; + Unity_Multiply_float4_float4(_Property_eaed1eca838e7183ae708f9502a50dba_Out_0, _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0, _Multiply_48133834a18f14828ac11b58bc205702_Out_2); + float4 _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2; + Unity_Multiply_float4_float4(IN.VertexColor, _Multiply_48133834a18f14828ac11b58bc205702_Out_2, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2); + float4 _Property_4637336160f04f8397ca8f3b6531e88e_Out_0 = _OutlineColor1; + UnityTexture2D _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0 = UnityBuildTexture2DStructNoScale(_OutlineTex); + float4 _UV_343788cf38e6598db275321a22b05984_Out_0 = IN.uv0; + float4 _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0 = _OutlineTex_ST; + float2 _Property_11ca84fc4adc63868541229e4f404eae_Out_0 = _OutlineUVSpeed; + float2 _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3; + GenerateUV_float((_UV_343788cf38e6598db275321a22b05984_Out_0.xy), _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0, _Property_11ca84fc4adc63868541229e4f404eae_Out_0, _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3); + float4 _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0 = SAMPLE_TEXTURE2D(_Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.tex, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.samplerstate, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.GetTransformedUV(_GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3)); + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_R_4 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.r; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_G_5 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.g; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_B_6 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.b; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_A_7 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.a; + float4 _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2; + Unity_Multiply_float4_float4(_Property_4637336160f04f8397ca8f3b6531e88e_Out_0, _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2); + float4 _Property_6e8acbed3933c6819383cb89fe70a942_Out_0 = _OutlineColor2; + float2 _Property_baa8c75173022e86bde4cc075585af43_Out_0 = _OutlineOffset3; + float4 _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5; + Layer4_float(_ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2, _Property_6e8acbed3933c6819383cb89fe70a942_Out_0, (float4(_Property_baa8c75173022e86bde4cc075585af43_Out_0, 0.0, 1.0)), _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5); + float4 _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2; + EvaluateLight_float(_Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5, _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2); + UnityTexture2D _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _UV_87b50231796c43898a28be7b2f8daea3_Out_0 = IN.uv0; + float2 _Property_c20a130451687b8c87b5a623d8ca6d73_Out_0 = _UnderlayOffset; + float2 _Multiply_7d754a30a319c9839ca945e596548e63_Out_2; + Unity_Multiply_float2_float2(_Property_c20a130451687b8c87b5a623d8ca6d73_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2); + float2 _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2; + Unity_Subtract_float2((_UV_87b50231796c43898a28be7b2f8daea3_Out_0.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2, _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2); + float4 _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0 = SAMPLE_TEXTURE2D(_Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.tex, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.samplerstate, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.GetTransformedUV(_Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2)); + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_R_4 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.r; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_G_5 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.g; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_B_6 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.b; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_A_7 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.a; + float _Property_cb906f6db0fb388a91590590b04091ab_Out_0 = _GradientScale; + float _Property_22272afe5996178386aac669fbda451b_Out_0 = _UnderlayDilate; + float _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0 = _UnderlaySoftness; + float _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0; + ComputeSDF_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, (_SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0).x, _Property_cb906f6db0fb388a91590590b04091ab_Out_0, _Property_22272afe5996178386aac669fbda451b_Out_0, _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0, _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0); + float4 _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0 = _UnderlayColor; + float4 _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2; + Layer1_float(_ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0, _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2); + float4 _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2; + Composite_float(_EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2, _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2); + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_R_1 = IN.VertexColor[0]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_G_2 = IN.VertexColor[1]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_B_3 = IN.VertexColor[2]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4 = IN.VertexColor[3]; + float4 _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2; + Unity_Multiply_float4_float4(_CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2, (_Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4.xxxx), _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2); + float _Split_9b3e8141df129b848c4c1b364b613b86_R_1 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[0]; + float _Split_9b3e8141df129b848c4c1b364b613b86_G_2 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[1]; + float _Split_9b3e8141df129b848c4c1b364b613b86_B_3 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[2]; + float _Split_9b3e8141df129b848c4c1b364b613b86_A_4 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[3]; + surface.NormalTS = _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5; + surface.Alpha = _Split_9b3e8141df129b848c4c1b364b613b86_A_4; + surface.AlphaClipThreshold = 0.5; + return surface; + } + + // -------------------------------------------------- + // Build Graph Inputs + #ifdef HAVE_VFX_MODIFICATION + #define VFX_SRP_ATTRIBUTES Attributes + #define VFX_SRP_VARYINGS Varyings + #define VFX_SRP_SURFACE_INPUTS SurfaceDescriptionInputs + #endif + VertexDescriptionInputs BuildVertexDescriptionInputs(Attributes input) + { + VertexDescriptionInputs output; + ZERO_INITIALIZE(VertexDescriptionInputs, output); + + output.ObjectSpaceNormal = input.normalOS; + output.ObjectSpaceTangent = input.tangentOS.xyz; + output.ObjectSpacePosition = input.positionOS; + + return output; + } + SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) + { + SurfaceDescriptionInputs output; + ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + + #ifdef HAVE_VFX_MODIFICATION + // FragInputs from VFX come from two places: Interpolator or CBuffer. + /* WARNING: $splice Could not find named fragment 'VFXSetFragInputs' */ + + #endif + + + + + + output.TangentSpaceNormal = float3(0.0f, 0.0f, 1.0f); + + + output.uv0 = input.texCoord0; + output.uv1 = input.texCoord1; + output.uv2 = input.texCoord2; + output.uv3 = input.texCoord3; + output.VertexColor = input.color; + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); + #else + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #endif + BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + + return output; + } + + // -------------------------------------------------- + // Main + + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DepthNormalsOnlyPass.hlsl" + + // -------------------------------------------------- + // Visual Effect Vertex Invocations + #ifdef HAVE_VFX_MODIFICATION + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl" + #endif + + ENDHLSL + } + Pass + { + Name "Meta" + Tags + { + "LightMode" = "Meta" + } + + // Render State + Cull Off + + // Debug + // + + // -------------------------------------------------- + // Pass + + HLSLPROGRAM + + // Pragmas + #pragma target 4.5 + #pragma exclude_renderers gles gles3 glcore + #pragma vertex vert + #pragma fragment frag + + // DotsInstancingOptions: + // HybridV1InjectedBuiltinProperties: + + // Keywords + #pragma shader_feature _ EDITOR_VISUALIZATION + // GraphKeywords: + + // Defines + + #define _NORMALMAP 1 + #define _NORMAL_DROPOFF_TS 1 + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define ATTRIBUTES_NEED_TEXCOORD0 + #define ATTRIBUTES_NEED_TEXCOORD1 + #define ATTRIBUTES_NEED_TEXCOORD2 + #define ATTRIBUTES_NEED_TEXCOORD3 + #define ATTRIBUTES_NEED_COLOR + #define VARYINGS_NEED_TEXCOORD0 + #define VARYINGS_NEED_TEXCOORD1 + #define VARYINGS_NEED_TEXCOORD2 + #define VARYINGS_NEED_TEXCOORD3 + #define VARYINGS_NEED_COLOR + #define VARYINGS_NEED_CULLFACE + #define FEATURES_GRAPH_VERTEX + /* WARNING: $splice Could not find named fragment 'PassInstancing' */ + #define SHADERPASS SHADERPASS_META + #define _FOG_FRAGMENT 1 + #define _ALPHATEST_ON 1 + /* WARNING: $splice Could not find named fragment 'DotsInstancingVars' */ + + + // custom interpolator pre-include + /* WARNING: $splice Could not find named fragment 'sgci_CustomInterpolatorPreInclude' */ + + // Includes + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/MetaInput.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + // -------------------------------------------------- + // Structs and Packing + + // custom interpolators pre packing + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPrePacking' */ + + struct Attributes + { + float3 positionOS : POSITION; + float3 normalOS : NORMAL; + float4 tangentOS : TANGENT; + float4 uv0 : TEXCOORD0; + float4 uv1 : TEXCOORD1; + float4 uv2 : TEXCOORD2; + float4 uv3 : TEXCOORD3; + float4 color : COLOR; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : INSTANCEID_SEMANTIC; + #endif + }; + struct Varyings + { + float4 positionCS : SV_POSITION; + float4 texCoord0; + float4 texCoord1; + float4 texCoord2; + float4 texCoord3; + float4 color; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + struct SurfaceDescriptionInputs + { + float4 uv0; + float4 uv1; + float4 uv2; + float4 uv3; + float4 VertexColor; + float FaceSign; + }; + struct VertexDescriptionInputs + { + float3 ObjectSpaceNormal; + float3 ObjectSpaceTangent; + float3 ObjectSpacePosition; + }; + struct PackedVaryings + { + float4 positionCS : SV_POSITION; + float4 interp0 : INTERP0; + float4 interp1 : INTERP1; + float4 interp2 : INTERP2; + float4 interp3 : INTERP3; + float4 interp4 : INTERP4; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + + PackedVaryings PackVaryings (Varyings input) + { + PackedVaryings output; + ZERO_INITIALIZE(PackedVaryings, output); + output.positionCS = input.positionCS; + output.interp0.xyzw = input.texCoord0; + output.interp1.xyzw = input.texCoord1; + output.interp2.xyzw = input.texCoord2; + output.interp3.xyzw = input.texCoord3; + output.interp4.xyzw = input.color; + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + Varyings UnpackVaryings (PackedVaryings input) + { + Varyings output; + output.positionCS = input.positionCS; + output.texCoord0 = input.interp0.xyzw; + output.texCoord1 = input.interp1.xyzw; + output.texCoord2 = input.interp2.xyzw; + output.texCoord3 = input.interp3.xyzw; + output.color = input.interp4.xyzw; + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + + // -------------------------------------------------- + // Graph + + // Graph Properties + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_TexelSize; + float2 _OutlineOffset1; + float2 _OutlineOffset2; + float2 _OutlineOffset3; + float _GradientScale; + float4 _FaceColor; + float4 _IsoPerimeter; + float4 _OutlineColor1; + float4 _OutlineColor2; + float4 _OutlineColor3; + float _OutlineMode; + float3 _Softness; + float4 _FaceTex_TexelSize; + float2 _FaceUVSpeed; + float4 _FaceTex_ST; + float4 _OutlineTex_ST; + float2 _OutlineUVSpeed; + float4 _UnderlayColor; + float2 _UnderlayOffset; + float _UnderlayDilate; + float _UnderlaySoftness; + float _BevelType; + float _BevelAmount; + float _BevelOffset; + float _BevelWidth; + float _BevelRoundness; + float _BevelClamp; + float4 _SpecularColor; + float _LightAngle; + float _SpecularPower; + float _Reflectivity; + float _Diffuse; + float _Ambient; + float4 _OutlineTex_TexelSize; + float _ScaleRatioA; + float4 Emissive; + float _smoothness; + float _Metalic; + CBUFFER_END + + // Object and Global properties + SAMPLER(SamplerState_Linear_Repeat); + TEXTURE2D(_MainTex); + SAMPLER(sampler_MainTex); + TEXTURE2D(_FaceTex); + SAMPLER(sampler_FaceTex); + SAMPLER(SamplerState_Linear_Clamp); + TEXTURE2D(_OutlineTex); + SAMPLER(sampler_OutlineTex); + + // Graph Includes + #include "Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl" + + // -- Property used by ScenePickingPass + #ifdef SCENEPICKINGPASS + float4 _SelectionID; + #endif + + // -- Properties used by SceneSelectionPass + #ifdef SCENESELECTIONPASS + int _ObjectId; + int _PassValue; + #endif + + // Graph Functions + + void Unity_Combine_float(float R, float G, float B, float A, out float4 RGBA, out float3 RGB, out float2 RG) + { + RGBA = float4(R, G, B, A); + RGB = float3(R, G, B); + RG = float2(R, G); + } + + void Unity_Divide_float4(float4 A, float4 B, out float4 Out) + { + Out = A / B; + } + + void Unity_Multiply_float2_float2(float2 A, float2 B, out float2 Out) + { + Out = A * B; + } + + void Unity_Subtract_float2(float2 A, float2 B, out float2 Out) + { + Out = A - B; + } + + void Unity_Multiply_float4_float4(float4 A, float4 B, out float4 Out) + { + Out = A * B; + } + + // Custom interpolators pre vertex + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreVertex' */ + + // Graph Vertex + struct VertexDescription + { + float3 Position; + float3 Normal; + float3 Tangent; + }; + + VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN) + { + VertexDescription description = (VertexDescription)0; + description.Position = IN.ObjectSpacePosition; + description.Normal = IN.ObjectSpaceNormal; + description.Tangent = IN.ObjectSpaceTangent; + return description; + } + + // Custom interpolators, pre surface + #ifdef FEATURES_GRAPH_VERTEX + Varyings CustomInterpolatorPassThroughFunc(inout Varyings output, VertexDescription input) + { + return output; + } + #define CUSTOMINTERPOLATOR_VARYPASSTHROUGH_FUNC + #endif + + // Graph Pixel + struct SurfaceDescription + { + float3 BaseColor; + float3 Emission; + float Alpha; + float AlphaClipThreshold; + }; + + SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN) + { + SurfaceDescription surface = (SurfaceDescription)0; + float4 _UV_533a59502f0abc8bb2c09828f32ebead_Out_0 = IN.uv0; + UnityTexture2D _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.z; + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Height_2 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.w; + float _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3; + ScreenSpaceRatio_float((_UV_533a59502f0abc8bb2c09828f32ebead_Out_0.xy), _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0, 0, _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3); + UnityTexture2D _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(IN.uv0.xy)); + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_R_4 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.r; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_G_5 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.g; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_B_6 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.b; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.a; + float4 _UV_b26868a97b712882abeca1b58698beb0_Out_0 = IN.uv0; + float2 _Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0 = _OutlineOffset1; + float _Property_c650c0154e947e898564d7d1d007d48e_Out_0 = _GradientScale; + UnityTexture2D _Property_6e377359c1349380b9482e9613fcec6b_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.z; + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.w; + float4 _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4; + float3 _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5; + float2 _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6; + Unity_Combine_float(_TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0, _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2, 0, 0, _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5, _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6); + float4 _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2; + Unity_Divide_float4((_Property_c650c0154e947e898564d7d1d007d48e_Out_0.xxxx), _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2); + float2 _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2; + Unity_Multiply_float2_float2(_Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2); + float2 _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2, _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2); + float4 _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_8ecda3d29d47068e8b76538959fab084_Out_2)); + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_R_4 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.r; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_G_5 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.g; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_B_6 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.b; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.a; + float2 _Property_5a3269796f550283a99abee895aeedd4_Out_0 = _OutlineOffset2; + float2 _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2; + Unity_Multiply_float2_float2((_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Property_5a3269796f550283a99abee895aeedd4_Out_0, _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2); + float2 _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2, _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2); + float4 _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2)); + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_R_4 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.r; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_G_5 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.g; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_B_6 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.b; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.a; + float2 _Property_20cbcbce438f6581847bd3da66673af8_Out_0 = _OutlineOffset3; + float2 _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2; + Unity_Multiply_float2_float2(_Property_20cbcbce438f6581847bd3da66673af8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2); + float2 _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2, _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2); + float4 _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2)); + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_R_4 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.r; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_G_5 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.g; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_B_6 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.b; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.a; + float4 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4; + float3 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5; + float2 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6; + Unity_Combine_float(_SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7, _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7, _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7, _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6); + float _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0 = _GradientScale; + float4 _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0 = _IsoPerimeter; + float3 _Property_05d545af6f7ff08387320e1130c67389_Out_0 = _Softness; + float _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0 = _OutlineMode; + float4 _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6; + ComputeSDF44_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0, _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0, (float4(_Property_05d545af6f7ff08387320e1130c67389_Out_0, 1.0)), _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0, _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6); + float4 _Property_eaed1eca838e7183ae708f9502a50dba_Out_0 = _FaceColor; + UnityTexture2D _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0 = UnityBuildTexture2DStructNoScale(_FaceTex); + float4 _UV_90e11fefcc71b18b8d88b417548d224f_Out_0 = IN.uv0; + float4 _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0 = _FaceTex_ST; + float2 _Property_ced4707a1339568eb002c789407f8a3b_Out_0 = _FaceUVSpeed; + float2 _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3; + GenerateUV_float((_UV_90e11fefcc71b18b8d88b417548d224f_Out_0.xy), _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0, _Property_ced4707a1339568eb002c789407f8a3b_Out_0, _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3); + float4 _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0 = SAMPLE_TEXTURE2D(_Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.tex, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.samplerstate, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.GetTransformedUV(_GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3)); + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_R_4 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.r; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_G_5 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.g; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_B_6 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.b; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_A_7 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.a; + float4 _Multiply_48133834a18f14828ac11b58bc205702_Out_2; + Unity_Multiply_float4_float4(_Property_eaed1eca838e7183ae708f9502a50dba_Out_0, _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0, _Multiply_48133834a18f14828ac11b58bc205702_Out_2); + float4 _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2; + Unity_Multiply_float4_float4(IN.VertexColor, _Multiply_48133834a18f14828ac11b58bc205702_Out_2, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2); + float4 _Property_4637336160f04f8397ca8f3b6531e88e_Out_0 = _OutlineColor1; + UnityTexture2D _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0 = UnityBuildTexture2DStructNoScale(_OutlineTex); + float4 _UV_343788cf38e6598db275321a22b05984_Out_0 = IN.uv0; + float4 _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0 = _OutlineTex_ST; + float2 _Property_11ca84fc4adc63868541229e4f404eae_Out_0 = _OutlineUVSpeed; + float2 _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3; + GenerateUV_float((_UV_343788cf38e6598db275321a22b05984_Out_0.xy), _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0, _Property_11ca84fc4adc63868541229e4f404eae_Out_0, _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3); + float4 _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0 = SAMPLE_TEXTURE2D(_Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.tex, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.samplerstate, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.GetTransformedUV(_GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3)); + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_R_4 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.r; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_G_5 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.g; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_B_6 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.b; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_A_7 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.a; + float4 _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2; + Unity_Multiply_float4_float4(_Property_4637336160f04f8397ca8f3b6531e88e_Out_0, _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2); + float4 _Property_6e8acbed3933c6819383cb89fe70a942_Out_0 = _OutlineColor2; + float2 _Property_baa8c75173022e86bde4cc075585af43_Out_0 = _OutlineOffset3; + float4 _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5; + Layer4_float(_ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2, _Property_6e8acbed3933c6819383cb89fe70a942_Out_0, (float4(_Property_baa8c75173022e86bde4cc075585af43_Out_0, 0.0, 1.0)), _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5); + UnityTexture2D _Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + UnityTexture2D _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_abc928409a963289955625c60e3c3674_Width_0 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.z; + float _TexelSize_abc928409a963289955625c60e3c3674_Height_2 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.w; + float4 _UV_7afe81a63629c789aece6cf7ed368769_Out_0 = IN.uv0; + float _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0 = max(0, IN.FaceSign.x); + float3 _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5; + GetSurfaceNormal_float(_Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0.tex, _TexelSize_abc928409a963289955625c60e3c3674_Width_0, _TexelSize_abc928409a963289955625c60e3c3674_Height_2, (_UV_7afe81a63629c789aece6cf7ed368769_Out_0).x, _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5); + float4 _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2; + EvaluateLight_float(_Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5, _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2); + UnityTexture2D _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _UV_87b50231796c43898a28be7b2f8daea3_Out_0 = IN.uv0; + float2 _Property_c20a130451687b8c87b5a623d8ca6d73_Out_0 = _UnderlayOffset; + float2 _Multiply_7d754a30a319c9839ca945e596548e63_Out_2; + Unity_Multiply_float2_float2(_Property_c20a130451687b8c87b5a623d8ca6d73_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2); + float2 _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2; + Unity_Subtract_float2((_UV_87b50231796c43898a28be7b2f8daea3_Out_0.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2, _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2); + float4 _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0 = SAMPLE_TEXTURE2D(_Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.tex, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.samplerstate, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.GetTransformedUV(_Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2)); + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_R_4 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.r; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_G_5 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.g; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_B_6 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.b; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_A_7 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.a; + float _Property_cb906f6db0fb388a91590590b04091ab_Out_0 = _GradientScale; + float _Property_22272afe5996178386aac669fbda451b_Out_0 = _UnderlayDilate; + float _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0 = _UnderlaySoftness; + float _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0; + ComputeSDF_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, (_SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0).x, _Property_cb906f6db0fb388a91590590b04091ab_Out_0, _Property_22272afe5996178386aac669fbda451b_Out_0, _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0, _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0); + float4 _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0 = _UnderlayColor; + float4 _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2; + Layer1_float(_ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0, _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2); + float4 _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2; + Composite_float(_EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2, _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2); + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_R_1 = IN.VertexColor[0]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_G_2 = IN.VertexColor[1]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_B_3 = IN.VertexColor[2]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4 = IN.VertexColor[3]; + float4 _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2; + Unity_Multiply_float4_float4(_CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2, (_Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4.xxxx), _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2); + float4 _Property_c74b31cf958e978797249554cd8dd6be_Out_0 = Emissive; + float4 _Multiply_e1a973f199b55389b5df6b0985db43a7_Out_2; + Unity_Multiply_float4_float4(_Property_c74b31cf958e978797249554cd8dd6be_Out_0, _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2, _Multiply_e1a973f199b55389b5df6b0985db43a7_Out_2); + float _Split_9b3e8141df129b848c4c1b364b613b86_R_1 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[0]; + float _Split_9b3e8141df129b848c4c1b364b613b86_G_2 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[1]; + float _Split_9b3e8141df129b848c4c1b364b613b86_B_3 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[2]; + float _Split_9b3e8141df129b848c4c1b364b613b86_A_4 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[3]; + float4 _Multiply_b32230c509acbc8f89fb8f34c19f9513_Out_2; + Unity_Multiply_float4_float4(_Multiply_e1a973f199b55389b5df6b0985db43a7_Out_2, (_Split_9b3e8141df129b848c4c1b364b613b86_A_4.xxxx), _Multiply_b32230c509acbc8f89fb8f34c19f9513_Out_2); + surface.BaseColor = (_Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2.xyz); + surface.Emission = (_Multiply_b32230c509acbc8f89fb8f34c19f9513_Out_2.xyz); + surface.Alpha = _Split_9b3e8141df129b848c4c1b364b613b86_A_4; + surface.AlphaClipThreshold = 0.5; + return surface; + } + + // -------------------------------------------------- + // Build Graph Inputs + #ifdef HAVE_VFX_MODIFICATION + #define VFX_SRP_ATTRIBUTES Attributes + #define VFX_SRP_VARYINGS Varyings + #define VFX_SRP_SURFACE_INPUTS SurfaceDescriptionInputs + #endif + VertexDescriptionInputs BuildVertexDescriptionInputs(Attributes input) + { + VertexDescriptionInputs output; + ZERO_INITIALIZE(VertexDescriptionInputs, output); + + output.ObjectSpaceNormal = input.normalOS; + output.ObjectSpaceTangent = input.tangentOS.xyz; + output.ObjectSpacePosition = input.positionOS; + + return output; + } + SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) + { + SurfaceDescriptionInputs output; + ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + + #ifdef HAVE_VFX_MODIFICATION + // FragInputs from VFX come from two places: Interpolator or CBuffer. + /* WARNING: $splice Could not find named fragment 'VFXSetFragInputs' */ + + #endif + + + + + + + + output.uv0 = input.texCoord0; + output.uv1 = input.texCoord1; + output.uv2 = input.texCoord2; + output.uv3 = input.texCoord3; + output.VertexColor = input.color; + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); + #else + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #endif + BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + + return output; + } + + // -------------------------------------------------- + // Main + + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/LightingMetaPass.hlsl" + + // -------------------------------------------------- + // Visual Effect Vertex Invocations + #ifdef HAVE_VFX_MODIFICATION + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl" + #endif + + ENDHLSL + } + Pass + { + Name "SceneSelectionPass" + Tags + { + "LightMode" = "SceneSelectionPass" + } + + // Render State + Cull Off + + // Debug + // + + // -------------------------------------------------- + // Pass + + HLSLPROGRAM + + // Pragmas + #pragma target 4.5 + #pragma exclude_renderers gles gles3 glcore + #pragma vertex vert + #pragma fragment frag + + // DotsInstancingOptions: + // HybridV1InjectedBuiltinProperties: + + // Keywords + // PassKeywords: + // GraphKeywords: + + // Defines + + #define _NORMALMAP 1 + #define _NORMAL_DROPOFF_TS 1 + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define ATTRIBUTES_NEED_TEXCOORD0 + #define ATTRIBUTES_NEED_TEXCOORD1 + #define ATTRIBUTES_NEED_TEXCOORD2 + #define ATTRIBUTES_NEED_TEXCOORD3 + #define ATTRIBUTES_NEED_COLOR + #define VARYINGS_NEED_TEXCOORD0 + #define VARYINGS_NEED_TEXCOORD1 + #define VARYINGS_NEED_TEXCOORD2 + #define VARYINGS_NEED_TEXCOORD3 + #define VARYINGS_NEED_COLOR + #define VARYINGS_NEED_CULLFACE + #define FEATURES_GRAPH_VERTEX + /* WARNING: $splice Could not find named fragment 'PassInstancing' */ + #define SHADERPASS SHADERPASS_DEPTHONLY + #define SCENESELECTIONPASS 1 + #define ALPHA_CLIP_THRESHOLD 1 + #define _ALPHATEST_ON 1 + /* WARNING: $splice Could not find named fragment 'DotsInstancingVars' */ + + + // custom interpolator pre-include + /* WARNING: $splice Could not find named fragment 'sgci_CustomInterpolatorPreInclude' */ + + // Includes + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + // -------------------------------------------------- + // Structs and Packing + + // custom interpolators pre packing + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPrePacking' */ + + struct Attributes + { + float3 positionOS : POSITION; + float3 normalOS : NORMAL; + float4 tangentOS : TANGENT; + float4 uv0 : TEXCOORD0; + float4 uv1 : TEXCOORD1; + float4 uv2 : TEXCOORD2; + float4 uv3 : TEXCOORD3; + float4 color : COLOR; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : INSTANCEID_SEMANTIC; + #endif + }; + struct Varyings + { + float4 positionCS : SV_POSITION; + float4 texCoord0; + float4 texCoord1; + float4 texCoord2; + float4 texCoord3; + float4 color; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + struct SurfaceDescriptionInputs + { + float4 uv0; + float4 uv1; + float4 uv2; + float4 uv3; + float4 VertexColor; + float FaceSign; + }; + struct VertexDescriptionInputs + { + float3 ObjectSpaceNormal; + float3 ObjectSpaceTangent; + float3 ObjectSpacePosition; + }; + struct PackedVaryings + { + float4 positionCS : SV_POSITION; + float4 interp0 : INTERP0; + float4 interp1 : INTERP1; + float4 interp2 : INTERP2; + float4 interp3 : INTERP3; + float4 interp4 : INTERP4; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + + PackedVaryings PackVaryings (Varyings input) + { + PackedVaryings output; + ZERO_INITIALIZE(PackedVaryings, output); + output.positionCS = input.positionCS; + output.interp0.xyzw = input.texCoord0; + output.interp1.xyzw = input.texCoord1; + output.interp2.xyzw = input.texCoord2; + output.interp3.xyzw = input.texCoord3; + output.interp4.xyzw = input.color; + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + Varyings UnpackVaryings (PackedVaryings input) + { + Varyings output; + output.positionCS = input.positionCS; + output.texCoord0 = input.interp0.xyzw; + output.texCoord1 = input.interp1.xyzw; + output.texCoord2 = input.interp2.xyzw; + output.texCoord3 = input.interp3.xyzw; + output.color = input.interp4.xyzw; + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + + // -------------------------------------------------- + // Graph + + // Graph Properties + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_TexelSize; + float2 _OutlineOffset1; + float2 _OutlineOffset2; + float2 _OutlineOffset3; + float _GradientScale; + float4 _FaceColor; + float4 _IsoPerimeter; + float4 _OutlineColor1; + float4 _OutlineColor2; + float4 _OutlineColor3; + float _OutlineMode; + float3 _Softness; + float4 _FaceTex_TexelSize; + float2 _FaceUVSpeed; + float4 _FaceTex_ST; + float4 _OutlineTex_ST; + float2 _OutlineUVSpeed; + float4 _UnderlayColor; + float2 _UnderlayOffset; + float _UnderlayDilate; + float _UnderlaySoftness; + float _BevelType; + float _BevelAmount; + float _BevelOffset; + float _BevelWidth; + float _BevelRoundness; + float _BevelClamp; + float4 _SpecularColor; + float _LightAngle; + float _SpecularPower; + float _Reflectivity; + float _Diffuse; + float _Ambient; + float4 _OutlineTex_TexelSize; + float _ScaleRatioA; + float4 Emissive; + float _smoothness; + float _Metalic; + CBUFFER_END + + // Object and Global properties + SAMPLER(SamplerState_Linear_Repeat); + TEXTURE2D(_MainTex); + SAMPLER(sampler_MainTex); + TEXTURE2D(_FaceTex); + SAMPLER(sampler_FaceTex); + SAMPLER(SamplerState_Linear_Clamp); + TEXTURE2D(_OutlineTex); + SAMPLER(sampler_OutlineTex); + + // Graph Includes + #include "Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl" + + // -- Property used by ScenePickingPass + #ifdef SCENEPICKINGPASS + float4 _SelectionID; + #endif + + // -- Properties used by SceneSelectionPass + #ifdef SCENESELECTIONPASS + int _ObjectId; + int _PassValue; + #endif + + // Graph Functions + + void Unity_Combine_float(float R, float G, float B, float A, out float4 RGBA, out float3 RGB, out float2 RG) + { + RGBA = float4(R, G, B, A); + RGB = float3(R, G, B); + RG = float2(R, G); + } + + void Unity_Divide_float4(float4 A, float4 B, out float4 Out) + { + Out = A / B; + } + + void Unity_Multiply_float2_float2(float2 A, float2 B, out float2 Out) + { + Out = A * B; + } + + void Unity_Subtract_float2(float2 A, float2 B, out float2 Out) + { + Out = A - B; + } + + void Unity_Multiply_float4_float4(float4 A, float4 B, out float4 Out) + { + Out = A * B; + } + + // Custom interpolators pre vertex + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreVertex' */ + + // Graph Vertex + struct VertexDescription + { + float3 Position; + float3 Normal; + float3 Tangent; + }; + + VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN) + { + VertexDescription description = (VertexDescription)0; + description.Position = IN.ObjectSpacePosition; + description.Normal = IN.ObjectSpaceNormal; + description.Tangent = IN.ObjectSpaceTangent; + return description; + } + + // Custom interpolators, pre surface + #ifdef FEATURES_GRAPH_VERTEX + Varyings CustomInterpolatorPassThroughFunc(inout Varyings output, VertexDescription input) + { + return output; + } + #define CUSTOMINTERPOLATOR_VARYPASSTHROUGH_FUNC + #endif + + // Graph Pixel + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN) + { + SurfaceDescription surface = (SurfaceDescription)0; + float4 _UV_533a59502f0abc8bb2c09828f32ebead_Out_0 = IN.uv0; + UnityTexture2D _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.z; + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Height_2 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.w; + float _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3; + ScreenSpaceRatio_float((_UV_533a59502f0abc8bb2c09828f32ebead_Out_0.xy), _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0, 0, _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3); + UnityTexture2D _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(IN.uv0.xy)); + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_R_4 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.r; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_G_5 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.g; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_B_6 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.b; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.a; + float4 _UV_b26868a97b712882abeca1b58698beb0_Out_0 = IN.uv0; + float2 _Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0 = _OutlineOffset1; + float _Property_c650c0154e947e898564d7d1d007d48e_Out_0 = _GradientScale; + UnityTexture2D _Property_6e377359c1349380b9482e9613fcec6b_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.z; + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.w; + float4 _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4; + float3 _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5; + float2 _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6; + Unity_Combine_float(_TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0, _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2, 0, 0, _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5, _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6); + float4 _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2; + Unity_Divide_float4((_Property_c650c0154e947e898564d7d1d007d48e_Out_0.xxxx), _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2); + float2 _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2; + Unity_Multiply_float2_float2(_Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2); + float2 _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2, _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2); + float4 _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_8ecda3d29d47068e8b76538959fab084_Out_2)); + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_R_4 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.r; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_G_5 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.g; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_B_6 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.b; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.a; + float2 _Property_5a3269796f550283a99abee895aeedd4_Out_0 = _OutlineOffset2; + float2 _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2; + Unity_Multiply_float2_float2((_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Property_5a3269796f550283a99abee895aeedd4_Out_0, _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2); + float2 _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2, _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2); + float4 _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2)); + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_R_4 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.r; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_G_5 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.g; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_B_6 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.b; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.a; + float2 _Property_20cbcbce438f6581847bd3da66673af8_Out_0 = _OutlineOffset3; + float2 _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2; + Unity_Multiply_float2_float2(_Property_20cbcbce438f6581847bd3da66673af8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2); + float2 _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2, _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2); + float4 _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2)); + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_R_4 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.r; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_G_5 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.g; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_B_6 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.b; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.a; + float4 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4; + float3 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5; + float2 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6; + Unity_Combine_float(_SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7, _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7, _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7, _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6); + float _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0 = _GradientScale; + float4 _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0 = _IsoPerimeter; + float3 _Property_05d545af6f7ff08387320e1130c67389_Out_0 = _Softness; + float _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0 = _OutlineMode; + float4 _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6; + ComputeSDF44_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0, _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0, (float4(_Property_05d545af6f7ff08387320e1130c67389_Out_0, 1.0)), _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0, _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6); + float4 _Property_eaed1eca838e7183ae708f9502a50dba_Out_0 = _FaceColor; + UnityTexture2D _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0 = UnityBuildTexture2DStructNoScale(_FaceTex); + float4 _UV_90e11fefcc71b18b8d88b417548d224f_Out_0 = IN.uv0; + float4 _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0 = _FaceTex_ST; + float2 _Property_ced4707a1339568eb002c789407f8a3b_Out_0 = _FaceUVSpeed; + float2 _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3; + GenerateUV_float((_UV_90e11fefcc71b18b8d88b417548d224f_Out_0.xy), _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0, _Property_ced4707a1339568eb002c789407f8a3b_Out_0, _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3); + float4 _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0 = SAMPLE_TEXTURE2D(_Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.tex, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.samplerstate, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.GetTransformedUV(_GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3)); + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_R_4 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.r; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_G_5 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.g; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_B_6 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.b; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_A_7 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.a; + float4 _Multiply_48133834a18f14828ac11b58bc205702_Out_2; + Unity_Multiply_float4_float4(_Property_eaed1eca838e7183ae708f9502a50dba_Out_0, _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0, _Multiply_48133834a18f14828ac11b58bc205702_Out_2); + float4 _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2; + Unity_Multiply_float4_float4(IN.VertexColor, _Multiply_48133834a18f14828ac11b58bc205702_Out_2, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2); + float4 _Property_4637336160f04f8397ca8f3b6531e88e_Out_0 = _OutlineColor1; + UnityTexture2D _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0 = UnityBuildTexture2DStructNoScale(_OutlineTex); + float4 _UV_343788cf38e6598db275321a22b05984_Out_0 = IN.uv0; + float4 _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0 = _OutlineTex_ST; + float2 _Property_11ca84fc4adc63868541229e4f404eae_Out_0 = _OutlineUVSpeed; + float2 _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3; + GenerateUV_float((_UV_343788cf38e6598db275321a22b05984_Out_0.xy), _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0, _Property_11ca84fc4adc63868541229e4f404eae_Out_0, _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3); + float4 _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0 = SAMPLE_TEXTURE2D(_Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.tex, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.samplerstate, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.GetTransformedUV(_GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3)); + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_R_4 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.r; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_G_5 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.g; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_B_6 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.b; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_A_7 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.a; + float4 _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2; + Unity_Multiply_float4_float4(_Property_4637336160f04f8397ca8f3b6531e88e_Out_0, _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2); + float4 _Property_6e8acbed3933c6819383cb89fe70a942_Out_0 = _OutlineColor2; + float2 _Property_baa8c75173022e86bde4cc075585af43_Out_0 = _OutlineOffset3; + float4 _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5; + Layer4_float(_ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2, _Property_6e8acbed3933c6819383cb89fe70a942_Out_0, (float4(_Property_baa8c75173022e86bde4cc075585af43_Out_0, 0.0, 1.0)), _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5); + UnityTexture2D _Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + UnityTexture2D _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_abc928409a963289955625c60e3c3674_Width_0 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.z; + float _TexelSize_abc928409a963289955625c60e3c3674_Height_2 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.w; + float4 _UV_7afe81a63629c789aece6cf7ed368769_Out_0 = IN.uv0; + float _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0 = max(0, IN.FaceSign.x); + float3 _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5; + GetSurfaceNormal_float(_Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0.tex, _TexelSize_abc928409a963289955625c60e3c3674_Width_0, _TexelSize_abc928409a963289955625c60e3c3674_Height_2, (_UV_7afe81a63629c789aece6cf7ed368769_Out_0).x, _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5); + float4 _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2; + EvaluateLight_float(_Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5, _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2); + UnityTexture2D _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _UV_87b50231796c43898a28be7b2f8daea3_Out_0 = IN.uv0; + float2 _Property_c20a130451687b8c87b5a623d8ca6d73_Out_0 = _UnderlayOffset; + float2 _Multiply_7d754a30a319c9839ca945e596548e63_Out_2; + Unity_Multiply_float2_float2(_Property_c20a130451687b8c87b5a623d8ca6d73_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2); + float2 _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2; + Unity_Subtract_float2((_UV_87b50231796c43898a28be7b2f8daea3_Out_0.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2, _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2); + float4 _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0 = SAMPLE_TEXTURE2D(_Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.tex, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.samplerstate, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.GetTransformedUV(_Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2)); + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_R_4 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.r; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_G_5 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.g; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_B_6 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.b; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_A_7 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.a; + float _Property_cb906f6db0fb388a91590590b04091ab_Out_0 = _GradientScale; + float _Property_22272afe5996178386aac669fbda451b_Out_0 = _UnderlayDilate; + float _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0 = _UnderlaySoftness; + float _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0; + ComputeSDF_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, (_SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0).x, _Property_cb906f6db0fb388a91590590b04091ab_Out_0, _Property_22272afe5996178386aac669fbda451b_Out_0, _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0, _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0); + float4 _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0 = _UnderlayColor; + float4 _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2; + Layer1_float(_ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0, _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2); + float4 _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2; + Composite_float(_EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2, _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2); + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_R_1 = IN.VertexColor[0]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_G_2 = IN.VertexColor[1]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_B_3 = IN.VertexColor[2]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4 = IN.VertexColor[3]; + float4 _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2; + Unity_Multiply_float4_float4(_CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2, (_Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4.xxxx), _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2); + float _Split_9b3e8141df129b848c4c1b364b613b86_R_1 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[0]; + float _Split_9b3e8141df129b848c4c1b364b613b86_G_2 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[1]; + float _Split_9b3e8141df129b848c4c1b364b613b86_B_3 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[2]; + float _Split_9b3e8141df129b848c4c1b364b613b86_A_4 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[3]; + surface.Alpha = _Split_9b3e8141df129b848c4c1b364b613b86_A_4; + surface.AlphaClipThreshold = 0.5; + return surface; + } + + // -------------------------------------------------- + // Build Graph Inputs + #ifdef HAVE_VFX_MODIFICATION + #define VFX_SRP_ATTRIBUTES Attributes + #define VFX_SRP_VARYINGS Varyings + #define VFX_SRP_SURFACE_INPUTS SurfaceDescriptionInputs + #endif + VertexDescriptionInputs BuildVertexDescriptionInputs(Attributes input) + { + VertexDescriptionInputs output; + ZERO_INITIALIZE(VertexDescriptionInputs, output); + + output.ObjectSpaceNormal = input.normalOS; + output.ObjectSpaceTangent = input.tangentOS.xyz; + output.ObjectSpacePosition = input.positionOS; + + return output; + } + SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) + { + SurfaceDescriptionInputs output; + ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + + #ifdef HAVE_VFX_MODIFICATION + // FragInputs from VFX come from two places: Interpolator or CBuffer. + /* WARNING: $splice Could not find named fragment 'VFXSetFragInputs' */ + + #endif + + + + + + + + output.uv0 = input.texCoord0; + output.uv1 = input.texCoord1; + output.uv2 = input.texCoord2; + output.uv3 = input.texCoord3; + output.VertexColor = input.color; + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); + #else + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #endif + BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + + return output; + } + + // -------------------------------------------------- + // Main + + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/SelectionPickingPass.hlsl" + + // -------------------------------------------------- + // Visual Effect Vertex Invocations + #ifdef HAVE_VFX_MODIFICATION + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl" + #endif + + ENDHLSL + } + Pass + { + Name "ScenePickingPass" + Tags + { + "LightMode" = "Picking" + } + + // Render State + Cull Off + + // Debug + // + + // -------------------------------------------------- + // Pass + + HLSLPROGRAM + + // Pragmas + #pragma target 4.5 + #pragma exclude_renderers gles gles3 glcore + #pragma vertex vert + #pragma fragment frag + + // DotsInstancingOptions: + // HybridV1InjectedBuiltinProperties: + + // Keywords + // PassKeywords: + // GraphKeywords: + + // Defines + + #define _NORMALMAP 1 + #define _NORMAL_DROPOFF_TS 1 + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define ATTRIBUTES_NEED_TEXCOORD0 + #define ATTRIBUTES_NEED_TEXCOORD1 + #define ATTRIBUTES_NEED_TEXCOORD2 + #define ATTRIBUTES_NEED_TEXCOORD3 + #define ATTRIBUTES_NEED_COLOR + #define VARYINGS_NEED_TEXCOORD0 + #define VARYINGS_NEED_TEXCOORD1 + #define VARYINGS_NEED_TEXCOORD2 + #define VARYINGS_NEED_TEXCOORD3 + #define VARYINGS_NEED_COLOR + #define VARYINGS_NEED_CULLFACE + #define FEATURES_GRAPH_VERTEX + /* WARNING: $splice Could not find named fragment 'PassInstancing' */ + #define SHADERPASS SHADERPASS_DEPTHONLY + #define SCENEPICKINGPASS 1 + #define ALPHA_CLIP_THRESHOLD 1 + #define _ALPHATEST_ON 1 + /* WARNING: $splice Could not find named fragment 'DotsInstancingVars' */ + + + // custom interpolator pre-include + /* WARNING: $splice Could not find named fragment 'sgci_CustomInterpolatorPreInclude' */ + + // Includes + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + // -------------------------------------------------- + // Structs and Packing + + // custom interpolators pre packing + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPrePacking' */ + + struct Attributes + { + float3 positionOS : POSITION; + float3 normalOS : NORMAL; + float4 tangentOS : TANGENT; + float4 uv0 : TEXCOORD0; + float4 uv1 : TEXCOORD1; + float4 uv2 : TEXCOORD2; + float4 uv3 : TEXCOORD3; + float4 color : COLOR; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : INSTANCEID_SEMANTIC; + #endif + }; + struct Varyings + { + float4 positionCS : SV_POSITION; + float4 texCoord0; + float4 texCoord1; + float4 texCoord2; + float4 texCoord3; + float4 color; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + struct SurfaceDescriptionInputs + { + float4 uv0; + float4 uv1; + float4 uv2; + float4 uv3; + float4 VertexColor; + float FaceSign; + }; + struct VertexDescriptionInputs + { + float3 ObjectSpaceNormal; + float3 ObjectSpaceTangent; + float3 ObjectSpacePosition; + }; + struct PackedVaryings + { + float4 positionCS : SV_POSITION; + float4 interp0 : INTERP0; + float4 interp1 : INTERP1; + float4 interp2 : INTERP2; + float4 interp3 : INTERP3; + float4 interp4 : INTERP4; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + + PackedVaryings PackVaryings (Varyings input) + { + PackedVaryings output; + ZERO_INITIALIZE(PackedVaryings, output); + output.positionCS = input.positionCS; + output.interp0.xyzw = input.texCoord0; + output.interp1.xyzw = input.texCoord1; + output.interp2.xyzw = input.texCoord2; + output.interp3.xyzw = input.texCoord3; + output.interp4.xyzw = input.color; + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + Varyings UnpackVaryings (PackedVaryings input) + { + Varyings output; + output.positionCS = input.positionCS; + output.texCoord0 = input.interp0.xyzw; + output.texCoord1 = input.interp1.xyzw; + output.texCoord2 = input.interp2.xyzw; + output.texCoord3 = input.interp3.xyzw; + output.color = input.interp4.xyzw; + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + + // -------------------------------------------------- + // Graph + + // Graph Properties + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_TexelSize; + float2 _OutlineOffset1; + float2 _OutlineOffset2; + float2 _OutlineOffset3; + float _GradientScale; + float4 _FaceColor; + float4 _IsoPerimeter; + float4 _OutlineColor1; + float4 _OutlineColor2; + float4 _OutlineColor3; + float _OutlineMode; + float3 _Softness; + float4 _FaceTex_TexelSize; + float2 _FaceUVSpeed; + float4 _FaceTex_ST; + float4 _OutlineTex_ST; + float2 _OutlineUVSpeed; + float4 _UnderlayColor; + float2 _UnderlayOffset; + float _UnderlayDilate; + float _UnderlaySoftness; + float _BevelType; + float _BevelAmount; + float _BevelOffset; + float _BevelWidth; + float _BevelRoundness; + float _BevelClamp; + float4 _SpecularColor; + float _LightAngle; + float _SpecularPower; + float _Reflectivity; + float _Diffuse; + float _Ambient; + float4 _OutlineTex_TexelSize; + float _ScaleRatioA; + float4 Emissive; + float _smoothness; + float _Metalic; + CBUFFER_END + + // Object and Global properties + SAMPLER(SamplerState_Linear_Repeat); + TEXTURE2D(_MainTex); + SAMPLER(sampler_MainTex); + TEXTURE2D(_FaceTex); + SAMPLER(sampler_FaceTex); + SAMPLER(SamplerState_Linear_Clamp); + TEXTURE2D(_OutlineTex); + SAMPLER(sampler_OutlineTex); + + // Graph Includes + #include "Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl" + + // -- Property used by ScenePickingPass + #ifdef SCENEPICKINGPASS + float4 _SelectionID; + #endif + + // -- Properties used by SceneSelectionPass + #ifdef SCENESELECTIONPASS + int _ObjectId; + int _PassValue; + #endif + + // Graph Functions + + void Unity_Combine_float(float R, float G, float B, float A, out float4 RGBA, out float3 RGB, out float2 RG) + { + RGBA = float4(R, G, B, A); + RGB = float3(R, G, B); + RG = float2(R, G); + } + + void Unity_Divide_float4(float4 A, float4 B, out float4 Out) + { + Out = A / B; + } + + void Unity_Multiply_float2_float2(float2 A, float2 B, out float2 Out) + { + Out = A * B; + } + + void Unity_Subtract_float2(float2 A, float2 B, out float2 Out) + { + Out = A - B; + } + + void Unity_Multiply_float4_float4(float4 A, float4 B, out float4 Out) + { + Out = A * B; + } + + // Custom interpolators pre vertex + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreVertex' */ + + // Graph Vertex + struct VertexDescription + { + float3 Position; + float3 Normal; + float3 Tangent; + }; + + VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN) + { + VertexDescription description = (VertexDescription)0; + description.Position = IN.ObjectSpacePosition; + description.Normal = IN.ObjectSpaceNormal; + description.Tangent = IN.ObjectSpaceTangent; + return description; + } + + // Custom interpolators, pre surface + #ifdef FEATURES_GRAPH_VERTEX + Varyings CustomInterpolatorPassThroughFunc(inout Varyings output, VertexDescription input) + { + return output; + } + #define CUSTOMINTERPOLATOR_VARYPASSTHROUGH_FUNC + #endif + + // Graph Pixel + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN) + { + SurfaceDescription surface = (SurfaceDescription)0; + float4 _UV_533a59502f0abc8bb2c09828f32ebead_Out_0 = IN.uv0; + UnityTexture2D _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.z; + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Height_2 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.w; + float _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3; + ScreenSpaceRatio_float((_UV_533a59502f0abc8bb2c09828f32ebead_Out_0.xy), _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0, 0, _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3); + UnityTexture2D _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(IN.uv0.xy)); + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_R_4 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.r; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_G_5 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.g; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_B_6 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.b; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.a; + float4 _UV_b26868a97b712882abeca1b58698beb0_Out_0 = IN.uv0; + float2 _Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0 = _OutlineOffset1; + float _Property_c650c0154e947e898564d7d1d007d48e_Out_0 = _GradientScale; + UnityTexture2D _Property_6e377359c1349380b9482e9613fcec6b_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.z; + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.w; + float4 _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4; + float3 _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5; + float2 _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6; + Unity_Combine_float(_TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0, _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2, 0, 0, _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5, _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6); + float4 _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2; + Unity_Divide_float4((_Property_c650c0154e947e898564d7d1d007d48e_Out_0.xxxx), _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2); + float2 _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2; + Unity_Multiply_float2_float2(_Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2); + float2 _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2, _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2); + float4 _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_8ecda3d29d47068e8b76538959fab084_Out_2)); + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_R_4 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.r; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_G_5 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.g; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_B_6 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.b; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.a; + float2 _Property_5a3269796f550283a99abee895aeedd4_Out_0 = _OutlineOffset2; + float2 _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2; + Unity_Multiply_float2_float2((_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Property_5a3269796f550283a99abee895aeedd4_Out_0, _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2); + float2 _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2, _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2); + float4 _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2)); + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_R_4 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.r; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_G_5 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.g; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_B_6 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.b; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.a; + float2 _Property_20cbcbce438f6581847bd3da66673af8_Out_0 = _OutlineOffset3; + float2 _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2; + Unity_Multiply_float2_float2(_Property_20cbcbce438f6581847bd3da66673af8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2); + float2 _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2, _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2); + float4 _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2)); + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_R_4 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.r; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_G_5 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.g; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_B_6 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.b; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.a; + float4 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4; + float3 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5; + float2 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6; + Unity_Combine_float(_SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7, _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7, _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7, _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6); + float _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0 = _GradientScale; + float4 _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0 = _IsoPerimeter; + float3 _Property_05d545af6f7ff08387320e1130c67389_Out_0 = _Softness; + float _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0 = _OutlineMode; + float4 _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6; + ComputeSDF44_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0, _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0, (float4(_Property_05d545af6f7ff08387320e1130c67389_Out_0, 1.0)), _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0, _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6); + float4 _Property_eaed1eca838e7183ae708f9502a50dba_Out_0 = _FaceColor; + UnityTexture2D _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0 = UnityBuildTexture2DStructNoScale(_FaceTex); + float4 _UV_90e11fefcc71b18b8d88b417548d224f_Out_0 = IN.uv0; + float4 _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0 = _FaceTex_ST; + float2 _Property_ced4707a1339568eb002c789407f8a3b_Out_0 = _FaceUVSpeed; + float2 _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3; + GenerateUV_float((_UV_90e11fefcc71b18b8d88b417548d224f_Out_0.xy), _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0, _Property_ced4707a1339568eb002c789407f8a3b_Out_0, _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3); + float4 _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0 = SAMPLE_TEXTURE2D(_Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.tex, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.samplerstate, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.GetTransformedUV(_GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3)); + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_R_4 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.r; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_G_5 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.g; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_B_6 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.b; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_A_7 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.a; + float4 _Multiply_48133834a18f14828ac11b58bc205702_Out_2; + Unity_Multiply_float4_float4(_Property_eaed1eca838e7183ae708f9502a50dba_Out_0, _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0, _Multiply_48133834a18f14828ac11b58bc205702_Out_2); + float4 _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2; + Unity_Multiply_float4_float4(IN.VertexColor, _Multiply_48133834a18f14828ac11b58bc205702_Out_2, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2); + float4 _Property_4637336160f04f8397ca8f3b6531e88e_Out_0 = _OutlineColor1; + UnityTexture2D _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0 = UnityBuildTexture2DStructNoScale(_OutlineTex); + float4 _UV_343788cf38e6598db275321a22b05984_Out_0 = IN.uv0; + float4 _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0 = _OutlineTex_ST; + float2 _Property_11ca84fc4adc63868541229e4f404eae_Out_0 = _OutlineUVSpeed; + float2 _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3; + GenerateUV_float((_UV_343788cf38e6598db275321a22b05984_Out_0.xy), _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0, _Property_11ca84fc4adc63868541229e4f404eae_Out_0, _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3); + float4 _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0 = SAMPLE_TEXTURE2D(_Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.tex, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.samplerstate, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.GetTransformedUV(_GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3)); + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_R_4 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.r; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_G_5 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.g; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_B_6 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.b; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_A_7 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.a; + float4 _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2; + Unity_Multiply_float4_float4(_Property_4637336160f04f8397ca8f3b6531e88e_Out_0, _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2); + float4 _Property_6e8acbed3933c6819383cb89fe70a942_Out_0 = _OutlineColor2; + float2 _Property_baa8c75173022e86bde4cc075585af43_Out_0 = _OutlineOffset3; + float4 _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5; + Layer4_float(_ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2, _Property_6e8acbed3933c6819383cb89fe70a942_Out_0, (float4(_Property_baa8c75173022e86bde4cc075585af43_Out_0, 0.0, 1.0)), _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5); + UnityTexture2D _Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + UnityTexture2D _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_abc928409a963289955625c60e3c3674_Width_0 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.z; + float _TexelSize_abc928409a963289955625c60e3c3674_Height_2 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.w; + float4 _UV_7afe81a63629c789aece6cf7ed368769_Out_0 = IN.uv0; + float _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0 = max(0, IN.FaceSign.x); + float3 _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5; + GetSurfaceNormal_float(_Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0.tex, _TexelSize_abc928409a963289955625c60e3c3674_Width_0, _TexelSize_abc928409a963289955625c60e3c3674_Height_2, (_UV_7afe81a63629c789aece6cf7ed368769_Out_0).x, _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5); + float4 _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2; + EvaluateLight_float(_Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5, _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2); + UnityTexture2D _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _UV_87b50231796c43898a28be7b2f8daea3_Out_0 = IN.uv0; + float2 _Property_c20a130451687b8c87b5a623d8ca6d73_Out_0 = _UnderlayOffset; + float2 _Multiply_7d754a30a319c9839ca945e596548e63_Out_2; + Unity_Multiply_float2_float2(_Property_c20a130451687b8c87b5a623d8ca6d73_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2); + float2 _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2; + Unity_Subtract_float2((_UV_87b50231796c43898a28be7b2f8daea3_Out_0.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2, _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2); + float4 _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0 = SAMPLE_TEXTURE2D(_Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.tex, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.samplerstate, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.GetTransformedUV(_Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2)); + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_R_4 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.r; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_G_5 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.g; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_B_6 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.b; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_A_7 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.a; + float _Property_cb906f6db0fb388a91590590b04091ab_Out_0 = _GradientScale; + float _Property_22272afe5996178386aac669fbda451b_Out_0 = _UnderlayDilate; + float _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0 = _UnderlaySoftness; + float _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0; + ComputeSDF_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, (_SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0).x, _Property_cb906f6db0fb388a91590590b04091ab_Out_0, _Property_22272afe5996178386aac669fbda451b_Out_0, _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0, _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0); + float4 _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0 = _UnderlayColor; + float4 _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2; + Layer1_float(_ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0, _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2); + float4 _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2; + Composite_float(_EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2, _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2); + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_R_1 = IN.VertexColor[0]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_G_2 = IN.VertexColor[1]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_B_3 = IN.VertexColor[2]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4 = IN.VertexColor[3]; + float4 _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2; + Unity_Multiply_float4_float4(_CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2, (_Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4.xxxx), _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2); + float _Split_9b3e8141df129b848c4c1b364b613b86_R_1 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[0]; + float _Split_9b3e8141df129b848c4c1b364b613b86_G_2 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[1]; + float _Split_9b3e8141df129b848c4c1b364b613b86_B_3 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[2]; + float _Split_9b3e8141df129b848c4c1b364b613b86_A_4 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[3]; + surface.Alpha = _Split_9b3e8141df129b848c4c1b364b613b86_A_4; + surface.AlphaClipThreshold = 0.5; + return surface; + } + + // -------------------------------------------------- + // Build Graph Inputs + #ifdef HAVE_VFX_MODIFICATION + #define VFX_SRP_ATTRIBUTES Attributes + #define VFX_SRP_VARYINGS Varyings + #define VFX_SRP_SURFACE_INPUTS SurfaceDescriptionInputs + #endif + VertexDescriptionInputs BuildVertexDescriptionInputs(Attributes input) + { + VertexDescriptionInputs output; + ZERO_INITIALIZE(VertexDescriptionInputs, output); + + output.ObjectSpaceNormal = input.normalOS; + output.ObjectSpaceTangent = input.tangentOS.xyz; + output.ObjectSpacePosition = input.positionOS; + + return output; + } + SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) + { + SurfaceDescriptionInputs output; + ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + + #ifdef HAVE_VFX_MODIFICATION + // FragInputs from VFX come from two places: Interpolator or CBuffer. + /* WARNING: $splice Could not find named fragment 'VFXSetFragInputs' */ + + #endif + + + + + + + + output.uv0 = input.texCoord0; + output.uv1 = input.texCoord1; + output.uv2 = input.texCoord2; + output.uv3 = input.texCoord3; + output.VertexColor = input.color; + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); + #else + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #endif + BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + + return output; + } + + // -------------------------------------------------- + // Main + + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/SelectionPickingPass.hlsl" + + // -------------------------------------------------- + // Visual Effect Vertex Invocations + #ifdef HAVE_VFX_MODIFICATION + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl" + #endif + + ENDHLSL + } + Pass + { + // Name: + Tags + { + "LightMode" = "Universal2D" + } + + // Render State + Cull Off + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + ZTest LEqual + ZWrite Off + + // Debug + // + + // -------------------------------------------------- + // Pass + + HLSLPROGRAM + + // Pragmas + #pragma target 4.5 + #pragma exclude_renderers gles gles3 glcore + #pragma vertex vert + #pragma fragment frag + + // DotsInstancingOptions: + // HybridV1InjectedBuiltinProperties: + + // Keywords + // PassKeywords: + // GraphKeywords: + + // Defines + + #define _NORMALMAP 1 + #define _NORMAL_DROPOFF_TS 1 + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define ATTRIBUTES_NEED_TEXCOORD0 + #define ATTRIBUTES_NEED_TEXCOORD1 + #define ATTRIBUTES_NEED_TEXCOORD2 + #define ATTRIBUTES_NEED_TEXCOORD3 + #define ATTRIBUTES_NEED_COLOR + #define VARYINGS_NEED_TEXCOORD0 + #define VARYINGS_NEED_TEXCOORD1 + #define VARYINGS_NEED_TEXCOORD2 + #define VARYINGS_NEED_TEXCOORD3 + #define VARYINGS_NEED_COLOR + #define VARYINGS_NEED_CULLFACE + #define FEATURES_GRAPH_VERTEX + /* WARNING: $splice Could not find named fragment 'PassInstancing' */ + #define SHADERPASS SHADERPASS_2D + #define _ALPHATEST_ON 1 + /* WARNING: $splice Could not find named fragment 'DotsInstancingVars' */ + + + // custom interpolator pre-include + /* WARNING: $splice Could not find named fragment 'sgci_CustomInterpolatorPreInclude' */ + + // Includes + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + // -------------------------------------------------- + // Structs and Packing + + // custom interpolators pre packing + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPrePacking' */ + + struct Attributes + { + float3 positionOS : POSITION; + float3 normalOS : NORMAL; + float4 tangentOS : TANGENT; + float4 uv0 : TEXCOORD0; + float4 uv1 : TEXCOORD1; + float4 uv2 : TEXCOORD2; + float4 uv3 : TEXCOORD3; + float4 color : COLOR; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : INSTANCEID_SEMANTIC; + #endif + }; + struct Varyings + { + float4 positionCS : SV_POSITION; + float4 texCoord0; + float4 texCoord1; + float4 texCoord2; + float4 texCoord3; + float4 color; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + struct SurfaceDescriptionInputs + { + float4 uv0; + float4 uv1; + float4 uv2; + float4 uv3; + float4 VertexColor; + float FaceSign; + }; + struct VertexDescriptionInputs + { + float3 ObjectSpaceNormal; + float3 ObjectSpaceTangent; + float3 ObjectSpacePosition; + }; + struct PackedVaryings + { + float4 positionCS : SV_POSITION; + float4 interp0 : INTERP0; + float4 interp1 : INTERP1; + float4 interp2 : INTERP2; + float4 interp3 : INTERP3; + float4 interp4 : INTERP4; + #if UNITY_ANY_INSTANCING_ENABLED + uint instanceID : CUSTOM_INSTANCE_ID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; + #endif + }; + + PackedVaryings PackVaryings (Varyings input) + { + PackedVaryings output; + ZERO_INITIALIZE(PackedVaryings, output); + output.positionCS = input.positionCS; + output.interp0.xyzw = input.texCoord0; + output.interp1.xyzw = input.texCoord1; + output.interp2.xyzw = input.texCoord2; + output.interp3.xyzw = input.texCoord3; + output.interp4.xyzw = input.color; + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + Varyings UnpackVaryings (PackedVaryings input) + { + Varyings output; + output.positionCS = input.positionCS; + output.texCoord0 = input.interp0.xyzw; + output.texCoord1 = input.interp1.xyzw; + output.texCoord2 = input.interp2.xyzw; + output.texCoord3 = input.interp3.xyzw; + output.color = input.interp4.xyzw; + #if UNITY_ANY_INSTANCING_ENABLED + output.instanceID = input.instanceID; + #endif + #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) + output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; + #endif + #if (defined(UNITY_STEREO_INSTANCING_ENABLED)) + output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; + #endif + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + output.cullFace = input.cullFace; + #endif + return output; + } + + + // -------------------------------------------------- + // Graph + + // Graph Properties + CBUFFER_START(UnityPerMaterial) + float4 _MainTex_TexelSize; + float2 _OutlineOffset1; + float2 _OutlineOffset2; + float2 _OutlineOffset3; + float _GradientScale; + float4 _FaceColor; + float4 _IsoPerimeter; + float4 _OutlineColor1; + float4 _OutlineColor2; + float4 _OutlineColor3; + float _OutlineMode; + float3 _Softness; + float4 _FaceTex_TexelSize; + float2 _FaceUVSpeed; + float4 _FaceTex_ST; + float4 _OutlineTex_ST; + float2 _OutlineUVSpeed; + float4 _UnderlayColor; + float2 _UnderlayOffset; + float _UnderlayDilate; + float _UnderlaySoftness; + float _BevelType; + float _BevelAmount; + float _BevelOffset; + float _BevelWidth; + float _BevelRoundness; + float _BevelClamp; + float4 _SpecularColor; + float _LightAngle; + float _SpecularPower; + float _Reflectivity; + float _Diffuse; + float _Ambient; + float4 _OutlineTex_TexelSize; + float _ScaleRatioA; + float4 Emissive; + float _smoothness; + float _Metalic; + CBUFFER_END + + // Object and Global properties + SAMPLER(SamplerState_Linear_Repeat); + TEXTURE2D(_MainTex); + SAMPLER(sampler_MainTex); + TEXTURE2D(_FaceTex); + SAMPLER(sampler_FaceTex); + SAMPLER(SamplerState_Linear_Clamp); + TEXTURE2D(_OutlineTex); + SAMPLER(sampler_OutlineTex); + + // Graph Includes + #include "Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl" + + // -- Property used by ScenePickingPass + #ifdef SCENEPICKINGPASS + float4 _SelectionID; + #endif + + // -- Properties used by SceneSelectionPass + #ifdef SCENESELECTIONPASS + int _ObjectId; + int _PassValue; + #endif + + // Graph Functions + + void Unity_Combine_float(float R, float G, float B, float A, out float4 RGBA, out float3 RGB, out float2 RG) + { + RGBA = float4(R, G, B, A); + RGB = float3(R, G, B); + RG = float2(R, G); + } + + void Unity_Divide_float4(float4 A, float4 B, out float4 Out) + { + Out = A / B; + } + + void Unity_Multiply_float2_float2(float2 A, float2 B, out float2 Out) + { + Out = A * B; + } + + void Unity_Subtract_float2(float2 A, float2 B, out float2 Out) + { + Out = A - B; + } + + void Unity_Multiply_float4_float4(float4 A, float4 B, out float4 Out) + { + Out = A * B; + } + + // Custom interpolators pre vertex + /* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreVertex' */ + + // Graph Vertex + struct VertexDescription + { + float3 Position; + float3 Normal; + float3 Tangent; + }; + + VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN) + { + VertexDescription description = (VertexDescription)0; + description.Position = IN.ObjectSpacePosition; + description.Normal = IN.ObjectSpaceNormal; + description.Tangent = IN.ObjectSpaceTangent; + return description; + } + + // Custom interpolators, pre surface + #ifdef FEATURES_GRAPH_VERTEX + Varyings CustomInterpolatorPassThroughFunc(inout Varyings output, VertexDescription input) + { + return output; + } + #define CUSTOMINTERPOLATOR_VARYPASSTHROUGH_FUNC + #endif + + // Graph Pixel + struct SurfaceDescription + { + float3 BaseColor; + float Alpha; + float AlphaClipThreshold; + }; + + SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN) + { + SurfaceDescription surface = (SurfaceDescription)0; + float4 _UV_533a59502f0abc8bb2c09828f32ebead_Out_0 = IN.uv0; + UnityTexture2D _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.z; + float _TexelSize_389f09eeac16ed8eb7a6151195af0507_Height_2 = _Property_1fe43c50e88d8d82b3ef889f12dcfb65_Out_0.texelSize.w; + float _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3; + ScreenSpaceRatio_float((_UV_533a59502f0abc8bb2c09828f32ebead_Out_0.xy), _TexelSize_389f09eeac16ed8eb7a6151195af0507_Width_0, 0, _ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3); + UnityTexture2D _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(IN.uv0.xy)); + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_R_4 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.r; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_G_5 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.g; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_B_6 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.b; + float _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7 = _SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_RGBA_0.a; + float4 _UV_b26868a97b712882abeca1b58698beb0_Out_0 = IN.uv0; + float2 _Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0 = _OutlineOffset1; + float _Property_c650c0154e947e898564d7d1d007d48e_Out_0 = _GradientScale; + UnityTexture2D _Property_6e377359c1349380b9482e9613fcec6b_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.z; + float _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2 = _Property_6e377359c1349380b9482e9613fcec6b_Out_0.texelSize.w; + float4 _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4; + float3 _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5; + float2 _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6; + Unity_Combine_float(_TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Width_0, _TexelSize_50a5d2cfcb0fb5868c2afda9bcb48dc7_Height_2, 0, 0, _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Combine_fd0cd2353f78958d948ad3086c76645e_RGB_5, _Combine_fd0cd2353f78958d948ad3086c76645e_RG_6); + float4 _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2; + Unity_Divide_float4((_Property_c650c0154e947e898564d7d1d007d48e_Out_0.xxxx), _Combine_fd0cd2353f78958d948ad3086c76645e_RGBA_4, _Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2); + float2 _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2; + Unity_Multiply_float2_float2(_Property_e4fdf31842293c8fb0a7eb85f924b8b8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2); + float2 _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_9af20166c7f70c88a2d4c144834f02e5_Out_2, _Subtract_8ecda3d29d47068e8b76538959fab084_Out_2); + float4 _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_8ecda3d29d47068e8b76538959fab084_Out_2)); + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_R_4 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.r; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_G_5 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.g; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_B_6 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.b; + float _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7 = _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_RGBA_0.a; + float2 _Property_5a3269796f550283a99abee895aeedd4_Out_0 = _OutlineOffset2; + float2 _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2; + Unity_Multiply_float2_float2((_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Property_5a3269796f550283a99abee895aeedd4_Out_0, _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2); + float2 _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_85a4a1da71c88a8aa9cf834b093b4972_Out_2, _Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2); + float4 _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_02ec11df97f0828fb90fe51bc7b54681_Out_2)); + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_R_4 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.r; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_G_5 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.g; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_B_6 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.b; + float _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7 = _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_RGBA_0.a; + float2 _Property_20cbcbce438f6581847bd3da66673af8_Out_0 = _OutlineOffset3; + float2 _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2; + Unity_Multiply_float2_float2(_Property_20cbcbce438f6581847bd3da66673af8_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2); + float2 _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2; + Unity_Subtract_float2((_UV_b26868a97b712882abeca1b58698beb0_Out_0.xy), _Multiply_25810e5a76f1a28eb6ec31562b2826f7_Out_2, _Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2); + float4 _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0 = SAMPLE_TEXTURE2D(_Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.tex, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.samplerstate, _Property_954c72ffa0c26f869fe03d926f8a55be_Out_0.GetTransformedUV(_Subtract_35bf56304ae79a858535fc1f6d2bb434_Out_2)); + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_R_4 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.r; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_G_5 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.g; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_B_6 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.b; + float _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7 = _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_RGBA_0.a; + float4 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4; + float3 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5; + float2 _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6; + Unity_Combine_float(_SampleTexture2D_c7724e68891dfd8fb3f6f6438d260c7e_A_7, _SampleTexture2D_6eff60a2fbddd98c88812ff580f90b76_A_7, _SampleTexture2D_2ecc410c1f24678bb1f0bf27189d4db2_A_7, _SampleTexture2D_ff6dd86b2d329e848816a50765c58716_A_7, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGB_5, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RG_6); + float _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0 = _GradientScale; + float4 _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0 = _IsoPerimeter; + float3 _Property_05d545af6f7ff08387320e1130c67389_Out_0 = _Softness; + float _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0 = _OutlineMode; + float4 _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6; + ComputeSDF44_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, _Combine_a777dc93e8ca248cb6fe690cc4a77a5a_RGBA_4, _Property_bdf7e7b4670fdc86a20f193fb041efd3_Out_0, _Property_f5d0374e48ad748a9e62658056ab81a3_Out_0, (float4(_Property_05d545af6f7ff08387320e1130c67389_Out_0, 1.0)), _Property_ab4e94278c3a0b8eba9ceccb7822f574_Out_0, _ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6); + float4 _Property_eaed1eca838e7183ae708f9502a50dba_Out_0 = _FaceColor; + UnityTexture2D _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0 = UnityBuildTexture2DStructNoScale(_FaceTex); + float4 _UV_90e11fefcc71b18b8d88b417548d224f_Out_0 = IN.uv0; + float4 _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0 = _FaceTex_ST; + float2 _Property_ced4707a1339568eb002c789407f8a3b_Out_0 = _FaceUVSpeed; + float2 _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3; + GenerateUV_float((_UV_90e11fefcc71b18b8d88b417548d224f_Out_0.xy), _Property_26b98e8b908b638d92c1cf36c28e2c9f_Out_0, _Property_ced4707a1339568eb002c789407f8a3b_Out_0, _GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3); + float4 _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0 = SAMPLE_TEXTURE2D(_Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.tex, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.samplerstate, _Property_8be90b40fe8d878fb21c1cc890b86378_Out_0.GetTransformedUV(_GenerateUVCustomFunction_31c71b52d27c2b86a20c03f7256c5fa5_UV_3)); + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_R_4 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.r; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_G_5 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.g; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_B_6 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.b; + float _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_A_7 = _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0.a; + float4 _Multiply_48133834a18f14828ac11b58bc205702_Out_2; + Unity_Multiply_float4_float4(_Property_eaed1eca838e7183ae708f9502a50dba_Out_0, _SampleTexture2D_c882f19d0ae7ed87b310a0d75334a39f_RGBA_0, _Multiply_48133834a18f14828ac11b58bc205702_Out_2); + float4 _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2; + Unity_Multiply_float4_float4(IN.VertexColor, _Multiply_48133834a18f14828ac11b58bc205702_Out_2, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2); + float4 _Property_4637336160f04f8397ca8f3b6531e88e_Out_0 = _OutlineColor1; + UnityTexture2D _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0 = UnityBuildTexture2DStructNoScale(_OutlineTex); + float4 _UV_343788cf38e6598db275321a22b05984_Out_0 = IN.uv0; + float4 _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0 = _OutlineTex_ST; + float2 _Property_11ca84fc4adc63868541229e4f404eae_Out_0 = _OutlineUVSpeed; + float2 _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3; + GenerateUV_float((_UV_343788cf38e6598db275321a22b05984_Out_0.xy), _Property_f5b7ef749a5e5a80911752b8c751465e_Out_0, _Property_11ca84fc4adc63868541229e4f404eae_Out_0, _GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3); + float4 _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0 = SAMPLE_TEXTURE2D(_Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.tex, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.samplerstate, _Property_dae1c5bdd7aa6687b1cd165feffd5710_Out_0.GetTransformedUV(_GenerateUVCustomFunction_dadb37f57181a4829003e40234b9d409_UV_3)); + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_R_4 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.r; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_G_5 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.g; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_B_6 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.b; + float _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_A_7 = _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0.a; + float4 _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2; + Unity_Multiply_float4_float4(_Property_4637336160f04f8397ca8f3b6531e88e_Out_0, _SampleTexture2D_44ec75290e3e9b8fbcf92c999d6ac8bc_RGBA_0, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2); + float4 _Property_6e8acbed3933c6819383cb89fe70a942_Out_0 = _OutlineColor2; + float2 _Property_baa8c75173022e86bde4cc075585af43_Out_0 = _OutlineOffset3; + float4 _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5; + Layer4_float(_ComputeSDF44CustomFunction_13b6209c286745868057a70fce31d5e1_Alpha_6, _Multiply_223ab9ae77672a8798690299a6dae4bd_Out_2, _Multiply_8d7e7fd5eca24b8db946e4e5a4968f70_Out_2, _Property_6e8acbed3933c6819383cb89fe70a942_Out_0, (float4(_Property_baa8c75173022e86bde4cc075585af43_Out_0, 0.0, 1.0)), _Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5); + UnityTexture2D _Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + UnityTexture2D _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float _TexelSize_abc928409a963289955625c60e3c3674_Width_0 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.z; + float _TexelSize_abc928409a963289955625c60e3c3674_Height_2 = _Property_1744832cec65fb85a42db2e1d9cdff97_Out_0.texelSize.w; + float4 _UV_7afe81a63629c789aece6cf7ed368769_Out_0 = IN.uv0; + float _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0 = max(0, IN.FaceSign.x); + float3 _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5; + GetSurfaceNormal_float(_Property_5b0219fd9b23c785b6053d92dc125ed9_Out_0.tex, _TexelSize_abc928409a963289955625c60e3c3674_Width_0, _TexelSize_abc928409a963289955625c60e3c3674_Height_2, (_UV_7afe81a63629c789aece6cf7ed368769_Out_0).x, _IsFrontFace_33ef6b7d7f95818ba696de9dae14e559_Out_0, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5); + float4 _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2; + EvaluateLight_float(_Layer4CustomFunction_ab624c3948e3a08ab05aef05a98eb8f7_RGBA_5, _GetSurfaceNormalCustomFunction_27813c88a9458283b1866c0fcdaf259a_New5_5, _EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2); + UnityTexture2D _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0 = UnityBuildTexture2DStructNoScale(_MainTex); + float4 _UV_87b50231796c43898a28be7b2f8daea3_Out_0 = IN.uv0; + float2 _Property_c20a130451687b8c87b5a623d8ca6d73_Out_0 = _UnderlayOffset; + float2 _Multiply_7d754a30a319c9839ca945e596548e63_Out_2; + Unity_Multiply_float2_float2(_Property_c20a130451687b8c87b5a623d8ca6d73_Out_0, (_Divide_5e0d454c5ea95b88a8f414c16e1bf059_Out_2.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2); + float2 _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2; + Unity_Subtract_float2((_UV_87b50231796c43898a28be7b2f8daea3_Out_0.xy), _Multiply_7d754a30a319c9839ca945e596548e63_Out_2, _Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2); + float4 _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0 = SAMPLE_TEXTURE2D(_Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.tex, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.samplerstate, _Property_3407a26c1e2b438ab594b42c3b95454e_Out_0.GetTransformedUV(_Subtract_ebbd2e0341529d80a91e0d0893b6ee73_Out_2)); + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_R_4 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.r; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_G_5 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.g; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_B_6 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.b; + float _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_A_7 = _SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0.a; + float _Property_cb906f6db0fb388a91590590b04091ab_Out_0 = _GradientScale; + float _Property_22272afe5996178386aac669fbda451b_Out_0 = _UnderlayDilate; + float _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0 = _UnderlaySoftness; + float _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0; + ComputeSDF_float(_ScreenSpaceRatioCustomFunction_eef499a7036c138e9121e5151cdb5be1_New3_3, (_SampleTexture2D_fe4f97a213ae1d8aa48bfc4f1aa17fa9_RGBA_0).x, _Property_cb906f6db0fb388a91590590b04091ab_Out_0, _Property_22272afe5996178386aac669fbda451b_Out_0, _Property_1cd799c4097e1685b9dbf5dd80b6062b_Out_0, _ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0); + float4 _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0 = _UnderlayColor; + float4 _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2; + Layer1_float(_ComputeSDFCustomFunction_cb33c8373e2fb98da278a4b6f9bab088_Alpha_0, _Property_4be3e1d3be22b78f9f4e23b78e8d6064_Out_0, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2); + float4 _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2; + Composite_float(_EvaluateLightCustomFunction_cd74ed92b44ab58b95bf81cf4664fa77_Color_2, _Layer1CustomFunction_58efba96e643d281ba7d757bc713ff15_RGBA_2, _CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2); + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_R_1 = IN.VertexColor[0]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_G_2 = IN.VertexColor[1]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_B_3 = IN.VertexColor[2]; + float _Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4 = IN.VertexColor[3]; + float4 _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2; + Unity_Multiply_float4_float4(_CompositeCustomFunction_7e22b933a6629e8389cf370acfd80658_RGBA_2, (_Split_79de04ac9d55bc8693a6a09c54eed8bb_A_4.xxxx), _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2); + float _Split_9b3e8141df129b848c4c1b364b613b86_R_1 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[0]; + float _Split_9b3e8141df129b848c4c1b364b613b86_G_2 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[1]; + float _Split_9b3e8141df129b848c4c1b364b613b86_B_3 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[2]; + float _Split_9b3e8141df129b848c4c1b364b613b86_A_4 = _Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2[3]; + surface.BaseColor = (_Multiply_17b5e496d42b5d89b09b1763aa47bb78_Out_2.xyz); + surface.Alpha = _Split_9b3e8141df129b848c4c1b364b613b86_A_4; + surface.AlphaClipThreshold = 0.5; + return surface; + } + + // -------------------------------------------------- + // Build Graph Inputs + #ifdef HAVE_VFX_MODIFICATION + #define VFX_SRP_ATTRIBUTES Attributes + #define VFX_SRP_VARYINGS Varyings + #define VFX_SRP_SURFACE_INPUTS SurfaceDescriptionInputs + #endif + VertexDescriptionInputs BuildVertexDescriptionInputs(Attributes input) + { + VertexDescriptionInputs output; + ZERO_INITIALIZE(VertexDescriptionInputs, output); + + output.ObjectSpaceNormal = input.normalOS; + output.ObjectSpaceTangent = input.tangentOS.xyz; + output.ObjectSpacePosition = input.positionOS; + + return output; + } + SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) + { + SurfaceDescriptionInputs output; + ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + + #ifdef HAVE_VFX_MODIFICATION + // FragInputs from VFX come from two places: Interpolator or CBuffer. + /* WARNING: $splice Could not find named fragment 'VFXSetFragInputs' */ + + #endif + + + + + + + + output.uv0 = input.texCoord0; + output.uv1 = input.texCoord1; + output.uv2 = input.texCoord2; + output.uv3 = input.texCoord3; + output.VertexColor = input.color; + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); + #else + #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #endif + BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + #undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + + return output; + } + + // -------------------------------------------------- + // Main + + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/PBR2DPass.hlsl" + + // -------------------------------------------------- + // Visual Effect Vertex Invocations + #ifdef HAVE_VFX_MODIFICATION + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl" + #endif + + ENDHLSL + } + } + CustomEditorForRenderPipeline "UnityEditor.ShaderGraphLitGUI" "UnityEngine.Rendering.Universal.UniversalRenderPipelineAsset" + CustomEditor "UnityEditor.ShaderGraph.GenericShaderGraphMaterialGUI" + FallBack "Hidden/Shader Graph/FallbackError" +} \ No newline at end of file diff --git a/Assets/SLZShaders/TMP_SDF-URP Lit Baked.shader.meta b/Assets/SLZShaders/TMP_SDF-URP Lit Baked.shader.meta new file mode 100644 index 0000000..a88072c --- /dev/null +++ b/Assets/SLZShaders/TMP_SDF-URP Lit Baked.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 93a4eb99edd7b9c42bfb913f0ee52b3e +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Textures.meta b/Assets/SLZShaders/Textures.meta new file mode 100644 index 0000000..1ebcb0e --- /dev/null +++ b/Assets/SLZShaders/Textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ca296f3d7b22feb4e81db6271c2350cf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Textures/BloodyHitRamp.png b/Assets/SLZShaders/Textures/BloodyHitRamp.png new file mode 100644 index 0000000000000000000000000000000000000000..50ccc9a8a5f8512c7d12cbbeac2bf95e0f147a21 GIT binary patch literal 47324 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 B7^wgN literal 0 HcmV?d00001 diff --git a/Assets/SLZShaders/Textures/BloodyHitRamp.png.meta b/Assets/SLZShaders/Textures/BloodyHitRamp.png.meta new file mode 100644 index 0000000..b614166 --- /dev/null +++ b/Assets/SLZShaders/Textures/BloodyHitRamp.png.meta @@ -0,0 +1,138 @@ +fileFormatVersion: 2 +guid: c96b15076e0088349a95505e52f5a12a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 2 + mipBias: 0 + wrapU: 1 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 51 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: "\r\n\r\n + false\r\n true\r\n + GenRoughness\r\n 1\r\n + false\r\n" + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Textures/Pixels_crt-01.png b/Assets/SLZShaders/Textures/Pixels_crt-01.png new file mode 100644 index 0000000000000000000000000000000000000000..12c9532205381e92afdc2c1bdbf4c44270eb8671 GIT binary patch literal 35801 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\r\n\r\n + false\r\n true\r\n + GenRoughness\r\n 1\r\n + false\r\n" + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Textures/ToonRamp_SSS_strokes_Cleaned.psd b/Assets/SLZShaders/Textures/ToonRamp_SSS_strokes_Cleaned.psd new file mode 100644 index 0000000000000000000000000000000000000000..401e644ff6019cd53cb010c689fdc902929799f1 GIT binary patch literal 1372860 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%0Dg=*l=5BD8^DipbvX<*1^v|H!mcj5 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 L4> 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�uIBYI7SNConRnYyuC-b; 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%0D}lS_=jgq=a^ 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≫C_ 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 z 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

@=-AJKxP@SHYF*_XX^hq0jEdYuG((qtFEG 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

+0KPAmK}1LpB#rF@+o>KXY` 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 literal 0 HcmV?d00001 diff --git a/Assets/SLZShaders/Textures/ToonRamp_SSS_strokes_Cleaned.psd.meta b/Assets/SLZShaders/Textures/ToonRamp_SSS_strokes_Cleaned.psd.meta new file mode 100644 index 0000000..e6d7046 --- /dev/null +++ b/Assets/SLZShaders/Textures/ToonRamp_SSS_strokes_Cleaned.psd.meta @@ -0,0 +1,138 @@ +fileFormatVersion: 2 +guid: 6dc78741d54741a4c90a0fb74bd75f20 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 1 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 1 + userData: "\r\n\r\n + false\r\n true\r\n + GenRoughness\r\n 1\r\n + false\r\n" + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/Textures/metalHitRamp.png b/Assets/SLZShaders/Textures/metalHitRamp.png new file mode 100644 index 0000000000000000000000000000000000000000..eda107ef99f40e0d5fa8cf1abc2db3fa8c86b2c5 GIT binary patch literal 137897 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

Av@#`Ru)_R@JY5^{e4IT^`cruopBIrMt{BYZ&D> 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 Dh%Ej3 literal 0 HcmV?d00001 diff --git a/Assets/SLZShaders/Textures/metalHitRamp.png.meta b/Assets/SLZShaders/Textures/metalHitRamp.png.meta new file mode 100644 index 0000000..69c900b --- /dev/null +++ b/Assets/SLZShaders/Textures/metalHitRamp.png.meta @@ -0,0 +1,126 @@ +fileFormatVersion: 2 +guid: 93c33570d60341c439e50150832c5173 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 51 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: "\r\n\r\n + false\r\n true\r\n + GenRoughness\r\n 1\r\n + false\r\n" + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/VR_MotionVectorLit.shader b/Assets/SLZShaders/VR_MotionVectorLit.shader new file mode 100644 index 0000000..86bf5a7 --- /dev/null +++ b/Assets/SLZShaders/VR_MotionVectorLit.shader @@ -0,0 +1,3465 @@ +// Made with Amplify Shader Editor +// Available at the Unity Asset Store - http://u3d.as/y3X +Shader "SLZ/Motion Vector Lit" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1) + [ASEBegin][NoScaleOffset]_MainTex("Base Map", 2D) = "white" {} + [NoScaleOffset][Normal]_BumpMap("Bump Map", 2D) = "bump" {} + [NoScaleOffset]_MetallicGlossMap("MAS", 2D) = "white" {} + [NoScaleOffset]_MotionVectors("Motion Vectors", 2D) = "white" {} + _UVMotionMultiplier("UV Motion Multiplier", Float) = 0 + [HDR]_Color("Color", Color) = (1,1,1,1) + _Rows("Rows", Int) = 4 + _Columns("Columns", Int) = 8 + [ASEEnd]_Framerate("Framerate", Float) = 30 + + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + //_TransmissionShadow( "Transmission Shadow", Range( 0, 1 ) ) = 0.5 + //_TransStrength( "Trans Strength", Range( 0, 50 ) ) = 1 + //_TransNormal( "Trans Normal Distortion", Range( 0, 1 ) ) = 0.5 + //_TransScattering( "Trans Scattering", Range( 1, 50 ) ) = 2 + //_TransDirect( "Trans Direct", Range( 0, 1 ) ) = 0.9 + //_TransAmbient( "Trans Ambient", Range( 0, 1 ) ) = 0.1 + //_TransShadow( "Trans Shadow", Range( 0, 1 ) ) = 0.5 + //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5 + //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16 + //_TessMin( "Tess Min Distance", Float ) = 10 + //_TessMax( "Tess Max Distance", Float ) = 25 + //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16 + //_TessMaxDisp( "Tess Max Displacement", Float ) = 25 + } + + SubShader + { + LOD 0 + + + + + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Opaque" "Queue"="Geometry" } + Cull Back + ZWrite On + ZTest LEqual + Offset 0 , 0 + AlphaToMask Off + + HLSLINCLUDE + #pragma target 3.0 + + #pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + + #ifndef ASE_TESS_FUNCS + #define ASE_TESS_FUNCS + float4 FixedTess( float tessValue ) + { + return tessValue; + } + + float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos ) + { + float3 wpos = mul(o2w,vertex).xyz; + float dist = distance (wpos, cameraPos); + float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess; + return f; + } + + float4 CalcTriEdgeTessFactors (float3 triVertexFactors) + { + float4 tess; + tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z); + tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z); + tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y); + tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f; + return tess; + } + + float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams ) + { + float dist = distance (0.5 * (wpos0+wpos1), cameraPos); + float len = distance(wpos0, wpos1); + float f = max(len * scParams.y / (edgeLen * dist), 1.0); + return f; + } + + float DistanceFromPlane (float3 pos, float4 plane) + { + float d = dot (float4(pos,1.0f), plane); + return d; + } + + bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] ) + { + float4 planeTest; + planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f ); + return !all (planeTest); + } + + float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos ) + { + float3 f; + f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos); + f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos); + f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos); + + return CalcTriEdgeTessFactors (f); + } + + float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + return tess; + } + + float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + + if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes)) + { + tess = 0.0f; + } + else + { + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + } + return tess; + } + #endif //ASE_TESS_FUNCS + + ENDHLSL + + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForward" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_FORWARD + + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DefaultLitVariants.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + float4 ase_color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_color : COLOR; + float4 ase_texcoord8 : TEXCOORD8; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_MainTex); + TEXTURE2D(_MotionVectors); + SAMPLER(sampler_MotionVectors); + SAMPLER(sampler_MainTex); + TEXTURE2D(_BumpMap); + SAMPLER(sampler_BumpMap); + TEXTURE2D(_MetallicGlossMap); + SAMPLER(sampler_MetallicGlossMap); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_color = v.ase_color; + o.ase_texcoord8.xy = v.texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + #if defined(LIGHTMAP_ON) + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + #if !defined(LIGHTMAP_ON) + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + #endif + + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) || defined(ASE_TERRAIN_INSTANCING) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + float4 ase_color : COLOR; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + o.ase_color = v.ase_color; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + o.ase_color = patch[0].ase_color * bary.x + patch[1].ase_color * bary.y + patch[2].ase_color * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float2 texCoord87 = IN.ase_texcoord8.xy * float2( 1,1 ) + float2( 0,0 ); + float2 appendResult109 = (float2((float)_Columns , (float)_Rows)); + float2 temp_output_110_0 = ( texCoord87 / appendResult109 ); + float mulTime126 = _TimeParameters.x * _Framerate; + float temp_output_97_0 = ( floor( mulTime126 ) / _Columns ); + float2 appendResult112 = (float2(frac( temp_output_97_0 ) , ( ( 1.0 - frac( ( floor( temp_output_97_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float2 temp_output_116_0 = ( temp_output_110_0 + appendResult112 ); + float2 temp_cast_3 = (0.5).xx; + float2 temp_output_21_0 = ( temp_output_116_0 + ( ( (SAMPLE_TEXTURE2D( _MotionVectors, sampler_MotionVectors, temp_output_116_0 )).rg - temp_cast_3 ) * frac( mulTime126 ) * -_UVMotionMultiplier ) ); + float temp_output_135_0 = ( ceil( mulTime126 ) / _Columns ); + float2 appendResult138 = (float2(frac( temp_output_135_0 ) , ( ( 1.0 - frac( ( floor( temp_output_135_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float2 temp_output_141_0 = ( temp_output_110_0 + appendResult138 ); + float2 temp_cast_5 = (0.5).xx; + float2 temp_output_22_0 = ( temp_output_141_0 + ( ( (SAMPLE_TEXTURE2D( _MotionVectors, sampler_MotionVectors, temp_output_141_0 )).rg - temp_cast_5 ) * ( 1.0 - frac( mulTime126 ) ) * -1.0 * -_UVMotionMultiplier ) ); + float4 lerpResult4 = lerp( SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, temp_output_21_0 ) , SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, temp_output_22_0 ) , frac( mulTime126 )); + + float2 temp_cast_7 = (0.5).xx; + float3 unpack177 = UnpackNormalScale( SAMPLE_TEXTURE2D( _BumpMap, sampler_BumpMap, temp_output_21_0 ), ( 1.0 - frac( mulTime126 ) ) ); + unpack177.z = lerp( 1, unpack177.z, saturate(( 1.0 - frac( mulTime126 ) )) ); + float2 temp_cast_8 = (0.5).xx; + float3 unpack179 = UnpackNormalScale( SAMPLE_TEXTURE2D( _BumpMap, sampler_BumpMap, temp_output_22_0 ), frac( mulTime126 ) ); + unpack179.z = lerp( 1, unpack179.z, saturate(frac( mulTime126 )) ); + + float2 temp_cast_9 = (0.5).xx; + float2 temp_cast_10 = (0.5).xx; + float4 lerpResult181 = lerp( SAMPLE_TEXTURE2D( _MetallicGlossMap, sampler_MetallicGlossMap, temp_output_21_0 ) , SAMPLE_TEXTURE2D( _MetallicGlossMap, sampler_MetallicGlossMap, temp_output_22_0 ) , frac( mulTime126 )); + float4 break189 = lerpResult181; + + float3 Albedo = ( IN.ase_color * _Color * lerpResult4 ).rgb; + float3 Normal = BlendNormal( unpack177 , unpack179 ); + float3 Emission = 0; +#if 0 + float3 BakedEmission = 0; +#endif + float3 Specular = 0.5; + float Metallic = break189.r; + float Smoothness = break189.b; + float Occlusion = break189.g; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _CLEARCOAT + float CoatMask = 0; + float CoatSmoothness = 0; + #endif + + #if defined(_FLUORESCENCE) + float4 Fluorescence = 0; + float4 Absorbance = 0; + #endif + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.viewDirectionWS = WorldViewDirection; + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + #else + inputData.normalWS = WorldNormal; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + inputData.shadowCoord = ShadowCoords; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + inputData.shadowCoord = TransformWorldToShadowCoord(inputData.positionWS); + #else + inputData.shadowCoord = float4(0, 0, 0, 0); + #endif + + + #ifdef ASE_FOG + inputData.fogCoord = IN.fogFactorAndVertexLight.x; + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzww; //TODO: Shuffle things in vertex streams so we get full RGBA color rather than RGBB here + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xyz, IN.dynamicLightmapUV.xy, IN.vertexSH, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI(IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, IN.vertexSH , inputData.normalWS); + #endif + + #else + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + #endif + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + SurfaceData surfaceData; + surfaceData.albedo = Albedo; + surfaceData.metallic = saturate(Metallic); + surfaceData.specular = Specular; + surfaceData.smoothness = saturate(Smoothness), + surfaceData.occlusion = Occlusion, + surfaceData.emission = Emission, + surfaceData.alpha = saturate(Alpha); + surfaceData.normalTS = Normal; + surfaceData.clearCoatMask = 0; + surfaceData.clearCoatSmoothness = 1; + + #ifdef _CLEARCOAT + surfaceData.clearCoatMask = saturate(CoatMask); + surfaceData.clearCoatSmoothness = saturate(CoatSmoothness); + #endif + #if defined(_FLUORESCENCE) + surfaceData.fluorescence = Fluorescence; + surfaceData.absorbance = Absorbance; + #endif + + #ifdef _DBUFFER + ApplyDecalToSurfaceData(IN.clipPos, surfaceData, inputData); + #endif + + half4 color = UniversalFragmentPBR( inputData, surfaceData); + + #ifdef LIGHTMAP_ON + float3 MetalSpec = lerp(kDieletricSpec.rgb, surfaceData.albedo , surfaceData.metallic); + color.rgb += BakedSpecular * surfaceData.occlusion * MetalSpec * inputData.bakedGI.rgb; + #endif + + #ifdef _TRANSMISSION_ASE + { + float shadow = _TransmissionShadow; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + half3 mainTransmission = max(0 , -dot(inputData.normalWS, mainLight.direction)) * mainAtten * Transmission; + color.rgb += Albedo * mainTransmission; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 transmission = max(0 , -dot(inputData.normalWS, light.direction)) * atten * Transmission; + color.rgb += Albedo * transmission; + } + #endif + } + #endif + + #ifdef _TRANSLUCENCY_ASE + { + float shadow = _TransShadow; + float normal = _TransNormal; + float scattering = _TransScattering; + float direct = _TransDirect; + float ambient = _TransAmbient; + float strength = _TransStrength; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + + half3 mainLightDir = mainLight.direction + inputData.normalWS * normal; + half mainVdotL = pow( saturate( dot( inputData.viewDirectionWS, -mainLightDir ) ), scattering ); + half3 mainTranslucency = mainAtten * ( mainVdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * mainTranslucency * strength; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 lightDir = light.direction + inputData.normalWS * normal; + half VdotL = pow( saturate( dot( inputData.viewDirectionWS, -lightDir ) ), scattering ); + half3 translucency = atten * ( VdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * translucency * strength; + } + #endif + } + #endif + + #ifdef _REFRACTION_ASE + float4 projScreenPos = ScreenPos / ScreenPos.w; + float3 refractionOffset = ( RefractionIndex - 1.0 ) * mul( UNITY_MATRIX_V, float4( WorldNormal,0 ) ).xyz * ( 1.0 - dot( WorldNormal, WorldViewDirection ) ); + projScreenPos.xy += refractionOffset.xy; + float3 refraction = SHADERGRAPH_SAMPLE_SCENE_COLOR( projScreenPos.xy ) * RefractionColor; + color.rgb = lerp( refraction, color.rgb, color.a ); + color.a = 1; + #endif + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, -inputData.viewDirectionWS, IN.fogFactorAndVertexLight.x); + #endif + #endif + + color = Volumetrics( color, inputData.positionWS); + + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return color; + } + + ENDHLSL + } + + + Pass + { + + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + + ZWrite On + ZTest LEqual + AlphaToMask Off + ColorMask 0 + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #pragma multi_compile _ _CASTING_PUNCTUAL_LIGHT_SHADOW + + #define SHADERPASS SHADERPASS_SHADOWCASTER + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + float3 _LightDirection; + float3 _LightPosition; + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + + float3 normalWS = TransformObjectToWorldDir(v.ase_normal); + + + #if _CASTING_PUNCTUAL_LIGHT_SHADOW + float3 lightDirectionWS = normalize(_LightPosition - positionWS); + #else + float3 lightDirectionWS = _LightDirection; + #endif + float2 vShadowOffsets = GetShadowOffsets( normalWS, lightDirectionWS ); + positionWS.xyz -= vShadowOffsets.y * lightDirectionWS.xyz * .01; + float4 clipPos = TransformObjectToHClip( float4( mul( unity_WorldToObject, float4( positionWS.xyz, 1.0 ) ).xyz, 1.0 ) ); + //float4 clipPos = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, lightDirectionWS)); + + #if UNITY_REVERSED_Z + clipPos.z = min(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #else + clipPos.z = max(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #endif + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = clipPos; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + #ifdef _ALPHATEST_SHADOW_ON + clip(Alpha - AlphaClipThresholdShadow); + #else + clip(Alpha - AlphaClipThreshold); + #endif + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + return 0; + } + + ENDHLSL + } + + + Pass + { + + Name "DepthOnly" + Tags { "LightMode"="DepthOnly" } + + ZWrite On + ColorMask 0 + AlphaToMask Off + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return 0; + } + ENDHLSL + } + + + Pass + { + + Name "Meta" + Tags { "LightMode"="Meta" } + + Cull Off + + HLSLPROGRAM + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" + #pragma vertex vert + #pragma fragment frag + + #pragma shader_feature _ EDITOR_VISUALIZATION + + #define SHADERPASS SHADERPASS_META + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/MetaInput.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + float4 ase_color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + #ifdef EDITOR_VISUALIZATION + float4 VizUV : TEXCOORD2; + float4 LightCoord : TEXCOORD3; + #endif + float4 ase_color : COLOR; + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_MainTex); + TEXTURE2D(_MotionVectors); + SAMPLER(sampler_MotionVectors); + SAMPLER(sampler_MainTex); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_color = v.ase_color; + o.ase_texcoord4.xy = v.texcoord0.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.clipPos = MetaVertexPosition( v.vertex, v.texcoord1.xy, v.texcoord1.xy, unity_LightmapST, unity_DynamicLightmapST ); + + #ifdef EDITOR_VISUALIZATION + float2 VizUV = 0; + float4 LightCoord = 0; + UnityEditorVizData(v.vertex.xyz, v.texcoord0.xy, v.texcoord1.xy, v.texcoord2.xy, VizUV, LightCoord); + o.VizUV = float4(VizUV, 0, 0); + o.LightCoord = LightCoord; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = o.clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + float4 ase_color : COLOR; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.texcoord0 = v.texcoord0; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + o.ase_color = v.ase_color; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.texcoord0 = patch[0].texcoord0 * bary.x + patch[1].texcoord0 * bary.y + patch[2].texcoord0 * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + o.ase_color = patch[0].ase_color * bary.x + patch[1].ase_color * bary.y + patch[2].ase_color * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 texCoord87 = IN.ase_texcoord4.xy * float2( 1,1 ) + float2( 0,0 ); + float2 appendResult109 = (float2((float)_Columns , (float)_Rows)); + float2 temp_output_110_0 = ( texCoord87 / appendResult109 ); + float mulTime126 = _TimeParameters.x * _Framerate; + float temp_output_97_0 = ( floor( mulTime126 ) / _Columns ); + float2 appendResult112 = (float2(frac( temp_output_97_0 ) , ( ( 1.0 - frac( ( floor( temp_output_97_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float2 temp_output_116_0 = ( temp_output_110_0 + appendResult112 ); + float2 temp_cast_3 = (0.5).xx; + float2 temp_output_21_0 = ( temp_output_116_0 + ( ( (SAMPLE_TEXTURE2D( _MotionVectors, sampler_MotionVectors, temp_output_116_0 )).rg - temp_cast_3 ) * frac( mulTime126 ) * -_UVMotionMultiplier ) ); + float temp_output_135_0 = ( ceil( mulTime126 ) / _Columns ); + float2 appendResult138 = (float2(frac( temp_output_135_0 ) , ( ( 1.0 - frac( ( floor( temp_output_135_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float2 temp_output_141_0 = ( temp_output_110_0 + appendResult138 ); + float2 temp_cast_5 = (0.5).xx; + float2 temp_output_22_0 = ( temp_output_141_0 + ( ( (SAMPLE_TEXTURE2D( _MotionVectors, sampler_MotionVectors, temp_output_141_0 )).rg - temp_cast_5 ) * ( 1.0 - frac( mulTime126 ) ) * -1.0 * -_UVMotionMultiplier ) ); + float4 lerpResult4 = lerp( SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, temp_output_21_0 ) , SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, temp_output_22_0 ) , frac( mulTime126 )); + + + float3 Albedo = ( IN.ase_color * _Color * lerpResult4 ).rgb; + float3 Emission = 0; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + MetaInput metaInput = (MetaInput)0; + metaInput.Albedo = Albedo; + metaInput.Emission = Emission; + #ifdef EDITOR_VISUALIZATION + metaInput.VizUV = IN.VizUV.xy; + metaInput.LightCoord = IN.LightCoord; + #endif + + return MetaFragment(metaInput); + } + ENDHLSL + } + + /*ase_pass*/ + Pass + { + + Name "BakedRaytrace" + Tags{ "LightMode" = "BakedRaytrace" } + HLSLPROGRAM + + /*ase_pragma_before*/ + + #define SHADERPASS SHADERPASS_RAYTRACE + + #include "UnityRaytracingMeshUtils.cginc" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #define _EMISSION + #pragma raytracing test + #pragma shader_feature_local __ _ALBEDOMULTIPLY_ON + #pragma shader_feature_local __ _EMISSION_ON + + /*ase_pragma*/ + + struct RayPayload + { + float4 color; + float3 dir; + }; + + struct AttributeData + { + float2 barycentrics; + }; + + struct Vertex + { + float2 texcoord; + float3 normal; + }; + + Texture2D _BaseMap; + SamplerState sampler_BaseMap; + + CBUFFER_START( UnityPerMaterial ) + /*ase_srp_batcher*/ + Texture2D _EmissionMap; + SamplerState sampler_EmissionMap; + + float4 _EmissionColor; + float4 _BaseMap_ST; + float _BakedMutiplier = 1; + CBUFFER_END + + /*ase_globals*/ + + /*ase_funcs*/ + + //https://coty.tips/raytracing-in-unity/ + [shader("closesthit")] + void MyClosestHit(inout RayPayload payload, + AttributeData attributes : SV_IntersectionAttributes) { + + payload.color = float4(0,0,0,1); //Intializing + payload.dir = float3(1,0,0); + + // #if _EMISSION_ON + uint2 launchIdx = DispatchRaysIndex(); + // ShadingData shade = getShadingData( PrimitiveIndex(), attribs ); + + uint primitiveIndex = PrimitiveIndex(); + uint3 triangleIndicies = UnityRayTracingFetchTriangleIndices(primitiveIndex); + Vertex v0, v1, v2; + + v0.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.x, kVertexAttributeTexCoord0); + v1.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.y, kVertexAttributeTexCoord0); + v2.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.z, kVertexAttributeTexCoord0); + + // v0.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.x, kVertexAttributeNormal); + // v1.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.y, kVertexAttributeNormal); + // v2.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.z, kVertexAttributeNormal); + + float3 barycentrics = float3(1.0 - attributes.barycentrics.x - attributes.barycentrics.y, attributes.barycentrics.x, attributes.barycentrics.y); + + Vertex vInterpolated; + vInterpolated.texcoord = v0.texcoord * barycentrics.x + v1.texcoord * barycentrics.y + v2.texcoord * barycentrics.z; + //TODO: Extract normal direction to ignore the backside of emissive objects + //vInterpolated.normal = v0.normal * barycentrics.x + v1.normal * barycentrics.y + v2.normal * barycentrics.z; + // if ( dot(vInterpolated.normal, float3(1,0,0) < 0) ) payload.color = float4(0,10,0,1) ; + // else payload.color = float4(10,0,0,1) ; + + //TODO: Figure out how to tie Amplify into using Texture2d and SamplerState instead of the bundled sampler2D. Forcing names for now. + //#if _ALBEDOMULTIPLY_ON + float4 albedo = float4(_BaseMap.SampleLevel(sampler_BaseMap, vInterpolated.texcoord.xy * _BaseMap_ST.xy + _BaseMap_ST.zw, 0 ).rgb , 1) ; + // #else + // float4 albedo = float4(1,1,1,1); + // #endif + + payload.color = float4( (_EmissionMap.SampleLevel(sampler_EmissionMap, vInterpolated.texcoord * _BaseMap_ST.xy + _BaseMap_ST.zw,0) ).rgb * _EmissionColor.rgb * albedo.rgb * _BakedMutiplier , 1 ); + // #else + // payload.color = float4(0,0,0,1); + + // #endif + } + ENDHLSL + + } + + + Pass + { + + Name "Universal2D" + Tags { "LightMode"="Universal2D" } + + Blend One Zero, One Zero + ColorMask RGBA + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_2D + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_color : COLOR; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float4 ase_color : COLOR; + float4 ase_texcoord2 : TEXCOORD2; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_MainTex); + TEXTURE2D(_MotionVectors); + SAMPLER(sampler_MotionVectors); + SAMPLER(sampler_MainTex); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID( v ); + UNITY_TRANSFER_INSTANCE_ID( v, o ); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + o.ase_color = v.ase_color; + o.ase_texcoord2.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord2.zw = 0; + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_color : COLOR; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_color = v.ase_color; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_color = patch[0].ase_color * bary.x + patch[1].ase_color * bary.y + patch[2].ase_color * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 texCoord87 = IN.ase_texcoord2.xy * float2( 1,1 ) + float2( 0,0 ); + float2 appendResult109 = (float2((float)_Columns , (float)_Rows)); + float2 temp_output_110_0 = ( texCoord87 / appendResult109 ); + float mulTime126 = _TimeParameters.x * _Framerate; + float temp_output_97_0 = ( floor( mulTime126 ) / _Columns ); + float2 appendResult112 = (float2(frac( temp_output_97_0 ) , ( ( 1.0 - frac( ( floor( temp_output_97_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float2 temp_output_116_0 = ( temp_output_110_0 + appendResult112 ); + float2 temp_cast_3 = (0.5).xx; + float2 temp_output_21_0 = ( temp_output_116_0 + ( ( (SAMPLE_TEXTURE2D( _MotionVectors, sampler_MotionVectors, temp_output_116_0 )).rg - temp_cast_3 ) * frac( mulTime126 ) * -_UVMotionMultiplier ) ); + float temp_output_135_0 = ( ceil( mulTime126 ) / _Columns ); + float2 appendResult138 = (float2(frac( temp_output_135_0 ) , ( ( 1.0 - frac( ( floor( temp_output_135_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float2 temp_output_141_0 = ( temp_output_110_0 + appendResult138 ); + float2 temp_cast_5 = (0.5).xx; + float2 temp_output_22_0 = ( temp_output_141_0 + ( ( (SAMPLE_TEXTURE2D( _MotionVectors, sampler_MotionVectors, temp_output_141_0 )).rg - temp_cast_5 ) * ( 1.0 - frac( mulTime126 ) ) * -1.0 * -_UVMotionMultiplier ) ); + float4 lerpResult4 = lerp( SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, temp_output_21_0 ) , SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, temp_output_22_0 ) , frac( mulTime126 )); + + + float3 Albedo = ( IN.ase_color * _Color * lerpResult4 ).rgb; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + half4 color = half4( Albedo, Alpha ); + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + return color; + } + ENDHLSL + } + + + Pass + { + + Name "DepthNormals" + Tags { "LightMode"="DepthNormals" } + + ZWrite On + Blend One Zero + ZTest LEqual + ZWrite On + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float3 worldNormal : TEXCOORD2; + float4 worldTangent : TEXCOORD3; + float4 ase_texcoord4 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_BumpMap); + TEXTURE2D(_MotionVectors); + SAMPLER(sampler_MotionVectors); + SAMPLER(sampler_BumpMap); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_texcoord4.xy = v.ase_texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord4.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal( v.ase_normal ); + float4 tangentWS = float4(TransformObjectToWorldDir( v.ase_tangent.xyz), v.ase_tangent.w); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.worldNormal = normalWS; + o.worldTangent = tangentWS; + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 ase_texcoord : TEXCOORD0; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.ase_texcoord = v.ase_texcoord; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + float3 WorldNormal = IN.worldNormal; + float4 WorldTangent = IN.worldTangent; + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 texCoord87 = IN.ase_texcoord4.xy * float2( 1,1 ) + float2( 0,0 ); + float2 appendResult109 = (float2((float)_Columns , (float)_Rows)); + float2 temp_output_110_0 = ( texCoord87 / appendResult109 ); + float mulTime126 = _TimeParameters.x * _Framerate; + float temp_output_97_0 = ( floor( mulTime126 ) / _Columns ); + float2 appendResult112 = (float2(frac( temp_output_97_0 ) , ( ( 1.0 - frac( ( floor( temp_output_97_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float2 temp_output_116_0 = ( temp_output_110_0 + appendResult112 ); + float2 temp_cast_3 = (0.5).xx; + float2 temp_output_21_0 = ( temp_output_116_0 + ( ( (SAMPLE_TEXTURE2D( _MotionVectors, sampler_MotionVectors, temp_output_116_0 )).rg - temp_cast_3 ) * frac( mulTime126 ) * -_UVMotionMultiplier ) ); + float3 unpack177 = UnpackNormalScale( SAMPLE_TEXTURE2D( _BumpMap, sampler_BumpMap, temp_output_21_0 ), ( 1.0 - frac( mulTime126 ) ) ); + unpack177.z = lerp( 1, unpack177.z, saturate(( 1.0 - frac( mulTime126 ) )) ); + float temp_output_135_0 = ( ceil( mulTime126 ) / _Columns ); + float2 appendResult138 = (float2(frac( temp_output_135_0 ) , ( ( 1.0 - frac( ( floor( temp_output_135_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float2 temp_output_141_0 = ( temp_output_110_0 + appendResult138 ); + float2 temp_cast_5 = (0.5).xx; + float2 temp_output_22_0 = ( temp_output_141_0 + ( ( (SAMPLE_TEXTURE2D( _MotionVectors, sampler_MotionVectors, temp_output_141_0 )).rg - temp_cast_5 ) * ( 1.0 - frac( mulTime126 ) ) * -1.0 * -_UVMotionMultiplier ) ); + float3 unpack179 = UnpackNormalScale( SAMPLE_TEXTURE2D( _BumpMap, sampler_BumpMap, temp_output_22_0 ), frac( mulTime126 ) ); + unpack179.z = lerp( 1, unpack179.z, saturate(frac( mulTime126 )) ); + + float3 Normal = BlendNormal( unpack177 , unpack179 ); + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + #if defined(_GBUFFER_NORMALS_OCT) + float2 octNormalWS = PackNormalOctQuadEncode(WorldNormal); + float2 remappedOctNormalWS = saturate(octNormalWS * 0.5 + 0.5); + half3 packedNormalWS = PackFloat2To888(remappedOctNormalWS); + return half4(packedNormalWS, 0.0); + #else + + #if defined(_NORMALMAP) + #if _NORMAL_DROPOFF_TS + float crossSign = (WorldTangent.w > 0.0 ? 1.0 : -1.0) * GetOddNegativeScale(); + float3 bitangent = crossSign * cross(WorldNormal.xyz, WorldTangent.xyz); + float3 normalWS = TransformTangentToWorld(Normal, half3x3(WorldTangent.xyz, bitangent, WorldNormal.xyz)); + #elif _NORMAL_DROPOFF_OS + float3 normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + float3 normalWS = Normal; + #endif + #else + float3 normalWS = WorldNormal; + #endif + + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + #endif + } + ENDHLSL + } + + + Pass + { + + Name "GBuffer" + Tags { "LightMode"="UniversalGBuffer" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM +#define _NORMAL_DROPOFF_TS 1#pragma multi_compile_fog#define ASE_FOG 1#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED#define _NORMALMAP 1#define ASE_SRP_VERSION 999999#define ASE_USING_SAMPLING_MACROS 1 +#if FALSE + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile _ DYNAMICLIGHTMAP_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE + //_MAIN_LIGHT_SHADOWS_SCREEN + + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION + + #pragma multi_compile_fragment _ _SHADOWS_SOFT + #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING + #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE + //#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile _ _GBUFFER_NORMALS_OCT + //#pragma multi_compile_fragment _ _LIGHT_LAYERS + #pragma multi_compile _ _RENDER_PASS_ENABLED + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_GBUFFER + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl" + + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + float4 ase_color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_color : COLOR; + float4 ase_texcoord8 : TEXCOORD8; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + TEXTURE2D(_MainTex); + TEXTURE2D(_MotionVectors); + SAMPLER(sampler_MotionVectors); + SAMPLER(sampler_MainTex); + TEXTURE2D(_BumpMap); + SAMPLER(sampler_BumpMap); + TEXTURE2D(_MetallicGlossMap); + SAMPLER(sampler_MetallicGlossMap); + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_color = v.ase_color; + o.ase_texcoord8.xy = v.texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + float4 ase_color : COLOR; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + o.ase_color = v.ase_color; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + o.ase_color = patch[0].ase_color * bary.x + patch[1].ase_color * bary.y + patch[2].ase_color * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + FragmentOutput frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #else + ShadowCoords = float4(0, 0, 0, 0); + #endif + + + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float2 texCoord87 = IN.ase_texcoord8.xy * float2( 1,1 ) + float2( 0,0 ); + float2 appendResult109 = (float2((float)_Columns , (float)_Rows)); + float2 temp_output_110_0 = ( texCoord87 / appendResult109 ); + float mulTime126 = _TimeParameters.x * _Framerate; + float temp_output_97_0 = ( floor( mulTime126 ) / _Columns ); + float2 appendResult112 = (float2(frac( temp_output_97_0 ) , ( ( 1.0 - frac( ( floor( temp_output_97_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float2 temp_output_116_0 = ( temp_output_110_0 + appendResult112 ); + float2 temp_cast_3 = (0.5).xx; + float2 temp_output_21_0 = ( temp_output_116_0 + ( ( (SAMPLE_TEXTURE2D( _MotionVectors, sampler_MotionVectors, temp_output_116_0 )).rg - temp_cast_3 ) * frac( mulTime126 ) * -_UVMotionMultiplier ) ); + float temp_output_135_0 = ( ceil( mulTime126 ) / _Columns ); + float2 appendResult138 = (float2(frac( temp_output_135_0 ) , ( ( 1.0 - frac( ( floor( temp_output_135_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float2 temp_output_141_0 = ( temp_output_110_0 + appendResult138 ); + float2 temp_cast_5 = (0.5).xx; + float2 temp_output_22_0 = ( temp_output_141_0 + ( ( (SAMPLE_TEXTURE2D( _MotionVectors, sampler_MotionVectors, temp_output_141_0 )).rg - temp_cast_5 ) * ( 1.0 - frac( mulTime126 ) ) * -1.0 * -_UVMotionMultiplier ) ); + float4 lerpResult4 = lerp( SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, temp_output_21_0 ) , SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, temp_output_22_0 ) , frac( mulTime126 )); + + float2 temp_cast_7 = (0.5).xx; + float3 unpack177 = UnpackNormalScale( SAMPLE_TEXTURE2D( _BumpMap, sampler_BumpMap, temp_output_21_0 ), ( 1.0 - frac( mulTime126 ) ) ); + unpack177.z = lerp( 1, unpack177.z, saturate(( 1.0 - frac( mulTime126 ) )) ); + float2 temp_cast_8 = (0.5).xx; + float3 unpack179 = UnpackNormalScale( SAMPLE_TEXTURE2D( _BumpMap, sampler_BumpMap, temp_output_22_0 ), frac( mulTime126 ) ); + unpack179.z = lerp( 1, unpack179.z, saturate(frac( mulTime126 )) ); + + float2 temp_cast_9 = (0.5).xx; + float2 temp_cast_10 = (0.5).xx; + float4 lerpResult181 = lerp( SAMPLE_TEXTURE2D( _MetallicGlossMap, sampler_MetallicGlossMap, temp_output_21_0 ) , SAMPLE_TEXTURE2D( _MetallicGlossMap, sampler_MetallicGlossMap, temp_output_22_0 ) , frac( mulTime126 )); + float4 break189 = lerpResult181; + + float3 Albedo = ( IN.ase_color * _Color * lerpResult4 ).rgb; + float3 Normal = BlendNormal( unpack177 , unpack179 ); + float3 Emission = 0; + float3 Specular = 0.5; + float Metallic = break189.r; + float Smoothness = break189.b; + float Occlusion = break189.g; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.positionCS = IN.clipPos; + inputData.shadowCoord = ShadowCoords; + + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + #else + inputData.normalWS = WorldNormal; + #endif + + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + inputData.viewDirectionWS = SafeNormalize( WorldViewDirection ); + + + + #ifdef ASE_FOG + inputData.fogCoord = InitializeInputDataFog(float4(WorldPosition, 1.0), IN.fogFactorAndVertexLight.x); + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw; + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #else + #if defined(DYNAMICLIGHTMAP_ON) + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, SH, inputData.normalWS); + #else + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, SH, inputData.normalWS ); + #endif + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + #ifdef _DBUFFER + ApplyDecal(IN.clipPos, + Albedo, + Specular, + inputData.normalWS, + Metallic, + Occlusion, + Smoothness); + #endif + + BRDFData brdfData; + InitializeBRDFData + (Albedo, Metallic, Specular, Smoothness, Alpha, brdfData); + + Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, inputData.shadowMask); + half4 color; + MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, inputData.shadowMask); + color.rgb = GlobalIllumination(brdfData, inputData.bakedGI, Occlusion, inputData.positionWS, inputData.normalWS, inputData.viewDirectionWS); + color.a = Alpha; + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, IN.fogFactorAndVertexLight.x); + #endif + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return BRDFDataToGbuffer(brdfData, inputData, Smoothness, Emission + color.rgb); + } +#endif + ENDHLSL + } + + + + Pass + { + + Name "SceneSelectionPass" + Tags { "LightMode"="SceneSelectionPass" } + + Cull Off + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + int _ObjectId; + int _PassValue; + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = half4(_ObjectId, _PassValue, 1.0, 1.0); + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "ScenePickingPass" + Tags { "LightMode"="Picking" } + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _NORMALMAP 1 + #define ASE_SRP_VERSION 999999 + #define ASE_USING_SAMPLING_MACROS 1 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + + float4 _SelectionID; + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if defined(_ALPHATEST_ON) && !defined(ASE_TERRAIN) + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = 0; + outColor = _SelectionID; + + return outColor; + } + + ENDHLSL + } + + } + + CustomEditor "UnityEditor.ShaderGraphLitGUI" + Fallback "Hidden/InternalErrorShader" + +} +/*ASEBEGIN +Version=18935 +2190;459;1920;600;-115.3444;962.3633;2.195118;True;True +Node;AmplifyShaderEditor.CommentaryNode;129;-4667.317,-1560.812;Inherit;False;2483.175;1723.904;Comment;36;87;140;139;138;137;136;135;134;133;132;131;101;122;112;123;105;97;107;106;104;108;103;128;130;126;98;116;110;82;81;109;141;144;145;152;153;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;162;467.4616,991.5551;Inherit;False;1309.276;536.674;Baked;8;149;150;148;156;155;154;161;157;Baked;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;32;-2220.243,304.0236;Inherit;False;1565.432;670.7075;Motion Vector interpolation;16;14;19;16;27;15;29;20;24;18;26;23;25;22;21;185;186;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;84;-2057.125,-460.3955;Inherit;False;200;161;Comment;1;83;UV0;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;79;-2050.404,-55.23522;Inherit;False;200;161;Comment;1;78;frame lerp;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;31;-186.6399,-987.8739;Inherit;False;1091.596;477.5999;Main Texture frame blend;4;2;1;4;3;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;85;-2046.481,-258.3556;Inherit;False;200;161;UV1;1;80;UV1;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;180;-192.2284,52.43753;Inherit;False;1091.596;477.5999;Main Texture frame blend;4;184;183;182;181;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;175;-180.5987,-464.6546;Inherit;False;1091.596;477.5999;Main Texture frame blend;13;179;178;177;168;165;166;172;171;169;170;167;188;187;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;20;-1262.94,603.0074;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.FloorOpNode;103;-3904.926,-1337.767;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;153;-3870.503,-1108.609;Inherit;False;R;-1;True;1;0;INT;0;False;1;INT;0 +Node;AmplifyShaderEditor.IntNode;82;-4107.079,-1259.714;Inherit;False;Property;_Columns;Columns;10;0;Create;True;0;0;0;False;0;False;8;1;False;0;1;INT;0 +Node;AmplifyShaderEditor.SimpleTimeNode;126;-4481.882,-1436.698;Inherit;False;1;0;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TexCoordVertexDataNode;10;-2786.698,1948.91;Inherit;False;1;3;0;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.StaticSwitch;72;-1696.876,2002.386;Inherit;False;Property;_ScaleDepthDither;Scale Depth Dither;8;0;Create;True;0;0;0;False;0;False;0;0;0;True;;Toggle;2;Key0;Key1;Create;True;True;All;9;1;FLOAT;0;False;0;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;46;-1780.333,1850.196;Inherit;False;2;0;FLOAT4;0,0,0,0;False;1;FLOAT;0.5;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.BreakToComponentsNode;189;1686.322,-342.1209;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15 +Node;AmplifyShaderEditor.RangedFloatNode;48;-1967.657,1960.338;Inherit;False;Constant;_Float1;Float 1;2;0;Create;True;0;0;0;False;0;False;0.5;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;69;-1824.897,2102.173;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RelayNode;80;-1996.481,-208.3555;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.IntNode;81;-4098.651,-1157.766;Inherit;False;Property;_Rows;Rows;9;0;Create;True;0;0;0;False;0;False;4;1;False;0;1;INT;0 +Node;AmplifyShaderEditor.FractNode;191;-2244.639,-553.7288;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.RelayNode;128;-4229.118,-1366.943;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;116;-2560.913,-758.7842;Inherit;True;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;23;-1099.354,744.2953;Inherit;False;4;4;0;FLOAT2;0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.TemplateFragmentDataNode;51;-1403.448,2073.357;Inherit;False;0;0;clipPos;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.FunctionNode;68;-2079.864,1858.284;Inherit;False;Global Blue Noise Sample;-1;;60;bac712bbbce65c14c9d4cbc808f3d0e0;0;2;8;FLOAT2;0,0;False;10;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.IntNode;65;-2266.384,2016.9;Inherit;False;Global;NoiseArraySize;NoiseArraySize;2;0;Create;True;0;0;0;False;0;False;64;64;False;0;1;INT;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;152;-3868.503,-1183.609;Inherit;False;C;-1;True;1;0;INT;0;False;1;INT;0 +Node;AmplifyShaderEditor.OneMinusNode;26;-1167.432,543.6097;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FunctionNode;47;-1328.923,1845.467;Inherit;False;Depth Offseting;-1;;61;f08568184ae023c44bfc8baedfb827a9;0;2;1;FLOAT;0;False;10;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;104;-3448.457,-1166.648;Inherit;False;2;0;FLOAT;0;False;1;INT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;19;-1412.165,518.751;Float;False;Constant;_5;.5;3;0;Create;True;0;0;0;False;0;False;0.5;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.FractNode;190;-2244.639,-313.7288;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.FloorOpNode;101;-3563.798,-1270.216;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;132;-3747.082,-538.6045;Inherit;False;2;0;FLOAT;0;False;1;INT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FloorOpNode;140;-3862.423,-642.1724;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.OneMinusNode;131;-3514.413,-343.9341;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FractNode;133;-3692.356,-341.6533;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RelayNode;83;-2007.125,-410.3956;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;18;-1268.016,403.0251;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;52;-1573.019,1856.026;Inherit;False;2;2;0;FLOAT4;1,0,0,0;False;1;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.RangedFloatNode;24;-1272.342,776.7422;Float;False;Constant;_Float0;Float 0;3;0;Create;True;0;0;0;False;0;False;-1;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;21;-952.8717,354.0236;Inherit;True;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.FractNode;105;-3305.3,-1122.35;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;123;-3504.258,-888.2106;Inherit;False;2;0;INT;1;False;1;INT;0;False;1;INT;0 +Node;AmplifyShaderEditor.OneMinusNode;108;-3215.788,-971.978;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;135;-4021.411,-677.8364;Inherit;False;2;0;FLOAT;0;False;1;INT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.WireNode;107;-3582.068,-1083.446;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.CeilOpNode;130;-4169.895,-727.0346;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RelayNode;78;-2000.405,-5.235178;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.WireNode;134;-3880.693,-455.4023;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FractNode;106;-3393.731,-969.6971;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;50;-2005.851,2048.018;Inherit;False;Property;_Depth;Depth;7;0;Create;True;0;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;64;-2173.058,2100.61;Inherit;False;2;2;0;INT;64;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;27;-1776.324,845.6664;Float;False;Property;_UVMotionMultiplier;UV Motion Multiplier;5;0;Create;True;0;0;0;False;0;False;0;0.5;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.DynamicAppendNode;109;-3508.764,-781.7744;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;25;-1120.2,419.6911;Inherit;False;3;3;0;FLOAT2;0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;141;-2528.614,-310.7851;Inherit;True;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;122;-3032.439,-891.9513;Inherit;False;2;0;FLOAT;0;False;1;INT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;97;-3755.8,-1277.217;Inherit;False;2;0;FLOAT;0;False;1;INT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;157;696.2112,1182.234;Inherit;False;2;0;FLOAT4;1,1,0,0;False;1;FLOAT4;1,1,0,0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.OneMinusNode;188;-36.6892,-179.5613;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;22;-889.8067,587.6949;Inherit;True;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;139;-3331.064,-263.9076;Inherit;False;2;0;FLOAT;0;False;1;INT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;87;-3357.61,-711.0641;Inherit;True;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.GetLocalVarNode;154;517.4617,1293.391;Inherit;False;152;C;1;0;OBJECT;;False;1;INT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;110;-3015.726,-758.4483;Inherit;True;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.DynamicAppendNode;112;-2856.368,-941.3546;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.DynamicAppendNode;138;-3154.993,-313.3108;Inherit;True;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;156;826.1672,1164.612;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.WireNode;144;-4298.254,-173.5045;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TexturePropertyNode;3;-136.6398,-887.4448;Float;True;Property;_MainTex;Base Map;0;1;[NoScaleOffset];Create;False;0;0;0;False;0;False;None;12d2a54817ebe334db38e85a687d9439;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1 +Node;AmplifyShaderEditor.SamplerNode;148;1109.224,1165.433;Inherit;True;Property;_TextureSample5;Texture Sample 1;3;0;Create;True;0;0;0;False;0;False;-1;None;None;True;1;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.DynamicAppendNode;161;713.8324,1345.229;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.FractNode;136;-3601.556,-454.0374;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TexturePropertyNode;14;-2170.243,513.1923;Float;True;Property;_MotionVectors;Motion Vectors;4;1;[NoScaleOffset];Create;True;0;0;0;False;0;False;None;eb58c36f965ff024cb94d9bba46e33e7;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1 +Node;AmplifyShaderEditor.SimpleDivideOpNode;137;-3802.883,-260.167;Inherit;False;2;0;INT;1;False;1;INT;0;False;1;INT;0 +Node;AmplifyShaderEditor.SamplerNode;16;-1762.902,597.855;Inherit;True;Property;_TextureSample3;Texture Sample 3;3;0;Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SwizzleNode;186;-1409.522,412.7811;Inherit;False;FLOAT2;0;1;2;3;1;0;COLOR;0,0,0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;11;1306.679,-696.6684;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.LerpOp;181;715.3683,266.2374;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;149;1614.737,1041.555;Inherit;False;3;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FractNode;145;-4473.97,-774.8016;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.BlendNormalsNode;187;677.9264,-266.3248;Inherit;False;0;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.VertexColorNode;12;963.4551,-904.7579;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.LerpOp;4;720.9565,-774.074;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SamplerNode;1;312.7569,-937.8739;Inherit;True;Property;_TextureSample0;Texture Sample 0;0;0;Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SamplerNode;2;317.4572,-747.2738;Inherit;True;Property;_TextureSample1;Texture Sample 1;0;0;Create;True;0;0;0;False;0;False;-1;None;None;True;1;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SamplerNode;177;318.7981,-414.6546;Inherit;True;Property;_TextureSample4;Texture Sample 0;0;0;Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.ColorNode;34;925.9869,-1091.493;Float;False;Property;_Color;Color;6;1;[HDR];Create;True;0;0;0;False;0;False;1,1,1,1;1,0.2311321,0.2311321,1;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SamplerNode;184;311.8688,293.0377;Inherit;True;Property;_TextureSample8;Texture Sample 1;0;0;Create;True;0;0;0;False;0;False;-1;None;None;True;1;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.GetLocalVarNode;155;531.2778,1364.058;Inherit;False;153;R;1;0;OBJECT;;False;1;INT;0 +Node;AmplifyShaderEditor.SamplerNode;15;-1692.873,405.1295;Inherit;True;Property;_TextureSample2;Texture Sample 2;3;0;Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SamplerNode;182;307.1685,102.4376;Inherit;True;Property;_TextureSample7;Texture Sample 0;0;0;Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SwizzleNode;185;-1431.16,637.3817;Inherit;False;FLOAT2;0;1;2;3;1;0;COLOR;0,0,0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.RangedFloatNode;98;-4649.447,-1435.346;Inherit;False;Property;_Framerate;Framerate;11;0;Create;True;0;0;0;False;0;False;30;0.2;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.TexturePropertyNode;183;-142.2284,152.8665;Float;True;Property;_MetallicGlossMap;MAS;2;1;[NoScaleOffset];Create;False;0;0;0;False;0;False;None;eeb676f899ce47e44be8eb023d19544e;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1 +Node;AmplifyShaderEditor.TexturePropertyNode;178;-130.5987,-364.2256;Float;True;Property;_BumpMap;Bump Map;1;2;[NoScaleOffset];[Normal];Create;False;0;0;0;False;0;False;None;27f95b5ccf25af6488ae167374bd99dd;True;bump;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1 +Node;AmplifyShaderEditor.SamplerNode;179;323.4984,-224.0545;Inherit;True;Property;_TextureSample6;Texture Sample 1;0;0;Create;True;0;0;0;False;0;False;-1;None;None;True;1;False;white;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;150;1146.704,1366.744;Inherit;False;Property;_BakedEmissionMultiplier;Baked Emission Multiplier;12;0;Create;True;0;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.NegateNode;29;-1482.896,814.2148;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;164;1964.221,-508.3861;Half;False;True;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;SLZ/Motion Vector Lit;94348b07e5e8bab40bd6c8a1e3df54cd;True;Forward;0;1;Forward;23;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalForward;False;False;0;Hidden/InternalErrorShader;0;0;Standard;48;Workflow;1;0;Surface;0;0; Refraction Model;0;0; Blend;0;0;Two Sided;1;0;Fragment Normal Space,InvertActionOnDeselection;0;0;Transmission;0;0; Transmission Shadow;0.5,False,-1;0;Translucency;0;0; Translucency Strength;1,False,-1;0; Normal Distortion;0.5,False,-1;0; Scattering;2,False,-1;0; Direct;0.9,False,-1;0; Ambient;0.1,False,-1;0; Shadow;0.5,False,-1;0;Cast Shadows;1;0; Use Shadow Threshold;0;0;Receive Shadows;1;0;GPU Instancing;0;637849824471988096;LOD CrossFade;0;637829811356983843;Built-in Fog;1;0;Lightmaps;1;0;Volumetrics;1;0;Decals;0;637849824449892631;Screen Space Occlusion;1;637965419590000744;Reflection Probe Blend/Projection;1;0;Light Layers;0;637849824444346761;_FinalColorxAlpha;0;0;Meta Pass;1;0;GBuffer Pass;0;0;Override Baked GI;0;0;Extra Pre Pass;0;0;DOTS Instancing;0;0;Tessellation;0;0; Phong;0;0; Strength;0.5,False,-1;0; Type;0;0; Tess;16,False,-1;0; Min;10,False,-1;0; Max;25,False,-1;0; Edge Length;16,False,-1;0; Max Displacement;25,False,-1;0;Write Depth;0;0; Early Z;0;0;Vertex Position,InvertActionOnDeselection;1;0;Debug Display;0;0;Clear Coat;0;0;Fluorescence;0;0;0;10;False;True;True;True;True;True;True;True;True;True;False;;True;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;168;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Universal2D;0;5;Universal2D;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;163;1964.221,-508.3861;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ExtraPrePass;0;0;ExtraPrePass;5;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;0;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;172;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ScenePickingPass;0;9;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;169;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthNormals;0;6;DepthNormals;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormals;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;167;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Meta;0;4;Meta;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Meta;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;171;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;SceneSelectionPass;0;8;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;170;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;GBuffer;0;7;GBuffer;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalGBuffer;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;166;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthOnly;0;3;DepthOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;False;False;True;1;LightMode=DepthOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;165;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ShadowCaster;0;2;ShadowCaster;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=ShadowCaster;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +WireConnection;20;0;185;0 +WireConnection;20;1;19;0 +WireConnection;103;0;128;0 +WireConnection;153;0;81;0 +WireConnection;126;0;98;0 +WireConnection;72;1;50;0 +WireConnection;72;0;69;0 +WireConnection;46;0;68;0 +WireConnection;46;1;48;0 +WireConnection;189;0;181;0 +WireConnection;69;0;50;0 +WireConnection;69;1;10;3 +WireConnection;80;0;141;0 +WireConnection;191;0;116;0 +WireConnection;128;0;126;0 +WireConnection;116;0;110;0 +WireConnection;116;1;112;0 +WireConnection;23;0;20;0 +WireConnection;23;1;26;0 +WireConnection;23;2;24;0 +WireConnection;23;3;29;0 +WireConnection;68;10;64;0 +WireConnection;152;0;82;0 +WireConnection;26;0;78;0 +WireConnection;47;1;52;0 +WireConnection;47;10;51;4 +WireConnection;104;0;101;0 +WireConnection;104;1;81;0 +WireConnection;190;0;141;0 +WireConnection;101;0;97;0 +WireConnection;132;0;140;0 +WireConnection;132;1;81;0 +WireConnection;140;0;135;0 +WireConnection;131;0;133;0 +WireConnection;133;0;132;0 +WireConnection;83;0;116;0 +WireConnection;18;0;186;0 +WireConnection;18;1;19;0 +WireConnection;52;0;46;0 +WireConnection;52;1;72;0 +WireConnection;21;0;83;0 +WireConnection;21;1;25;0 +WireConnection;105;0;107;0 +WireConnection;123;1;81;0 +WireConnection;108;0;106;0 +WireConnection;135;0;130;0 +WireConnection;135;1;82;0 +WireConnection;107;0;97;0 +WireConnection;130;0;128;0 +WireConnection;78;0;144;0 +WireConnection;134;0;135;0 +WireConnection;106;0;104;0 +WireConnection;64;0;65;0 +WireConnection;64;1;10;2 +WireConnection;109;0;82;0 +WireConnection;109;1;81;0 +WireConnection;25;0;18;0 +WireConnection;25;1;78;0 +WireConnection;25;2;29;0 +WireConnection;141;0;110;0 +WireConnection;141;1;138;0 +WireConnection;122;0;108;0 +WireConnection;122;1;123;0 +WireConnection;97;0;103;0 +WireConnection;97;1;82;0 +WireConnection;157;1;161;0 +WireConnection;188;0;78;0 +WireConnection;22;0;80;0 +WireConnection;22;1;23;0 +WireConnection;139;0;131;0 +WireConnection;139;1;137;0 +WireConnection;110;0;87;0 +WireConnection;110;1;109;0 +WireConnection;112;0;105;0 +WireConnection;112;1;122;0 +WireConnection;138;0;136;0 +WireConnection;138;1;139;0 +WireConnection;156;0;157;0 +WireConnection;144;0;145;0 +WireConnection;148;1;156;0 +WireConnection;161;0;154;0 +WireConnection;161;1;155;0 +WireConnection;136;0;134;0 +WireConnection;137;1;81;0 +WireConnection;16;0;14;0 +WireConnection;16;1;80;0 +WireConnection;186;0;15;0 +WireConnection;11;0;12;0 +WireConnection;11;1;34;0 +WireConnection;11;2;4;0 +WireConnection;181;0;182;0 +WireConnection;181;1;184;0 +WireConnection;181;2;78;0 +WireConnection;149;2;150;0 +WireConnection;145;0;128;0 +WireConnection;187;0;177;0 +WireConnection;187;1;179;0 +WireConnection;4;0;1;0 +WireConnection;4;1;2;0 +WireConnection;4;2;78;0 +WireConnection;1;0;3;0 +WireConnection;1;1;21;0 +WireConnection;2;0;3;0 +WireConnection;2;1;22;0 +WireConnection;177;0;178;0 +WireConnection;177;1;21;0 +WireConnection;177;5;188;0 +WireConnection;184;0;183;0 +WireConnection;184;1;22;0 +WireConnection;15;0;14;0 +WireConnection;15;1;83;0 +WireConnection;182;0;183;0 +WireConnection;182;1;21;0 +WireConnection;185;0;16;0 +WireConnection;179;0;178;0 +WireConnection;179;1;22;0 +WireConnection;179;5;78;0 +WireConnection;29;0;27;0 +WireConnection;164;0;11;0 +WireConnection;164;1;187;0 +WireConnection;164;3;189;0 +WireConnection;164;4;189;2 +WireConnection;164;5;189;1 +ASEEND*/ +//CHKSM=8C0A95AC2B891EDC9DCA6553343D703D993B4CFA \ No newline at end of file diff --git a/Assets/SLZShaders/VR_MotionVectorLit.shader.meta b/Assets/SLZShaders/VR_MotionVectorLit.shader.meta new file mode 100644 index 0000000..629066e --- /dev/null +++ b/Assets/SLZShaders/VR_MotionVectorLit.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 4a1250fb7f0da2e4e96bd2e34ce4a8ea +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/VR_MotionVectorOpaque.shader b/Assets/SLZShaders/VR_MotionVectorOpaque.shader new file mode 100644 index 0000000..e097b1d --- /dev/null +++ b/Assets/SLZShaders/VR_MotionVectorOpaque.shader @@ -0,0 +1,3334 @@ +// Made with Amplify Shader Editor +// Available at the Unity Asset Store - http://u3d.as/y3X +Shader "SLZ/Motion Vector Opaque" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1) + [ASEBegin][NoScaleOffset]_MainTex("Main Texture", 2D) = "white" {} + [NoScaleOffset]_MotionVectors("Motion Vectors", 2D) = "white" {} + _UVMotionMultiplier("UV Motion Multiplier", Float) = 0 + [HDR]_Color("Color", Color) = (1,1,1,1) + _Rows("Rows", Int) = 4 + _Columns("Columns", Int) = 8 + [ASEEnd]_Framerate("Framerate", Float) = 30 + + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + //_TransmissionShadow( "Transmission Shadow", Range( 0, 1 ) ) = 0.5 + //_TransStrength( "Trans Strength", Range( 0, 50 ) ) = 1 + //_TransNormal( "Trans Normal Distortion", Range( 0, 1 ) ) = 0.5 + //_TransScattering( "Trans Scattering", Range( 1, 50 ) ) = 2 + //_TransDirect( "Trans Direct", Range( 0, 1 ) ) = 0.9 + //_TransAmbient( "Trans Ambient", Range( 0, 1 ) ) = 0.1 + //_TransShadow( "Trans Shadow", Range( 0, 1 ) ) = 0.5 + //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5 + //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16 + //_TessMin( "Tess Min Distance", Float ) = 10 + //_TessMax( "Tess Max Distance", Float ) = 25 + //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16 + //_TessMaxDisp( "Tess Max Displacement", Float ) = 25 + } + + SubShader + { + LOD 0 + +HLSLINCLUDE +#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/PlatformCompiler.hlsl" +ENDHLSL + + + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Opaque" "Queue"="Geometry" } + Cull Back + ZWrite On + ZTest LEqual + Offset 0 , 0 + AlphaToMask Off + + HLSLINCLUDE + #pragma target 3.0 + + #pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + + #ifndef ASE_TESS_FUNCS + #define ASE_TESS_FUNCS + float4 FixedTess( float tessValue ) + { + return tessValue; + } + + float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos ) + { + float3 wpos = mul(o2w,vertex).xyz; + float dist = distance (wpos, cameraPos); + float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess; + return f; + } + + float4 CalcTriEdgeTessFactors (float3 triVertexFactors) + { + float4 tess; + tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z); + tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z); + tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y); + tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f; + return tess; + } + + float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams ) + { + float dist = distance (0.5 * (wpos0+wpos1), cameraPos); + float len = distance(wpos0, wpos1); + float f = max(len * scParams.y / (edgeLen * dist), 1.0); + return f; + } + + float DistanceFromPlane (float3 pos, float4 plane) + { + float d = dot (float4(pos,1.0f), plane); + return d; + } + + bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] ) + { + float4 planeTest; + planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f ); + return !all (planeTest); + } + + float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos ) + { + float3 f; + f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos); + f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos); + f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos); + + return CalcTriEdgeTessFactors (f); + } + + float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + return tess; + } + + float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + + if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes)) + { + tess = 0.0f; + } + else + { + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + } + return tess; + } + #endif //ASE_TESS_FUNCS + + ENDHLSL + + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForward" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _EMISSION + #define ASE_SRP_VERSION 999999 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_FORWARD + + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DefaultLitVariants.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + float4 ase_color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_color : COLOR; + float4 ase_texcoord8 : TEXCOORD8; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _MainTex; + sampler2D _MotionVectors; + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_color = v.ase_color; + o.ase_texcoord8.xy = v.texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + #if defined(LIGHTMAP_ON) + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + #if !defined(LIGHTMAP_ON) + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + float4 ase_color : COLOR; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + o.ase_color = v.ase_color; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + o.ase_color = patch[0].ase_color * bary.x + patch[1].ase_color * bary.y + patch[2].ase_color * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float3 temp_cast_0 = (0.0).xxx; + + float2 texCoord87 = IN.ase_texcoord8.xy * float2( 1,1 ) + float2( 0,0 ); + float2 appendResult109 = (float2((float)_Columns , (float)_Rows)); + float2 temp_output_110_0 = ( texCoord87 / appendResult109 ); + float mulTime126 = _TimeParameters.x * _Framerate; + float temp_output_97_0 = ( floor( mulTime126 ) / _Columns ); + float2 appendResult112 = (float2(frac( temp_output_97_0 ) , ( ( 1.0 - frac( ( floor( temp_output_97_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float4 temp_cast_5 = (0.5).xxxx; + float temp_output_135_0 = ( ceil( mulTime126 ) / _Columns ); + float2 appendResult138 = (float2(frac( temp_output_135_0 ) , ( ( 1.0 - frac( ( floor( temp_output_135_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float4 temp_cast_9 = (0.5).xxxx; + float4 lerpResult4 = lerp( tex2D( _MainTex, ( float4( ( temp_output_110_0 + appendResult112 ), 0.0 , 0.0 ) + ( ( tex2D( _MotionVectors, ( temp_output_110_0 + appendResult112 ) ) - temp_cast_5 ) * frac( mulTime126 ) * -_UVMotionMultiplier ) ).rg ) , tex2D( _MainTex, ( float4( ( temp_output_110_0 + appendResult138 ), 0.0 , 0.0 ) + ( ( tex2D( _MotionVectors, ( temp_output_110_0 + appendResult138 ) ) - temp_cast_9 ) * ( 1.0 - frac( mulTime126 ) ) * -1.0 * -_UVMotionMultiplier ) ).rg ) , frac( mulTime126 )); + float4 temp_output_11_0 = ( IN.ase_color * _Color * lerpResult4 ); + + float3 Albedo = temp_cast_0; + float3 Normal = float3(0, 0, 1); + float3 Emission = temp_output_11_0.rgb; +#if 0 + float3 BakedEmission = 0; +#endif + float3 Specular = 0.5; + float Metallic = 0.0; + float Smoothness = 0.0; + float Occlusion = 0.0; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _CLEARCOAT + float CoatMask = 0; + float CoatSmoothness = 0; + #endif + + #if defined(_FLUORESCENCE) + float4 Fluorescence = 0; + float4 Absorbance = 0; + #endif + + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.viewDirectionWS = WorldViewDirection; + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + #else + inputData.normalWS = WorldNormal; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + inputData.shadowCoord = ShadowCoords; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + inputData.shadowCoord = TransformWorldToShadowCoord(inputData.positionWS); + #else + inputData.shadowCoord = float4(0, 0, 0, 0); + #endif + + + #ifdef ASE_FOG + inputData.fogCoord = IN.fogFactorAndVertexLight.x; + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzww; //TODO: Shuffle things in vertex streams so we get full RGBA color rather than RGBB here + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xyz, IN.dynamicLightmapUV.xy, IN.vertexSH, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI(IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, IN.vertexSH , inputData.normalWS); + #endif + + #else + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI_DIR(IN.lightmapUVOrVertexSH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + #endif + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + SurfaceData surfaceData; + surfaceData.albedo = Albedo; + surfaceData.metallic = saturate(Metallic); + surfaceData.specular = Specular; + surfaceData.smoothness = saturate(Smoothness), + surfaceData.occlusion = Occlusion, + surfaceData.emission = Emission, + surfaceData.alpha = saturate(Alpha); + surfaceData.normalTS = Normal; + surfaceData.clearCoatMask = 0; + surfaceData.clearCoatSmoothness = 1; + + #ifdef _CLEARCOAT + surfaceData.clearCoatMask = saturate(CoatMask); + surfaceData.clearCoatSmoothness = saturate(CoatSmoothness); + #endif + #if defined(_FLUORESCENCE) + surfaceData.fluorescence = Fluorescence; + surfaceData.absorbance = Absorbance; + #endif + + #ifdef _DBUFFER + ApplyDecalToSurfaceData(IN.clipPos, surfaceData, inputData); + #endif + + half4 color = UniversalFragmentPBR( inputData, surfaceData); + + #ifdef LIGHTMAP_ON + float3 MetalSpec = lerp(kDieletricSpec.rgb, surfaceData.albedo , surfaceData.metallic); + color.rgb += BakedSpecular * surfaceData.occlusion * MetalSpec * inputData.bakedGI.rgb; + #endif + + #ifdef _TRANSMISSION_ASE + { + float shadow = _TransmissionShadow; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + half3 mainTransmission = max(0 , -dot(inputData.normalWS, mainLight.direction)) * mainAtten * Transmission; + color.rgb += Albedo * mainTransmission; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 transmission = max(0 , -dot(inputData.normalWS, light.direction)) * atten * Transmission; + color.rgb += Albedo * transmission; + } + #endif + } + #endif + + #ifdef _TRANSLUCENCY_ASE + { + float shadow = _TransShadow; + float normal = _TransNormal; + float scattering = _TransScattering; + float direct = _TransDirect; + float ambient = _TransAmbient; + float strength = _TransStrength; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + + half3 mainLightDir = mainLight.direction + inputData.normalWS * normal; + half mainVdotL = pow( saturate( dot( inputData.viewDirectionWS, -mainLightDir ) ), scattering ); + half3 mainTranslucency = mainAtten * ( mainVdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * mainTranslucency * strength; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 lightDir = light.direction + inputData.normalWS * normal; + half VdotL = pow( saturate( dot( inputData.viewDirectionWS, -lightDir ) ), scattering ); + half3 translucency = atten * ( VdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * translucency * strength; + } + #endif + } + #endif + + #ifdef _REFRACTION_ASE + float4 projScreenPos = ScreenPos / ScreenPos.w; + float3 refractionOffset = ( RefractionIndex - 1.0 ) * mul( UNITY_MATRIX_V, float4( WorldNormal,0 ) ).xyz * ( 1.0 - dot( WorldNormal, WorldViewDirection ) ); + projScreenPos.xy += refractionOffset.xy; + float3 refraction = SHADERGRAPH_SAMPLE_SCENE_COLOR( projScreenPos.xy ) * RefractionColor; + color.rgb = lerp( refraction, color.rgb, color.a ); + color.a = 1; + #endif + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, -inputData.viewDirectionWS, IN.fogFactorAndVertexLight.x); + #endif + #endif + + color = Volumetrics( color, inputData.positionWS); + + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return color; + } + + ENDHLSL + } + + + Pass + { + + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + + ZWrite On + ZTest LEqual + AlphaToMask Off + ColorMask 0 + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _EMISSION + #define ASE_SRP_VERSION 999999 + + + #pragma vertex vert + #pragma fragment frag + + #pragma multi_compile _ _CASTING_PUNCTUAL_LIGHT_SHADOW + + #define SHADERPASS SHADERPASS_SHADOWCASTER + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + float3 _LightDirection; + float3 _LightPosition; + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + + float3 normalWS = TransformObjectToWorldDir(v.ase_normal); + + + #if _CASTING_PUNCTUAL_LIGHT_SHADOW + float3 lightDirectionWS = normalize(_LightPosition - positionWS); + #else + float3 lightDirectionWS = _LightDirection; + #endif + float2 vShadowOffsets = GetShadowOffsets( normalWS, lightDirectionWS ); + positionWS.xyz += vShadowOffsets.y * lightDirectionWS.xyz / 1000; + float4 clipPos = TransformObjectToHClip( float4( mul( unity_WorldToObject, float4( positionWS.xyz, 1.0 ) ).xyz, 1.0 ) ); + //float4 clipPos = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, lightDirectionWS)); + + #if UNITY_REVERSED_Z + clipPos.z = min(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #else + clipPos.z = max(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #endif + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = clipPos; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _ALPHATEST_ON + #ifdef _ALPHATEST_SHADOW_ON + clip(Alpha - AlphaClipThresholdShadow); + #else + clip(Alpha - AlphaClipThreshold); + #endif + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + return 0; + } + + ENDHLSL + } + + + Pass + { + + Name "DepthOnly" + Tags { "LightMode"="DepthOnly" } + + ZWrite On + ColorMask 0 + AlphaToMask Off + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _EMISSION + #define ASE_SRP_VERSION 999999 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return 0; + } + ENDHLSL + } + + + Pass + { + + Name "Meta" + Tags { "LightMode"="Meta" } + + Cull Off + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _EMISSION + #define ASE_SRP_VERSION 999999 + + + #pragma vertex vert + #pragma fragment frag + + #pragma shader_feature _ EDITOR_VISUALIZATION + + #define SHADERPASS SHADERPASS_META + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/MetaInput.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + #ifdef EDITOR_VISUALIZATION + float4 VizUV : TEXCOORD2; + float4 LightCoord : TEXCOORD3; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.clipPos = MetaVertexPosition( v.vertex, v.texcoord1.xy, v.texcoord1.xy, unity_LightmapST, unity_DynamicLightmapST ); + + #ifdef EDITOR_VISUALIZATION + float2 VizUV = 0; + float4 LightCoord = 0; + UnityEditorVizData(v.vertex.xyz, v.texcoord0.xy, v.texcoord1.xy, v.texcoord2.xy, VizUV, LightCoord); + o.VizUV = float4(VizUV, 0, 0); + o.LightCoord = LightCoord; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = o.clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.texcoord0 = v.texcoord0; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.texcoord0 = patch[0].texcoord0 * bary.x + patch[1].texcoord0 * bary.y + patch[2].texcoord0 * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float3 temp_cast_0 = (0.0).xxx; + + + float3 Albedo = temp_cast_0; + float3 Emission = 0; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + MetaInput metaInput = (MetaInput)0; + metaInput.Albedo = Albedo; + metaInput.Emission = Emission; + #ifdef EDITOR_VISUALIZATION + metaInput.VizUV = IN.VizUV.xy; + metaInput.LightCoord = IN.LightCoord; + #endif + + return MetaFragment(metaInput); + } + ENDHLSL + } + + /*ase_pass*/ + Pass + { + + Name "BakedRaytrace" + Tags{ "LightMode" = "BakedRaytrace" } + HLSLPROGRAM + + /*ase_pragma_before*/ + + #define SHADERPASS SHADERPASS_RAYTRACE + + #include "UnityRaytracingMeshUtils.cginc" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #define _EMISSION + #pragma raytracing test + #pragma shader_feature_local __ _ALBEDOMULTIPLY_ON + #pragma shader_feature_local __ _EMISSION_ON + + /*ase_pragma*/ + + struct RayPayload + { + float4 color; + float3 dir; + }; + + struct AttributeData + { + float2 barycentrics; + }; + + struct Vertex + { + float2 texcoord; + float3 normal; + }; + + Texture2D _BaseMap; + SamplerState sampler_BaseMap; + + CBUFFER_START( UnityPerMaterial ) + /*ase_srp_batcher*/ + Texture2D _EmissionMap; + SamplerState sampler_EmissionMap; + + float4 _EmissionColor; + float4 _BaseMap_ST; + float _BakedMutiplier = 1; + CBUFFER_END + + /*ase_globals*/ + + /*ase_funcs*/ + + //https://coty.tips/raytracing-in-unity/ + [shader("closesthit")] + void MyClosestHit(inout RayPayload payload, + AttributeData attributes : SV_IntersectionAttributes) { + + payload.color = float4(0,0,0,1); //Intializing + payload.dir = float3(1,0,0); + + // #if _EMISSION_ON + uint2 launchIdx = DispatchRaysIndex(); + // ShadingData shade = getShadingData( PrimitiveIndex(), attribs ); + + uint primitiveIndex = PrimitiveIndex(); + uint3 triangleIndicies = UnityRayTracingFetchTriangleIndices(primitiveIndex); + Vertex v0, v1, v2; + + v0.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.x, kVertexAttributeTexCoord0); + v1.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.y, kVertexAttributeTexCoord0); + v2.texcoord = UnityRayTracingFetchVertexAttribute2(triangleIndicies.z, kVertexAttributeTexCoord0); + + // v0.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.x, kVertexAttributeNormal); + // v1.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.y, kVertexAttributeNormal); + // v2.normal = UnityRayTracingFetchVertexAttribute3(triangleIndicies.z, kVertexAttributeNormal); + + float3 barycentrics = float3(1.0 - attributes.barycentrics.x - attributes.barycentrics.y, attributes.barycentrics.x, attributes.barycentrics.y); + + Vertex vInterpolated; + vInterpolated.texcoord = v0.texcoord * barycentrics.x + v1.texcoord * barycentrics.y + v2.texcoord * barycentrics.z; + //TODO: Extract normal direction to ignore the backside of emissive objects + //vInterpolated.normal = v0.normal * barycentrics.x + v1.normal * barycentrics.y + v2.normal * barycentrics.z; + // if ( dot(vInterpolated.normal, float3(1,0,0) < 0) ) payload.color = float4(0,10,0,1) ; + // else payload.color = float4(10,0,0,1) ; + + //TODO: Figure out how to tie Amplify into using Texture2d and SamplerState instead of the bundled sampler2D. Forcing names for now. + //#if _ALBEDOMULTIPLY_ON + float4 albedo = float4(_BaseMap.SampleLevel(sampler_BaseMap, vInterpolated.texcoord.xy * _BaseMap_ST.xy + _BaseMap_ST.zw, 0 ).rgb , 1) ; + // #else + // float4 albedo = float4(1,1,1,1); + // #endif + + payload.color = float4( (_EmissionMap.SampleLevel(sampler_EmissionMap, vInterpolated.texcoord * _BaseMap_ST.xy + _BaseMap_ST.zw,0) ).rgb * _EmissionColor.rgb * albedo.rgb * _BakedMutiplier , 1 ); + // #else + // payload.color = float4(0,0,0,1); + + // #endif + } + ENDHLSL + + } + + + Pass + { + + Name "Universal2D" + Tags { "LightMode"="Universal2D" } + + Blend One Zero, One Zero + ColorMask RGBA + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _EMISSION + #define ASE_SRP_VERSION 999999 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_2D + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID( v ); + UNITY_TRANSFER_INSTANCE_ID( v, o ); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float3 temp_cast_0 = (0.0).xxx; + + + float3 Albedo = temp_cast_0; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + + half4 color = half4( Albedo, Alpha ); + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + return color; + } + ENDHLSL + } + + + Pass + { + + Name "DepthNormals" + Tags { "LightMode"="DepthNormals" } + + ZWrite On + Blend One Zero + ZTest LEqual + ZWrite On + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _EMISSION + #define ASE_SRP_VERSION 999999 + + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float3 worldNormal : TEXCOORD2; + float4 worldTangent : TEXCOORD3; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = v.ase_normal; + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 normalWS = TransformObjectToWorldNormal( v.ase_normal ); + float4 tangentWS = float4(TransformObjectToWorldDir( v.ase_tangent.xyz), v.ase_tangent.w); + float4 positionCS = TransformWorldToHClip( positionWS ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + + o.worldNormal = normalWS; + o.worldTangent = tangentWS; + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = positionCS; + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + float3 WorldNormal = IN.worldNormal; + float4 WorldTangent = IN.worldTangent; + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + + float3 Normal = float3(0, 0, 1); + float Alpha = 1; + float AlphaClipThreshold = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + #if defined(_GBUFFER_NORMALS_OCT) + float2 octNormalWS = PackNormalOctQuadEncode(WorldNormal); + float2 remappedOctNormalWS = saturate(octNormalWS * 0.5 + 0.5); + half3 packedNormalWS = PackFloat2To888(remappedOctNormalWS); + return half4(packedNormalWS, 0.0); + #else + + #if defined(_NORMALMAP) + #if _NORMAL_DROPOFF_TS + float crossSign = (WorldTangent.w > 0.0 ? 1.0 : -1.0) * GetOddNegativeScale(); + float3 bitangent = crossSign * cross(WorldNormal.xyz, WorldTangent.xyz); + float3 normalWS = TransformTangentToWorld(Normal, half3x3(WorldTangent.xyz, bitangent, WorldNormal.xyz)); + #elif _NORMAL_DROPOFF_OS + float3 normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + float3 normalWS = Normal; + #endif + #else + float3 normalWS = WorldNormal; + #endif + + return half4(EncodeWSNormalForNormalsTex(NormalizeNormalPerPixel(normalWS)), 0.0); + #endif + } + ENDHLSL + } + + + Pass + { + + Name "GBuffer" + Tags { "LightMode"="UniversalGBuffer" } + + Blend One Zero, One Zero + ColorMask RGBA + + + HLSLPROGRAM +#define _NORMAL_DROPOFF_TS 1#pragma multi_compile_instancing#pragma multi_compile_fog#define ASE_FOG 1#pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED#define _EMISSION#define ASE_SRP_VERSION 999999 +#if FALSE + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile _ DYNAMICLIGHTMAP_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE + //_MAIN_LIGHT_SHADOWS_SCREEN + + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING + #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION + + #pragma multi_compile_fragment _ _SHADOWS_SOFT + #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING + #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE + //#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile _ _GBUFFER_NORMALS_OCT + //#pragma multi_compile_fragment _ _LIGHT_LAYERS + #pragma multi_compile _ _RENDER_PASS_ENABLED + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_GBUFFER + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl" + + + #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) + #define ENABLE_TERRAIN_PERPIXEL_NORMAL + #endif + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + float4 ase_color : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 lightmapUVOrVertexSH : TEXCOORD0; + half4 fogFactorAndVertexLight : TEXCOORD1; + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD2; + #endif + float4 tSpace0 : TEXCOORD3; + float4 tSpace1 : TEXCOORD4; + float4 tSpace2 : TEXCOORD5; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD6; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD7; + #endif + float4 ase_color : COLOR; + float4 ase_texcoord8 : TEXCOORD8; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _MainTex; + sampler2D _MotionVectors; + + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.ase_color = v.ase_color; + o.ase_texcoord8.xy = v.texcoord.xy; + + //setting value to unused interpolator channels and avoid initialization warnings + o.ase_texcoord8.zw = 0; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float3 positionVS = TransformWorldToView( positionWS ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.ase_normal, v.ase_tangent ); + + o.tSpace0 = float4( normalInput.normalWS, positionWS.x); + o.tSpace1 = float4( normalInput.tangentWS, positionWS.y); + o.tSpace2 = float4( normalInput.bitangentWS, positionWS.z); + + OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy ); + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + OUTPUT_SH( normalInput.normalWS.xyz, o.lightmapUVOrVertexSH.xyz ); + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + o.lightmapUVOrVertexSH.zw = v.texcoord; + o.lightmapUVOrVertexSH.xy = v.texcoord * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + float4 ase_tangent : TANGENT; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + float4 ase_color : COLOR; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + o.ase_tangent = v.ase_tangent; + o.texcoord = v.texcoord; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + o.ase_color = v.ase_color; + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z; + o.texcoord = patch[0].texcoord * bary.x + patch[1].texcoord * bary.y + patch[2].texcoord * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + o.ase_color = patch[0].ase_color * bary.x + patch[1].ase_color * bary.y + patch[2].ase_color * bary.z; + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + FragmentOutput frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float2 sampleCoords = (IN.lightmapUVOrVertexSH.zw / _TerrainHeightmapRecipSize.zw + 0.5f) * _TerrainHeightmapRecipSize.xy; + float3 WorldNormal = TransformObjectToWorldNormal(normalize(SAMPLE_TEXTURE2D(_TerrainNormalmapTexture, sampler_TerrainNormalmapTexture, sampleCoords).rgb * 2 - 1)); + float3 WorldTangent = -cross(GetObjectToWorldMatrix()._13_23_33, WorldNormal); + float3 WorldBiTangent = cross(WorldNormal, -WorldTangent); + #else + float3 WorldNormal = normalize( IN.tSpace0.xyz ); + float3 WorldTangent = IN.tSpace1.xyz; + float3 WorldBiTangent = IN.tSpace2.xyz; + #endif + float3 WorldPosition = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #else + ShadowCoords = float4(0, 0, 0, 0); + #endif + + + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + float3 temp_cast_0 = (0.0).xxx; + + float2 texCoord87 = IN.ase_texcoord8.xy * float2( 1,1 ) + float2( 0,0 ); + float2 appendResult109 = (float2((float)_Columns , (float)_Rows)); + float2 temp_output_110_0 = ( texCoord87 / appendResult109 ); + float mulTime126 = _TimeParameters.x * _Framerate; + float temp_output_97_0 = ( floor( mulTime126 ) / _Columns ); + float2 appendResult112 = (float2(frac( temp_output_97_0 ) , ( ( 1.0 - frac( ( floor( temp_output_97_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float4 temp_cast_5 = (0.5).xxxx; + float temp_output_135_0 = ( ceil( mulTime126 ) / _Columns ); + float2 appendResult138 = (float2(frac( temp_output_135_0 ) , ( ( 1.0 - frac( ( floor( temp_output_135_0 ) / _Rows ) ) ) - (float)( 1 / _Rows ) ))); + float4 temp_cast_9 = (0.5).xxxx; + float4 lerpResult4 = lerp( tex2D( _MainTex, ( float4( ( temp_output_110_0 + appendResult112 ), 0.0 , 0.0 ) + ( ( tex2D( _MotionVectors, ( temp_output_110_0 + appendResult112 ) ) - temp_cast_5 ) * frac( mulTime126 ) * -_UVMotionMultiplier ) ).rg ) , tex2D( _MainTex, ( float4( ( temp_output_110_0 + appendResult138 ), 0.0 , 0.0 ) + ( ( tex2D( _MotionVectors, ( temp_output_110_0 + appendResult138 ) ) - temp_cast_9 ) * ( 1.0 - frac( mulTime126 ) ) * -1.0 * -_UVMotionMultiplier ) ).rg ) , frac( mulTime126 )); + float4 temp_output_11_0 = ( IN.ase_color * _Color * lerpResult4 ); + + float3 Albedo = temp_cast_0; + float3 Normal = float3(0, 0, 1); + float3 Emission = temp_output_11_0.rgb; + float3 Specular = 0.5; + float Metallic = 0.0; + float Smoothness = 0.0; + float Occlusion = 0.0; + float Alpha = 1; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = 0; + #endif + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.positionCS = IN.clipPos; + inputData.shadowCoord = ShadowCoords; + + + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + #else + inputData.normalWS = WorldNormal; + #endif + + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + inputData.viewDirectionWS = SafeNormalize( WorldViewDirection ); + + + + #ifdef ASE_FOG + inputData.fogCoord = InitializeInputDataFog(float4(WorldPosition, 1.0), IN.fogFactorAndVertexLight.x); + #endif + + inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw; + + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.lightmapUVOrVertexSH.xyz; + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #else + #if defined(DYNAMICLIGHTMAP_ON) + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, IN.dynamicLightmapUV.xy, SH, inputData.normalWS); + #else + inputData.bakedGI = SAMPLE_GI( IN.lightmapUVOrVertexSH.xy, SH, inputData.normalWS ); + #endif + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + #ifdef _DBUFFER + ApplyDecal(IN.clipPos, + Albedo, + Specular, + inputData.normalWS, + Metallic, + Occlusion, + Smoothness); + #endif + + BRDFData brdfData; + InitializeBRDFData + (Albedo, Metallic, Specular, Smoothness, Alpha, brdfData); + + Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, inputData.shadowMask); + half4 color; + MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, inputData.shadowMask); + color.rgb = GlobalIllumination(brdfData, inputData.bakedGI, Occlusion, inputData.positionWS, inputData.normalWS, inputData.viewDirectionWS); + color.a = Alpha; + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fogFactorAndVertexLight.x ); + #else + color.rgb = MixFog(color.rgb, IN.fogFactorAndVertexLight.x); + #endif + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return BRDFDataToGbuffer(brdfData, inputData, Smoothness, Emission + color.rgb); + } +#endif + ENDHLSL + } + + + + Pass + { + + Name "SceneSelectionPass" + Tags { "LightMode"="SceneSelectionPass" } + + Cull Off + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _EMISSION + #define ASE_SRP_VERSION 999999 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + int _ObjectId; + int _PassValue; + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if _ALPHATEST_ON + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = half4(_ObjectId, _PassValue, 1.0, 1.0); + return outColor; + } + + ENDHLSL + } + + + Pass + { + + Name "ScenePickingPass" + Tags { "LightMode"="Picking" } + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define _EMISSION + #define ASE_SRP_VERSION 999999 + + + #pragma only_renderers d3d11 glcore gles gles3 + #pragma vertex vert + #pragma fragment frag + + + #define ATTRIBUTES_NEED_NORMAL + #define ATTRIBUTES_NEED_TANGENT + #define SHADERPASS SHADERPASS_DEPTHONLY + + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SLZBlueNoise.hlsl" + #pragma multi_compile _ _VOLUMETRICS_ENABLED + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + int _Columns; + int _Rows; + float _Framerate; + float _UVMotionMultiplier; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + + + + + + float4 _SelectionID; + + + struct SurfaceDescription + { + float Alpha; + float AlphaClipThreshold; + }; + + VertexOutput VertexFunction(VertexInput v ) + { + VertexOutput o; + ZERO_INITIALIZE(VertexOutput, o); + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = defaultVertexValue; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.ase_normal = v.ase_normal; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + o.clipPos = TransformWorldToHClip(positionWS); + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float3 ase_normal : NORMAL; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( VertexInput v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.ase_normal = v.ase_normal; + + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax; + float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + VertexOutput DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + VertexInput o = (VertexInput) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal)); + float phongStrength = _TessPhongStrength; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + #endif + + half4 frag(VertexOutput IN ) : SV_TARGET + { + SurfaceDescription surfaceDescription = (SurfaceDescription)0; + + surfaceDescription.Alpha = 1; + surfaceDescription.AlphaClipThreshold = 0.5; + + + #if _ALPHATEST_ON + float alphaClipThreshold = 0.01f; + #if ALPHA_CLIP_THRESHOLD + alphaClipThreshold = surfaceDescription.AlphaClipThreshold; + #endif + clip(surfaceDescription.Alpha - alphaClipThreshold); + #endif + + half4 outColor = 0; + outColor = _SelectionID; + + return outColor; + } + + ENDHLSL + } + + } + + CustomEditor "UnityEditor.ShaderGraphLitGUI" + Fallback "Hidden/InternalErrorShader" + +} +/*ASEBEGIN +Version=18935 +2103;205;1980;1007;74.75391;517.0854;1;True;True +Node;AmplifyShaderEditor.CommentaryNode;129;-4667.317,-1560.812;Inherit;False;2483.175;1723.904;Comment;36;87;140;139;138;137;136;135;134;133;132;131;101;122;112;123;105;97;107;106;104;108;103;128;130;126;98;116;110;82;81;109;141;144;145;152;153;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;162;-477.0573,503.287;Inherit;False;1309.276;536.674;Baked;8;149;150;148;156;155;154;161;157;Baked;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;32;-2380.879,431.1962;Inherit;False;1565.432;670.7075;Motion Vector interpolation;14;14;19;16;27;15;29;20;24;18;26;23;25;22;21;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;84;-2057.125,-460.3955;Inherit;False;200;161;Comment;1;83;UV0;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;79;-2050.404,-55.23522;Inherit;False;200;161;Comment;1;78;frame lerp;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;31;-1176.52,-192.5386;Inherit;False;1091.596;477.5999;Main Texture frame blend;4;2;1;4;3;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;85;-2046.481,-258.3556;Inherit;False;200;161;UV1;1;80;UV1;1,1,1,1;0;0 +Node;AmplifyShaderEditor.FractNode;106;-3393.731,-969.6971;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.WireNode;134;-3880.693,-455.4023;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;98;-4631.447,-1437.346;Inherit;False;Property;_Framerate;Framerate;8;0;Create;True;0;0;0;False;0;False;30;0.1;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.FloorOpNode;103;-3904.926,-1337.767;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.CeilOpNode;130;-4169.895,-727.0346;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.WireNode;107;-3582.068,-1083.446;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;135;-4021.411,-677.8364;Inherit;False;2;0;FLOAT;0;False;1;INT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.OneMinusNode;108;-3215.788,-971.978;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FractNode;105;-3305.3,-1122.35;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;104;-3448.457,-1166.648;Inherit;False;2;0;FLOAT;0;False;1;INT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;21;-1113.511,481.1962;Inherit;True;2;2;0;FLOAT2;0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;19;-1572.804,645.9233;Float;False;Constant;_5;.5;3;0;Create;True;0;0;0;False;0;False;0.5;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;18;-1428.655,530.1978;Inherit;False;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.FloorOpNode;101;-3563.798,-1270.216;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RelayNode;83;-2007.125,-410.3956;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.FractNode;133;-3692.356,-341.6533;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.OneMinusNode;131;-3514.413,-343.9341;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;123;-3504.258,-888.2106;Inherit;False;2;0;INT;1;False;1;INT;0;False;1;INT;0 +Node;AmplifyShaderEditor.SamplerNode;16;-1846.838,725.0273;Inherit;True;Property;_TextureSample3;Texture Sample 3;3;0;Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.NegateNode;29;-1643.534,941.3871;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;25;-1280.839,546.8636;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.TexturePropertyNode;14;-2330.879,640.3645;Float;True;Property;_MotionVectors;Motion Vectors;1;1;[NoScaleOffset];Create;True;0;0;0;False;0;False;None;31c1e6c0dea756b498f3977676e82fe0;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1 +Node;AmplifyShaderEditor.TextureCoordinatesNode;87;-3357.61,-711.0641;Inherit;True;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.FractNode;136;-3601.556,-454.0374;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;110;-3015.726,-758.4483;Inherit;True;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.DynamicAppendNode;138;-3154.993,-313.3108;Inherit;True;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;137;-3802.883,-260.167;Inherit;False;2;0;INT;1;False;1;INT;0;False;1;INT;0 +Node;AmplifyShaderEditor.DynamicAppendNode;112;-2856.368,-941.3546;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;22;-1050.446,714.8672;Inherit;True;2;2;0;FLOAT2;0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;116;-2560.913,-758.7842;Inherit;True;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;139;-3331.064,-263.9076;Inherit;False;2;0;FLOAT;0;False;1;INT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;141;-2528.614,-310.7851;Inherit;True;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.RangedFloatNode;27;-1936.96,972.8386;Float;False;Property;_UVMotionMultiplier;UV Motion Multiplier;2;0;Create;True;0;0;0;False;0;False;0;0.3333;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.DynamicAppendNode;109;-3508.764,-781.7744;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;97;-3755.8,-1277.217;Inherit;False;2;0;FLOAT;0;False;1;INT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FractNode;145;-4473.97,-774.8016;Inherit;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.WireNode;144;-4298.254,-173.5045;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FloorOpNode;140;-3862.423,-642.1724;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;24;-1432.981,903.9144;Float;False;Constant;_Float0;Float 0;3;0;Create;True;0;0;0;False;0;False;-1;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;122;-3032.439,-891.9513;Inherit;False;2;0;FLOAT;0;False;1;INT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TemplateFragmentDataNode;51;-1403.448,2073.357;Inherit;False;0;0;clipPos;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleDivideOpNode;132;-3747.082,-538.6045;Inherit;False;2;0;FLOAT;0;False;1;INT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;2;-678.4235,55.06132;Inherit;True;Property;_TextureSample1;Texture Sample 1;0;0;Create;True;0;0;0;False;0;False;-1;None;None;True;1;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.DynamicAppendNode;161;-230.6864,856.9611;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.SimpleDivideOpNode;157;-248.3076,693.9658;Inherit;False;2;0;FLOAT4;1,1,0,0;False;1;FLOAT4;1,1,0,0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.RelayNode;128;-4229.118,-1366.943;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.ColorNode;34;-232.4293,-591.7642;Float;False;Property;_Color;Color;3;1;[HDR];Create;True;0;0;0;False;0;False;1,1,1,1;11.98431,7.215686,7.215686,1;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;150;202.1852,878.4755;Inherit;False;Property;_BakedEmissionMultiplier;Baked Emission Multiplier;9;0;Create;True;0;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;15;-1852.509,523.3021;Inherit;True;Property;_TextureSample2;Texture Sample 2;3;0;Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;46;-1780.333,1850.196;Inherit;False;2;0;FLOAT4;0,0,0,0;False;1;FLOAT;0.5;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.StaticSwitch;72;-1696.876,2002.386;Inherit;False;Property;_ScaleDepthDither;Scale Depth Dither;5;0;Create;True;0;0;0;False;0;False;0;0;0;True;;Toggle;2;Key0;Key1;Create;True;True;All;9;1;FLOAT;0;False;0;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;149;670.2187,553.287;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.TexturePropertyNode;3;-1126.52,-92.10968;Float;True;Property;_MainTex;Main Texture;0;1;[NoScaleOffset];Create;False;0;0;0;False;0;False;None;f1c8d7ce8e192e9479527d433e316ead;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1 +Node;AmplifyShaderEditor.GetLocalVarNode;155;-413.2412,875.7895;Inherit;False;153;R;1;0;OBJECT;;False;1;INT;0 +Node;AmplifyShaderEditor.GetLocalVarNode;154;-427.0573,805.1232;Inherit;False;152;C;1;0;OBJECT;;False;1;INT;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;152;-3868.503,-1183.609;Inherit;False;C;-1;True;1;0;INT;0;False;1;INT;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;153;-3870.503,-1108.609;Inherit;False;R;-1;True;1;0;INT;0;False;1;INT;0 +Node;AmplifyShaderEditor.IntNode;82;-4107.079,-1259.714;Inherit;False;Property;_Columns;Columns;7;0;Create;True;0;0;0;False;0;False;8;3;False;0;1;INT;0 +Node;AmplifyShaderEditor.IntNode;81;-4098.651,-1157.766;Inherit;False;Property;_Rows;Rows;6;0;Create;True;0;0;0;False;0;False;4;3;False;0;1;INT;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;156;-118.3516,676.3442;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SamplerNode;148;164.7049,677.165;Inherit;True;Property;_TextureSample5;Texture Sample 1;0;0;Create;True;0;0;0;False;0;False;-1;None;None;True;1;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleSubtractOpNode;20;-1423.579,730.1797;Inherit;False;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.WorldPosInputsNode;147;233.765,-501.9776;Inherit;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.RelayNode;80;-1996.481,-208.3555;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;23;-1259.993,871.4675;Inherit;False;4;4;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SwizzleNode;13;345.2293,-211.0839;Inherit;False;FLOAT;3;1;2;3;1;0;COLOR;0,0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.VertexColorNode;12;-194.9611,-405.0289;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.LerpOp;4;-268.9241,21.26115;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.OneMinusNode;26;-1328.071,670.7819;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TexCoordVertexDataNode;10;-2786.698,1948.91;Inherit;False;1;3;0;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;48;-1967.657,1960.338;Inherit;False;Constant;_Float1;Float 1;2;0;Create;True;0;0;0;False;0;False;0.5;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;69;-1824.897,2102.173;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.FunctionNode;47;-1328.923,1845.467;Inherit;False;Depth Offseting;-1;;57;f08568184ae023c44bfc8baedfb827a9;0;2;1;FLOAT;0;False;10;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;52;-1573.019,1856.026;Inherit;False;2;2;0;FLOAT4;1,0,0,0;False;1;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.SamplerNode;1;-677.1238,-142.5386;Inherit;True;Property;_TextureSample0;Texture Sample 0;0;0;Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.FunctionNode;146;524.8376,-408.1519;Inherit;False;VolumetricsUnlit;-1;;56;800698b1441791d449f3e84fa3283d1e;0;2;2;FLOAT4;0,0,0,0;False;3;FLOAT3;0,0,0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;11;203.1194,-331.3009;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleTimeNode;126;-4463.882,-1438.698;Inherit;False;1;0;FLOAT;1;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;50;-2005.851,2048.018;Inherit;False;Property;_Depth;Depth;4;0;Create;True;0;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;173;774.848,-185.9885;Inherit;False;Constant;_Float2;Float 2;11;0;Create;True;0;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;64;-2173.058,2100.61;Inherit;False;2;2;0;INT;64;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.IntNode;65;-2266.384,2016.9;Inherit;False;Global;NoiseArraySize;NoiseArraySize;2;0;Create;True;0;0;0;False;0;False;64;64;False;0;1;INT;0 +Node;AmplifyShaderEditor.FunctionNode;68;-2079.864,1858.284;Inherit;False;Global Blue Noise Sample;-1;;55;bac712bbbce65c14c9d4cbc808f3d0e0;0;2;8;FLOAT2;0,0;False;10;FLOAT;0;False;1;FLOAT4;0 +Node;AmplifyShaderEditor.RelayNode;78;-2000.405,-5.235178;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;168;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Universal2D;0;5;Universal2D;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;165;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ShadowCaster;0;2;ShadowCaster;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=ShadowCaster;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;166;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthOnly;0;3;DepthOnly;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;True;False;False;False;False;0;False;-1;False;False;False;False;False;False;False;False;False;True;1;False;-1;False;False;True;1;LightMode=DepthOnly;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;172;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ScenePickingPass;0;9;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;167;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;Meta;0;4;Meta;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Meta;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;169;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;DepthNormals;0;6;DepthNormals;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=DepthNormals;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;170;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;GBuffer;0;7;GBuffer;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalGBuffer;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;164;975.6781,-308.2762;Float;False;True;-1;2;UnityEditor.ShaderGraphLitGUI;0;2;SLZ/Motion Vector Opaque;94348b07e5e8bab40bd6c8a1e3df54cd;True;Forward;0;1;Forward;23;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;1;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;False;False;False;True;1;LightMode=UniversalForward;False;False;0;Hidden/InternalErrorShader;0;0;Standard;47;Workflow;1;0;Surface;0;0; Refraction Model;0;0; Blend;0;0;Two Sided;1;0;Fragment Normal Space,InvertActionOnDeselection;0;0;Transmission;0;0; Transmission Shadow;0.5,False,-1;0;Translucency;0;0; Translucency Strength;1,False,-1;0; Normal Distortion;0.5,False,-1;0; Scattering;2,False,-1;0; Direct;0.9,False,-1;0; Ambient;0.1,False,-1;0; Shadow;0.5,False,-1;0;Cast Shadows;1;0; Use Shadow Threshold;0;0;Receive Shadows;1;0;GPU Instancing;1;0;LOD CrossFade;0;637829811356983843;Built-in Fog;1;0;Lightmaps;1;0;Volumetrics;1;0;Decals;0;0;Screen Space Occlusion;1;0;Light Layers;0;0;_FinalColorxAlpha;0;0;Meta Pass;1;0;GBuffer Pass;0;0;Override Baked GI;0;0;Extra Pre Pass;0;0;DOTS Instancing;0;0;Tessellation;0;0; Phong;0;0; Strength;0.5,False,-1;0; Type;0;0; Tess;16,False,-1;0; Min;10,False,-1;0; Max;25,False,-1;0; Edge Length;16,False,-1;0; Max Displacement;25,False,-1;0;Write Depth;0;0; Early Z;0;0;Vertex Position,InvertActionOnDeselection;1;0;Debug Display;0;0;Clear Coat;0;0;Fluorescence;0;0;0;10;False;True;True;True;True;True;True;True;True;True;False;;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;171;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;SceneSelectionPass;0;8;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;True;4;d3d11;glcore;gles;gles3;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;163;975.6781,-308.2762;Float;False;False;-1;2;UnityEditor.ShaderGraphLitGUI;0;1;New Amplify Shader;94348b07e5e8bab40bd6c8a1e3df54cd;True;ExtraPrePass;0;0;ExtraPrePass;5;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;0;False;-1;False;False;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;2;True;17;d3d9;d3d11;glcore;gles;gles3;metal;vulkan;xbox360;xboxone;xboxseries;ps4;playstation;psp2;n3ds;wiiu;switch;nomrt;0;False;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;True;True;True;True;0;False;-1;False;False;False;False;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;False;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;0;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0 +WireConnection;106;0;104;0 +WireConnection;134;0;135;0 +WireConnection;103;0;128;0 +WireConnection;130;0;128;0 +WireConnection;107;0;97;0 +WireConnection;135;0;130;0 +WireConnection;135;1;82;0 +WireConnection;108;0;106;0 +WireConnection;105;0;107;0 +WireConnection;104;0;101;0 +WireConnection;104;1;81;0 +WireConnection;21;0;83;0 +WireConnection;21;1;25;0 +WireConnection;18;0;15;0 +WireConnection;18;1;19;0 +WireConnection;101;0;97;0 +WireConnection;83;0;116;0 +WireConnection;133;0;132;0 +WireConnection;131;0;133;0 +WireConnection;123;1;81;0 +WireConnection;16;0;14;0 +WireConnection;16;1;80;0 +WireConnection;29;0;27;0 +WireConnection;25;0;18;0 +WireConnection;25;1;78;0 +WireConnection;25;2;29;0 +WireConnection;136;0;134;0 +WireConnection;110;0;87;0 +WireConnection;110;1;109;0 +WireConnection;138;0;136;0 +WireConnection;138;1;139;0 +WireConnection;137;1;81;0 +WireConnection;112;0;105;0 +WireConnection;112;1;122;0 +WireConnection;22;0;80;0 +WireConnection;22;1;23;0 +WireConnection;116;0;110;0 +WireConnection;116;1;112;0 +WireConnection;139;0;131;0 +WireConnection;139;1;137;0 +WireConnection;141;0;110;0 +WireConnection;141;1;138;0 +WireConnection;109;0;82;0 +WireConnection;109;1;81;0 +WireConnection;97;0;103;0 +WireConnection;97;1;82;0 +WireConnection;145;0;128;0 +WireConnection;144;0;145;0 +WireConnection;140;0;135;0 +WireConnection;122;0;108;0 +WireConnection;122;1;123;0 +WireConnection;132;0;140;0 +WireConnection;132;1;81;0 +WireConnection;2;0;3;0 +WireConnection;2;1;22;0 +WireConnection;161;0;154;0 +WireConnection;161;1;155;0 +WireConnection;157;1;161;0 +WireConnection;128;0;126;0 +WireConnection;15;0;14;0 +WireConnection;15;1;83;0 +WireConnection;46;0;68;0 +WireConnection;46;1;48;0 +WireConnection;72;1;50;0 +WireConnection;72;0;69;0 +WireConnection;149;0;148;0 +WireConnection;149;1;34;0 +WireConnection;149;2;150;0 +WireConnection;152;0;82;0 +WireConnection;153;0;81;0 +WireConnection;156;0;157;0 +WireConnection;148;0;3;0 +WireConnection;148;1;156;0 +WireConnection;20;0;16;0 +WireConnection;20;1;19;0 +WireConnection;80;0;141;0 +WireConnection;23;0;20;0 +WireConnection;23;1;26;0 +WireConnection;23;2;24;0 +WireConnection;23;3;29;0 +WireConnection;13;0;11;0 +WireConnection;4;0;1;0 +WireConnection;4;1;2;0 +WireConnection;4;2;78;0 +WireConnection;26;0;78;0 +WireConnection;69;0;50;0 +WireConnection;69;1;10;3 +WireConnection;47;1;52;0 +WireConnection;47;10;51;4 +WireConnection;52;0;46;0 +WireConnection;52;1;72;0 +WireConnection;1;0;3;0 +WireConnection;1;1;21;0 +WireConnection;146;2;11;0 +WireConnection;146;3;147;0 +WireConnection;11;0;12;0 +WireConnection;11;1;34;0 +WireConnection;11;2;4;0 +WireConnection;126;0;98;0 +WireConnection;64;0;65;0 +WireConnection;64;1;10;2 +WireConnection;68;10;64;0 +WireConnection;78;0;144;0 +WireConnection;164;0;173;0 +WireConnection;164;2;11;0 +WireConnection;164;3;173;0 +WireConnection;164;4;173;0 +WireConnection;164;5;173;0 +ASEEND*/ +//CHKSM=4D86F0FC2CBB5B4FB3842556164E844DCE2BFAEE \ No newline at end of file diff --git a/Assets/SLZShaders/VR_MotionVectorOpaque.shader.meta b/Assets/SLZShaders/VR_MotionVectorOpaque.shader.meta new file mode 100644 index 0000000..d4f2534 --- /dev/null +++ b/Assets/SLZShaders/VR_MotionVectorOpaque.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 24617ef4b8ecbe74984e0955867cffd4 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SLZShaders/VR_particleMotionVector_nonAmp.shader b/Assets/SLZShaders/VR_particleMotionVector_nonAmp.shader new file mode 100644 index 0000000..95fde4b --- /dev/null +++ b/Assets/SLZShaders/VR_particleMotionVector_nonAmp.shader @@ -0,0 +1,819 @@ +Shader "SLZ/Particle/Motion Vector Billboard Correct Shadows" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + _EmissionColor("Emission Color", Color) = (0,0,0,0) + [NoScaleOffset]_MainTex("Main Texture", 2D) = "white" {} + [NoScaleOffset]_EmissionMap("Emission Texture", 2D) = "white" {} + + [NoScaleOffset]_MotionVectors("Motion Vectors", 2D) = "white" {} + _UVMotionMultiplier("UV Motion Multiplier", Float) = 0 + _Color("Color", Color) = (1,1,1,1) + [Toggle(_BRDFMAP)] BRDFMAP("Enable BRDF map", Float) = 0 + [NoScaleOffset]g_tBRDFMap("BRDF map", 2D) = "white" {} + _Depth("Depth", Float) = 0 + [ASEEnd][Toggle(_SCALEDEPTHDITHER_ON)] _ScaleDepthDither("Scale Depth Dither", Float) = 0 + [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0 + [HideInInspector]_QueueControl("_QueueControl", Float) = -1 + [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} + [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} + + + } + + SubShader + { + LOD 0 + Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Transparent" "Queue"="Transparent" } + Cull Back + ZWrite Off + ZTest LEqual + Offset 0 , 0 + AlphaToMask Off + + HLSLINCLUDE + #pragma target 3.0 + + #pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + #pragma multi_compile + + ENDHLSL + + + Pass + { + + Name "Forward" + Tags { "LightMode"="UniversalForward" } + + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + ColorMask RGBA + + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + //#pragma multi_compile _ LOD_FADE_CROSSFADE + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_ABSOLUTE_VERTEX_POS 1 + #define ASE_SRP_VERSION 120102 + + + // #pragma multi_compile _ _SCREEN_SPACE_OCCLUSION + #define _DISABLE_LIGHTMAPS + #define _DISABLE_REFLECTIONPROBES + #define _DISABLE_SSAO + #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DefaultLitVariants.hlsl" + + #pragma vertex vert + #pragma fragment frag + + #define SHADERPASS SHADERPASS_FORWARD + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + //#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Include/Particle/billboard.hlsl" + #define ASE_NEEDS_VERT_POSITION + #define ASE_NEEDS_VERT_NORMAL + #define ASE_NEEDS_FRAG_COLOR + #define ASE_NEEDS_FRAG_SCREEN_POSITION + #pragma shader_feature_local _SCALEDEPTHDITHER_ON + #pragma shader_feature_local_fragment _BRDFMAP + + #ifndef SHADER_API_MOBILE + #define ASE_DEPTH_WRITE_ON + #endif + + struct VertexInput + { + float4 vertex : POSITION; + half3 normal : NORMAL; + half4 tangent : TANGENT; + float4 texcoord : TEXCOORD0; //uv, uv2 + float4 texcoord1 : TEXCOORD1; //anim blend, anim frame, center.xy + float texcoord2 : TEXCOORD2; //center.z + half4 vColor : COLOR; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + half4 vColor : COLOR; + half4 uv01 : TEXCOORD0; + half3 SH : TEXCOORD1; + half4 fog_x_vLight_rgb : TEXCOORD2; + half4 wNormal_xyz_animBlend_x : TEXCOORD3; + float3 wPos : TEXCOORD4; + float4 pCenter_xyz_animFrame_x : TEXCOORD5; + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD6; + #endif + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD7; + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float2 dynamicLightmapUV : TEXCOORD8; + #endif + + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + float4 _EmissionColor; + float _UVMotionMultiplier; + float _Depth; + + CBUFFER_END + Texture2D _MainTex; SamplerState sampler_MainTex; + Texture2D _EmissionMap; SamplerState sampler_EmissionMap; + Texture2D _MotionVectors; SamplerState sampler_MotionVectors; + TEXTURE2D_ARRAY(_SLZ_DitherTex2D); + int NoisePixels; + int _SLZ_TexSel; + int NoiseArraySize; + SAMPLER(sampler_SLZ_DitherTex2D); + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + + float3 particleCenter = float3(v.texcoord1.z , v.texcoord1.w , v.texcoord2.x); + v.vertex.xyz = particle_face_camera(v.vertex.xyz , v.normal, particleCenter); + + o.vColor = v.vColor; + o.uv01 = v.texcoord; + + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + float4 positionCS = TransformWorldToHClip( positionWS ); + + o.wPos = positionWS; + + VertexNormalInputs normalInput = GetVertexNormalInputs( v.normal, v.tangent ); + + o.wNormal_xyz_animBlend_x = half4(normalInput.normalWS.xyz, v.texcoord1.x); + o.pCenter_xyz_animFrame_x = float4(v.texcoord1.zw, v.texcoord2.x, v.texcoord1.y); + + #if defined(DYNAMICLIGHTMAP_ON) + o.dynamicLightmapUV.xy = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + + #if !defined(LIGHTMAP_ON) + OUTPUT_SH( normalInput.normalWS.xyz, o.SH.xyz ); + #endif + + half3 vertexLight = VertexLighting( positionWS, normalInput.normalWS ); + + #ifdef ASE_FOG + half fogFactor = ComputeFogFactor( positionCS.z ); + #else + half fogFactor = 0; + #endif + + o.fog_x_vLight_rgb = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = positionCS; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + + o.clipPos = positionCS; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(positionCS); + #endif + return o; + } + + + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag ( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + + half3 WorldNormal = normalize( IN.wNormal_xyz_animBlend_x.xyz); + + float3 WorldPosition = IN.wPos; + float3 WorldViewDirection = _WorldSpaceCameraPos.xyz - WorldPosition; + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 ScreenPos = IN.screenPos; + #endif + + + + WorldViewDirection = SafeNormalize( WorldViewDirection ); + + + + half animBlend = IN.wNormal_xyz_animBlend_x.w; + float animFrame = IN.pCenter_xyz_animFrame_x.w; + + float2 motionVectorOffset1 = (SAMPLE_TEXTURE2D( _MotionVectors, sampler_MotionVectors, IN.uv01.xy).rg - 0.5 ) * animBlend * -_UVMotionMultiplier; + float2 motionVectorOffset2 = (SAMPLE_TEXTURE2D( _MotionVectors, sampler_MotionVectors, IN.uv01.zw).rg - 0.5 ) * ( 1.0 - animBlend ) * _UVMotionMultiplier; + + float4 albedo = lerp( SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, IN.uv01.xy + motionVectorOffset1), + SAMPLE_TEXTURE2D( _MainTex, sampler_MainTex, IN.uv01.zw + motionVectorOffset2), animBlend); + albedo = IN.vColor * albedo * _Color; + + float4 emission = lerp( SAMPLE_TEXTURE2D( _EmissionMap, sampler_EmissionMap, IN.uv01.xy + motionVectorOffset1), + SAMPLE_TEXTURE2D( _EmissionMap, sampler_EmissionMap, IN.uv01.zw + motionVectorOffset2), animBlend); + + + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( ScreenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + + + #ifdef _SCALEDEPTHDITHER_ON + float staticSwitch72 = ( _Depth * IN.uv01.z ); + #else + float staticSwitch72 = _Depth; + #endif + float2 depthDitherUV = ase_grabScreenPosNorm.xy * _ScreenParams.xy / NoisePixels; + float depthDitherIndex = fmod((float)_SLZ_TexSel + floor((float)NoiseArraySize * animFrame) , (float)NoiseArraySize); + float clipOffset = (SAMPLE_TEXTURE2D_ARRAY( _SLZ_DitherTex2D, sampler_SLZ_DitherTex2D, depthDitherUV , depthDitherIndex).r - 0.5) * staticSwitch72; + float offsetClipW = ( IN.clipPos.w + clipOffset); + + float3 Albedo = albedo.rgb; + float3 Normal = float3(0, 0, 1); + float3 Emission = (emission*_EmissionColor).rgb; +#if 0 + float3 BakedEmission = 0; +#endif + float3 Specular = 0.5; + float Metallic = 0; + float Smoothness = 0.5; + float Occlusion = 1; + float Alpha = albedo.a; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + float3 BakedGI = 0; + float3 RefractionColor = 1; + float RefractionIndex = 1; + float3 Transmission = 1; + float3 Translucency = 1; + //#ifdef ASE_DEPTH_WRITE_ON + float DepthValue = ( ( 1.0 - ( offsetClipW * _ZBufferParams.w ) ) / ( offsetClipW * _ZBufferParams.z ) ); + //#endif + + #ifdef _CLEARCOAT + float CoatMask = 0; + float CoatSmoothness = 0; + #endif + + + #ifdef _ALPHATEST_ON + clip(Alpha - AlphaClipThreshold); + #endif + + + InputData inputData = (InputData)0; + inputData.positionWS = WorldPosition; + inputData.viewDirectionWS = WorldViewDirection; + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + inputData.shadowCoord = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + float depthZ = Linear01Depth(DepthValue, _ZBufferParams) * (_ProjectionParams.z - _ProjectionParams.y) + _ProjectionParams.y; + float3 shadowPos = WorldViewDirection * (depthZ / -(dot(WorldViewDirection, UNITY_MATRIX_V._m20_m21_m22))) + _WorldSpaceCameraPos; + inputData.shadowCoord = TransformWorldToShadowCoord(shadowPos); + #else + inputData.shadowCoord = float4(0, 0, 0, 0); + #endif + + #ifdef _NORMALMAP + #if _NORMAL_DROPOFF_TS + inputData.normalWS = TransformTangentToWorld(Normal, half3x3( WorldTangent, WorldBiTangent, WorldNormal )); + #elif _NORMAL_DROPOFF_OS + inputData.normalWS = TransformObjectToWorldNormal(Normal); + #elif _NORMAL_DROPOFF_WS + inputData.normalWS = Normal; + #endif + inputData.normalWS = NormalizeNormalPerPixel(inputData.normalWS); + #else + inputData.normalWS = WorldNormal; + #endif + + + + + #ifdef ASE_FOG + inputData.fogCoord = IN.fog_x_vLight_rgb.x; + #endif + + inputData.vertexLighting = IN.fog_x_vLight_rgb.yzw; + #if defined(ENABLE_TERRAIN_PERPIXEL_NORMAL) + float3 SH = SampleSH(inputData.normalWS.xyz); + #else + float3 SH = IN.SH.xyz; + #endif + + #if defined(DYNAMICLIGHTMAP_ON) + + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.SH.xyz, IN.dynamicLightmapUV.xy, IN.vertexSH, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI(IN.SH.xy, IN.dynamicLightmapUV.xy, IN.vertexSH , inputData.normalWS); + #endif + + #else + #ifdef LIGHTMAP_ON + float4 encodedGI = SAMPLE_GI_DIR(IN.SH.xy, IN.lightmapUVOrVertexSH.xyz, inputData.normalWS, Smoothness, WorldViewDirection); + inputData.bakedGI = encodedGI.rgb; + float BakedSpecular = encodedGI.w; + + #else + inputData.bakedGI = SAMPLE_GI(IN.SH.xy, IN.SH.xyz, inputData.normalWS); + #endif + #endif + + + + #ifdef _ASE_BAKEDGI + inputData.bakedGI = BakedGI; + #endif + + inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.clipPos); + inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUVOrVertexSH.xy); + + #if defined(DEBUG_DISPLAY) + #if defined(DYNAMICLIGHTMAP_ON) + inputData.dynamicLightmapUV = IN.dynamicLightmapUV.xy; + #endif + + #if defined(LIGHTMAP_ON) + inputData.staticLightmapUV = IN.lightmapUVOrVertexSH.xy; + #else + inputData.vertexSH = SH; + #endif + #endif + + SurfaceData surfaceData; + surfaceData.albedo = Albedo; + surfaceData.metallic = saturate(Metallic); + surfaceData.specular = Specular; + surfaceData.smoothness = saturate(Smoothness), + surfaceData.occlusion = Occlusion, + surfaceData.emission = Emission, + surfaceData.alpha = saturate(Alpha); + surfaceData.normalTS = Normal; + surfaceData.clearCoatMask = 0; + surfaceData.clearCoatSmoothness = 1; + + + #ifdef _CLEARCOAT + surfaceData.clearCoatMask = saturate(CoatMask); + surfaceData.clearCoatSmoothness = saturate(CoatSmoothness); + #endif + + #ifdef _DBUFFER + ApplyDecalToSurfaceData(IN.clipPos, surfaceData, inputData); + #endif + + half4 color = UniversalFragmentPBR( inputData, surfaceData); + + #ifdef LIGHTMAP_ON + float3 MetalSpec = lerp(kDieletricSpec.rgb, surfaceData.albedo , surfaceData.metallic); + color.rgb += BakedSpecular * surfaceData.occlusion * MetalSpec * inputData.bakedGI.rgb; + #endif + + #ifdef _TRANSMISSION_ASE + { + float shadow = _TransmissionShadow; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + half3 mainTransmission = max(0 , -dot(inputData.normalWS, mainLight.direction)) * mainAtten * Transmission; + color.rgb += Albedo * mainTransmission; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 transmission = max(0 , -dot(inputData.normalWS, light.direction)) * atten * Transmission; + color.rgb += Albedo * transmission; + } + #endif + } + #endif + + #ifdef _TRANSLUCENCY_ASE + { + float shadow = _TransShadow; + float normal = _TransNormal; + float scattering = _TransScattering; + float direct = _TransDirect; + float ambient = _TransAmbient; + float strength = _TransStrength; + + Light mainLight = GetMainLight( inputData.shadowCoord ); + float3 mainAtten = mainLight.color * mainLight.distanceAttenuation; + mainAtten = lerp( mainAtten, mainAtten * mainLight.shadowAttenuation, shadow ); + + half3 mainLightDir = mainLight.direction + inputData.normalWS * normal; + half mainVdotL = pow( saturate( dot( inputData.viewDirectionWS, -mainLightDir ) ), scattering ); + half3 mainTranslucency = mainAtten * ( mainVdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * mainTranslucency * strength; + + #ifdef _ADDITIONAL_LIGHTS + int transPixelLightCount = GetAdditionalLightsCount(); + for (int i = 0; i < transPixelLightCount; ++i) + { + Light light = GetAdditionalLight(i, inputData.positionWS); + float3 atten = light.color * light.distanceAttenuation; + atten = lerp( atten, atten * light.shadowAttenuation, shadow ); + + half3 lightDir = light.direction + inputData.normalWS * normal; + half VdotL = pow( saturate( dot( inputData.viewDirectionWS, -lightDir ) ), scattering ); + half3 translucency = atten * ( VdotL * direct + inputData.bakedGI * ambient ) * Translucency; + color.rgb += Albedo * translucency * strength; + } + #endif + } + #endif + + #ifdef _REFRACTION_ASE + float4 projScreenPos = ScreenPos / ScreenPos.w; + float3 refractionOffset = ( RefractionIndex - 1.0 ) * mul( UNITY_MATRIX_V, float4( WorldNormal,0 ) ).xyz * ( 1.0 - dot( WorldNormal, WorldViewDirection ) ); + projScreenPos.xy += refractionOffset.xy; + float3 refraction = SHADERGRAPH_SAMPLE_SCENE_COLOR( projScreenPos.xy ) * RefractionColor; + color.rgb = lerp( refraction, color.rgb, color.a ); + color.a = 1; + #endif + + #ifdef ASE_FINAL_COLOR_ALPHA_MULTIPLY + color.rgb *= color.a; + #endif + + #ifdef ASE_FOG + #ifdef TERRAIN_SPLAT_ADDPASS + color.rgb = MixFogColor(color.rgb, half3( 0, 0, 0 ), IN.fog_x_vLight_rgb.x ); + #else + color.rgb = MixFog(color.rgb, -inputData.viewDirectionWS, IN.fog_x_vLight_rgb.x); + #endif + #endif + + color = Volumetrics( color, inputData.positionWS); + + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + + return color; + } + + ENDHLSL + } + + + Pass + { + + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + + ZWrite On + ZTest LEqual + AlphaToMask Off + ColorMask 0 + + HLSLPROGRAM + + #define _NORMAL_DROPOFF_TS 1 + #pragma multi_compile_instancing + #pragma multi_compile_fog + #define ASE_FOG 1 + #pragma multi_compile_fragment _ _VOLUMETRICS_ENABLED + #define ASE_ABSOLUTE_VERTEX_POS 1 + #define ASE_SRP_VERSION 120102 + + + #pragma vertex vert + #pragma fragment frag + + #pragma multi_compile _ _CASTING_PUNCTUAL_LIGHT_SHADOW + + #define SHADERPASS SHADERPASS_SHADOWCASTER + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" + #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" + + #include "Include/Particle/billboard.hlsl" + #define ASE_NEEDS_VERT_POSITION + #define ASE_NEEDS_VERT_NORMAL + #pragma shader_feature_local _SCALEDEPTHDITHER_ON + + #ifndef SHADER_API_MOBILE + #define ASE_DEPTH_WRITE_ON + #endif + + + struct VertexInput + { + float4 vertex : POSITION; + float3 ase_normal : NORMAL; + float4 ase_texcoord1 : TEXCOORD1; + float4 ase_texcoord2 : TEXCOORD2; + float4 ase_color : COLOR; + float4 ase_texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 worldPos : TEXCOORD0; + #endif + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + float4 shadowCoord : TEXCOORD1; + #endif + float4 ase_color : COLOR; + float4 ase_texcoord2 : TEXCOORD2; + float4 ase_texcoord3 : TEXCOORD3; + float4 ase_texcoord4 : TEXCOORD4; + float4 ase_texcoord5 : TEXCOORD5; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + CBUFFER_START(UnityPerMaterial) + float4 _Color; + float _UVMotionMultiplier; + float _Depth; + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + CBUFFER_END + sampler2D _MainTex; + sampler2D _MotionVectors; + TEXTURE2D_ARRAY(_SLZ_DitherTex2D); + int NoisePixels; + int _SLZ_TexSel; + int NoiseArraySize; + SAMPLER(sampler_SLZ_DitherTex2D); + + + inline float4 ASE_ComputeGrabScreenPos( float4 pos ) + { + #if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; + #else + float scale = 1.0; + #endif + float4 o = pos; + o.y = pos.w * 0.5f; + o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y; + return o; + } + + + float3 _LightDirection; + float3 _LightPosition; + + VertexOutput VertexFunction( VertexInput v ) + { + VertexOutput o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + + float4 vertex84 = float4( v.vertex.xyz , 0.0 ); + float3 normal84 = v.ase_normal; + float3 tangent84 = float3( 0,0,0 ); + float3 appendResult88 = (float3(v.ase_texcoord1.z , v.ase_texcoord1.w , v.ase_texcoord2.x)); + float3 center84 = appendResult88; + float3 localparticle_face_camera84 = particle_face_camera( vertex84 , normal84, center84 ); + + float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz); + float4 screenPos = ComputeScreenPos(ase_clipPos); + o.ase_texcoord5 = screenPos; + + o.ase_color = v.ase_color; + o.ase_texcoord2 = v.ase_texcoord; + o.ase_texcoord3 = v.ase_texcoord1; + o.ase_texcoord4 = v.vertex; + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = localparticle_face_camera84; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + + v.ase_normal = normal84; + + float3 positionWS = TransformObjectToWorld( v.vertex.xyz ); + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + o.worldPos = positionWS; + #endif + float3 normalWS = TransformObjectToWorldDir(v.ase_normal); + + + #if _CASTING_PUNCTUAL_LIGHT_SHADOW + float3 lightDirectionWS = normalize(_LightPosition - positionWS); + #else + float3 lightDirectionWS = _LightDirection; + #endif + + float4 clipPos = ApplySLZShadowBias(positionWS, normalWS, lightDirectionWS); + + #if UNITY_REVERSED_Z + clipPos.z = min(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #else + clipPos.z = max(clipPos.z, UNITY_NEAR_CLIP_VALUE); + #endif + + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + VertexPositionInputs vertexInput = (VertexPositionInputs)0; + vertexInput.positionWS = positionWS; + vertexInput.positionCS = clipPos; + o.shadowCoord = GetShadowCoord( vertexInput ); + #endif + o.clipPos = clipPos; + return o; + } + + VertexOutput vert ( VertexInput v ) + { + return VertexFunction( v ); + } + + + #if defined(ASE_EARLY_Z_DEPTH_OPTIMIZE) + #define ASE_SV_DEPTH SV_DepthLessEqual + #else + #define ASE_SV_DEPTH SV_Depth + #endif + + half4 frag( VertexOutput IN + #ifdef ASE_DEPTH_WRITE_ON + ,out float outputDepth : ASE_SV_DEPTH + #endif + ) : SV_TARGET + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + #if defined(ASE_NEEDS_FRAG_WORLD_POSITION) + float3 WorldPosition = IN.worldPos; + #endif + float4 ShadowCoords = float4( 0, 0, 0, 0 ); + + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + ShadowCoords = IN.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + ShadowCoords = TransformWorldToShadowCoord( WorldPosition ); + #endif + #endif + + float2 temp_output_8_0 = (IN.ase_texcoord2).xy; + float4 temp_cast_1 = (0.5).xxxx; + float2 temp_output_9_0 = (IN.ase_texcoord2).zw; + float4 temp_cast_4 = (0.5).xxxx; + float4 lerpResult4 = lerp( tex2D( _MainTex, ( float4( temp_output_8_0, 0.0 , 0.0 ) + ( ( tex2D( _MotionVectors, temp_output_8_0 ) - temp_cast_1 ) * IN.ase_texcoord3.xyz.x * -_UVMotionMultiplier ) ).rg ) , tex2D( _MainTex, ( float4( temp_output_9_0, 0.0 , 0.0 ) + ( ( tex2D( _MotionVectors, temp_output_9_0 ) - temp_cast_4 ) * ( 1.0 - IN.ase_texcoord3.xyz.x ) * -1.0 * -_UVMotionMultiplier ) ).rg ) , IN.ase_texcoord3.xyz.x); + float4 temp_output_11_0 = ( IN.ase_color * lerpResult4 * _Color ); + + float4 unityObjectToClipPos92 = TransformWorldToHClip(TransformObjectToWorld(IN.ase_texcoord4.xyz)); + float4 screenPos = IN.ase_texcoord5; + float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos ); + float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w; + float4 temp_cast_8 = (0.5).xxxx; + #ifdef _SCALEDEPTHDITHER_ON + float staticSwitch72 = ( _Depth * IN.ase_texcoord3.xyz.z ); + #else + float staticSwitch72 = _Depth; + #endif + float temp_output_4_0_g44 = ( unityObjectToClipPos92.w + ( ( SAMPLE_TEXTURE2D_ARRAY( _SLZ_DitherTex2D, sampler_SLZ_DitherTex2D, ( (ase_grabScreenPosNorm).xy * ( (_ScreenParams).xy / NoisePixels ) ),(float)( ( _SLZ_TexSel + (int)( NoiseArraySize * IN.ase_texcoord3.xyz.y ) ) % NoiseArraySize ) ) - temp_cast_8 ) * staticSwitch72 ).r ); + + float Alpha = (temp_output_11_0).a; + float AlphaClipThreshold = 0.5; + float AlphaClipThresholdShadow = 0.5; + #ifdef ASE_DEPTH_WRITE_ON + float DepthValue = ( ( 1.0 - ( temp_output_4_0_g44 * _ZBufferParams.w ) ) / ( temp_output_4_0_g44 * _ZBufferParams.z ) ); + #endif + + #ifdef _ALPHATEST_ON + #ifdef _ALPHATEST_SHADOW_ON + clip(Alpha - AlphaClipThresholdShadow); + #else + clip(Alpha - AlphaClipThreshold); + #endif + #endif + + #ifdef LOD_FADE_CROSSFADE + LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x ); + #endif + + #ifdef ASE_DEPTH_WRITE_ON + outputDepth = DepthValue; + #endif + return 0; + } + + ENDHLSL + } + + + } + + CustomEditor "UnityEditor.ShaderGraphLitGUI" + Fallback "Hidden/InternalErrorShader" + +} diff --git a/Assets/SLZShaders/VR_particleMotionVector_nonAmp.shader.meta b/Assets/SLZShaders/VR_particleMotionVector_nonAmp.shader.meta new file mode 100644 index 0000000..0d1ee30 --- /dev/null +++ b/Assets/SLZShaders/VR_particleMotionVector_nonAmp.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a0cae63ef60b7da4f9cb90b8cdb4ce4e +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UniversalRenderPipelineGlobalSettings.asset b/Assets/UniversalRenderPipelineGlobalSettings.asset new file mode 100644 index 0000000..a996a2e --- /dev/null +++ b/Assets/UniversalRenderPipelineGlobalSettings.asset @@ -0,0 +1,27 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2ec995e51a6e251468d2a3fd8a686257, type: 3} + m_Name: UniversalRenderPipelineGlobalSettings + m_EditorClassIdentifier: + k_AssetVersion: 2 + lightLayerName0: Light Layer default + lightLayerName1: Light Layer 1 + lightLayerName2: Light Layer 2 + lightLayerName3: Light Layer 3 + lightLayerName4: Light Layer 4 + lightLayerName5: Light Layer 5 + lightLayerName6: Light Layer 6 + lightLayerName7: Light Layer 7 + m_StripDebugVariants: 1 + m_StripUnusedPostProcessingVariants: 0 + m_StripUnusedVariants: 1 + supportRuntimeDebugDisplay: 0 diff --git a/Assets/UniversalRenderPipelineGlobalSettings.asset.meta b/Assets/UniversalRenderPipelineGlobalSettings.asset.meta new file mode 100644 index 0000000..c885a62 --- /dev/null +++ b/Assets/UniversalRenderPipelineGlobalSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7854839073f855740851081b9422a1bf +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR.meta b/Assets/XR.meta new file mode 100644 index 0000000..525e8f6 --- /dev/null +++ b/Assets/XR.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d8699a9a7abaeb84eb5bc4e4284e4b1d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Loaders.meta b/Assets/XR/Loaders.meta new file mode 100644 index 0000000..9005696 --- /dev/null +++ b/Assets/XR/Loaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 79882b36869a70e4c9d0a6062c840f4f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Loaders/Mock HMD Loader.asset b/Assets/XR/Loaders/Mock HMD Loader.asset new file mode 100644 index 0000000..f7b4662 --- /dev/null +++ b/Assets/XR/Loaders/Mock HMD Loader.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0660e8fc444734757ae6f6c40c2d33a0, type: 3} + m_Name: Mock HMD Loader + m_EditorClassIdentifier: diff --git a/Assets/XR/Loaders/Mock HMD Loader.asset.meta b/Assets/XR/Loaders/Mock HMD Loader.asset.meta new file mode 100644 index 0000000..cd7fa28 --- /dev/null +++ b/Assets/XR/Loaders/Mock HMD Loader.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 94c1c13e0ca307641a112478f1e86489 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Loaders/Oculus Loader.asset b/Assets/XR/Loaders/Oculus Loader.asset new file mode 100644 index 0000000..0f89c61 --- /dev/null +++ b/Assets/XR/Loaders/Oculus Loader.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 03bc68f14d65e7747a59d5ff74bd199b, type: 3} + m_Name: Oculus Loader + m_EditorClassIdentifier: diff --git a/Assets/XR/Loaders/Oculus Loader.asset.meta b/Assets/XR/Loaders/Oculus Loader.asset.meta new file mode 100644 index 0000000..032839a --- /dev/null +++ b/Assets/XR/Loaders/Oculus Loader.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 42bf042a97611234f8a0eee870b1a8bd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Settings.meta b/Assets/XR/Settings.meta new file mode 100644 index 0000000..a2cbfc2 --- /dev/null +++ b/Assets/XR/Settings.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b417fca445d008e468f7d432454f9acb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Settings/Mock HMD Build Settings.asset b/Assets/XR/Settings/Mock HMD Build Settings.asset new file mode 100644 index 0000000..5cd2a32 --- /dev/null +++ b/Assets/XR/Settings/Mock HMD Build Settings.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c8bf066bf8a4947a1be502d267edb82f, type: 3} + m_Name: Mock HMD Build Settings + m_EditorClassIdentifier: + renderMode: 0 diff --git a/Assets/XR/Settings/Mock HMD Build Settings.asset.meta b/Assets/XR/Settings/Mock HMD Build Settings.asset.meta new file mode 100644 index 0000000..bfd7d65 --- /dev/null +++ b/Assets/XR/Settings/Mock HMD Build Settings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b2a4c4ca45f66ab46b68acaf4c7d7cc7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/XR/Settings/Oculus Settings.asset b/Assets/XR/Settings/Oculus Settings.asset new file mode 100644 index 0000000..e8e1556 --- /dev/null +++ b/Assets/XR/Settings/Oculus Settings.asset @@ -0,0 +1,32 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c353a8f1e58cf884584123914fe63cd5, type: 3} + m_Name: Oculus Settings + m_EditorClassIdentifier: + m_StereoRenderingModeDesktop: 1 + m_StereoRenderingModeAndroid: 2 + SharedDepthBuffer: 1 + DepthSubmission: 0 + DashSupport: 1 + LowOverheadMode: 0 + OptimizeBufferDiscards: 1 + PhaseSync: 0 + SymmetricProjection: 1 + SubsampledLayout: 0 + FoveatedRenderingMethod: 0 + LateLatching: 0 + LateLatchingDebug: 0 + EnableTrackingOriginStageMode: 0 + SpaceWarp: 0 + TargetQuest2: 1 + TargetQuestPro: 0 + SystemSplashScreen: {fileID: 0} diff --git a/Assets/XR/Settings/Oculus Settings.asset.meta b/Assets/XR/Settings/Oculus Settings.asset.meta new file mode 100644 index 0000000..000b70d --- /dev/null +++ b/Assets/XR/Settings/Oculus Settings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a0dfbe9a305809e40aa18a1190f5bfd6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_MarrowAssets.meta b/Assets/_MarrowAssets.meta new file mode 100644 index 0000000..4d12b2c --- /dev/null +++ b/Assets/_MarrowAssets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d0b7f6fdbb1e914eba5a6e9d497cded +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_MarrowAssets/Settings.meta b/Assets/_MarrowAssets/Settings.meta new file mode 100644 index 0000000..6addfef --- /dev/null +++ b/Assets/_MarrowAssets/Settings.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ecc6abee2b2a57e4896f8052a7b49b97 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_MarrowAssets/Settings/TextureStreamSettings.asset b/Assets/_MarrowAssets/Settings/TextureStreamSettings.asset new file mode 100644 index 0000000..6e53644 --- /dev/null +++ b/Assets/_MarrowAssets/Settings/TextureStreamSettings.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c5a52cb3bad3437c9362b8e7e9cd9423, type: 3} + m_Name: TextureStreamSettings + m_EditorClassIdentifier: + textureStreamingPreventionGuidsList: [] diff --git a/Assets/_MarrowAssets/Settings/TextureStreamSettings.asset.meta b/Assets/_MarrowAssets/Settings/TextureStreamSettings.asset.meta new file mode 100644 index 0000000..2052975 --- /dev/null +++ b/Assets/_MarrowAssets/Settings/TextureStreamSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 16b8630143bcfc74c898426ff996bb86 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/ShaderGraphSettings.asset b/ProjectSettings/ShaderGraphSettings.asset new file mode 100644 index 0000000..9b28428 --- /dev/null +++ b/ProjectSettings/ShaderGraphSettings.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: de02f9e1d18f588468e474319d09a723, type: 3} + m_Name: + m_EditorClassIdentifier: + customInterpolatorErrorThreshold: 32 + customInterpolatorWarningThreshold: 16 diff --git a/ProjectSettings/TimelineSettings.asset b/ProjectSettings/TimelineSettings.asset new file mode 100644 index 0000000..cfaebd7 --- /dev/null +++ b/ProjectSettings/TimelineSettings.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a287be6c49135cd4f9b2b8666c39d999, type: 3} + m_Name: + m_EditorClassIdentifier: + assetDefaultFramerate: 60 + m_DefaultFrameRate: 60 diff --git a/ProjectSettings/URPProjectSettings.asset b/ProjectSettings/URPProjectSettings.asset new file mode 100644 index 0000000..c1f118a --- /dev/null +++ b/ProjectSettings/URPProjectSettings.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 247994e1f5a72c2419c26a37e9334c01, type: 3} + m_Name: + m_EditorClassIdentifier: + m_LastMaterialVersion: 5 diff --git a/ProjectSettings/XRPackageSettings.asset b/ProjectSettings/XRPackageSettings.asset new file mode 100644 index 0000000..7e791e1 --- /dev/null +++ b/ProjectSettings/XRPackageSettings.asset @@ -0,0 +1,5 @@ +{ + "m_Settings": [ + "RemoveLegacyInputHelpersForReload" + ] +} \ No newline at end of file