#ifndef UNIVERSAL_TERRAIN_LIT_INPUT_INCLUDED #define UNIVERSAL_TERRAIN_LIT_INPUT_INCLUDED #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DebugMipmapStreamingMacros.hlsl" CBUFFER_START(UnityPerMaterial) float4 _MainTex_ST; half4 _BaseColor; half _Cutoff; UNITY_TEXTURE_STREAMING_DEBUG_VARS_FOR_TEX(_Control); float4 _Splat0_TexelSize, _Splat1_TexelSize, _Splat2_TexelSize, _Splat3_TexelSize; UNITY_TEXTURE_STREAMING_DEBUG_VARS_FOR_TEX(_Splat0); UNITY_TEXTURE_STREAMING_DEBUG_VARS_FOR_TEX(_Splat1); UNITY_TEXTURE_STREAMING_DEBUG_VARS_FOR_TEX(_Splat2); UNITY_TEXTURE_STREAMING_DEBUG_VARS_FOR_TEX(_Splat3); CBUFFER_END #define _Surface 0.0 // Terrain is always opaque CBUFFER_START(_Terrain) half _NormalScale0, _NormalScale1, _NormalScale2, _NormalScale3; half _Metallic0, _Metallic1, _Metallic2, _Metallic3; half _Smoothness0, _Smoothness1, _Smoothness2, _Smoothness3; half4 _DiffuseRemapScale0, _DiffuseRemapScale1, _DiffuseRemapScale2, _DiffuseRemapScale3; half4 _MaskMapRemapOffset0, _MaskMapRemapOffset1, _MaskMapRemapOffset2, _MaskMapRemapOffset3; half4 _MaskMapRemapScale0, _MaskMapRemapScale1, _MaskMapRemapScale2, _MaskMapRemapScale3; float4 _Control_ST; float4 _Control_TexelSize; half _DiffuseHasAlpha0, _DiffuseHasAlpha1, _DiffuseHasAlpha2, _DiffuseHasAlpha3; half _LayerHasMask0, _LayerHasMask1, _LayerHasMask2, _LayerHasMask3; half4 _Splat0_ST, _Splat1_ST, _Splat2_ST, _Splat3_ST; half _HeightTransition; half _NumLayersCount; #ifdef UNITY_INSTANCING_ENABLED float4 _TerrainHeightmapRecipSize; // float4(1.0f/width, 1.0f/height, 1.0f/(width-1), 1.0f/(height-1)) float4 _TerrainHeightmapScale; // float4(hmScale.x, hmScale.y / (float)(kMaxHeight), hmScale.z, 0.0f) #endif #ifdef SCENESELECTIONPASS int _ObjectId; int _PassValue; #endif CBUFFER_END TEXTURE2D(_Control); SAMPLER(sampler_Control); TEXTURE2D(_Splat0); SAMPLER(sampler_Splat0); TEXTURE2D(_Splat1); TEXTURE2D(_Splat2); TEXTURE2D(_Splat3); #ifdef _NORMALMAP TEXTURE2D(_Normal0); SAMPLER(sampler_Normal0); TEXTURE2D(_Normal1); TEXTURE2D(_Normal2); TEXTURE2D(_Normal3); #endif #ifdef _MASKMAP TEXTURE2D(_Mask0); SAMPLER(sampler_Mask0); TEXTURE2D(_Mask1); TEXTURE2D(_Mask2); TEXTURE2D(_Mask3); #endif TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex); TEXTURE2D(_SpecGlossMap); SAMPLER(sampler_SpecGlossMap); TEXTURE2D(_MetallicTex); SAMPLER(sampler_MetallicTex); #if defined(UNITY_INSTANCING_ENABLED) && defined(_TERRAIN_INSTANCED_PERPIXEL_NORMAL) #define ENABLE_TERRAIN_PERPIXEL_NORMAL #endif #ifdef UNITY_INSTANCING_ENABLED TEXTURE2D(_TerrainHeightmapTexture); TEXTURE2D(_TerrainNormalmapTexture); SAMPLER(sampler_TerrainNormalmapTexture); #endif UNITY_INSTANCING_BUFFER_START(Terrain) UNITY_DEFINE_INSTANCED_PROP(float4, _TerrainPatchInstanceData) // float4(xBase, yBase, skipScale, ~) UNITY_INSTANCING_BUFFER_END(Terrain) #ifdef _ALPHATEST_ON TEXTURE2D(_TerrainHolesTexture); SAMPLER(sampler_TerrainHolesTexture); void ClipHoles(float2 uv) { float hole = SAMPLE_TEXTURE2D(_TerrainHolesTexture, sampler_TerrainHolesTexture, uv).r; // Fixes bug where compression is enabled and 0 isn't actually 0 but low like 1/2047. (UUM-61913) float epsilon = 0.0005f; clip(hole < epsilon ? -1 : 1); } #endif half4 SampleMetallicSpecGloss(float2 uv, half albedoAlpha) { half4 specGloss; specGloss = SAMPLE_TEXTURE2D(_MetallicTex, sampler_MetallicTex, uv); specGloss.a = albedoAlpha; return specGloss; } inline void InitializeStandardLitSurfaceData(float2 uv, out SurfaceData outSurfaceData) { outSurfaceData = (SurfaceData)0; half4 albedoSmoothness = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv); outSurfaceData.alpha = 1; half4 specGloss = SampleMetallicSpecGloss(uv, albedoSmoothness.a); outSurfaceData.albedo = albedoSmoothness.rgb; outSurfaceData.metallic = specGloss.r; outSurfaceData.specular = half3(0.0h, 0.0h, 0.0h); outSurfaceData.smoothness = specGloss.a; outSurfaceData.normalTS = SampleNormal(uv, TEXTURE2D_ARGS(_BumpMap, sampler_BumpMap)); outSurfaceData.occlusion = 1; outSurfaceData.emission = 0; } void TerrainInstancing(inout float4 positionOS, inout float3 normal, inout float2 uv) { #ifdef UNITY_INSTANCING_ENABLED float2 patchVertex = positionOS.xy; float4 instanceData = UNITY_ACCESS_INSTANCED_PROP(Terrain, _TerrainPatchInstanceData); float2 sampleCoords = (patchVertex.xy + instanceData.xy) * instanceData.z; // (xy + float2(xBase,yBase)) * skipScale float height = UnpackHeightmap(_TerrainHeightmapTexture.Load(int3(sampleCoords, 0))); positionOS.xz = sampleCoords * _TerrainHeightmapScale.xz; positionOS.y = height * _TerrainHeightmapScale.y; #ifdef ENABLE_TERRAIN_PERPIXEL_NORMAL normal = float3(0, 1, 0); #else normal = _TerrainNormalmapTexture.Load(int3(sampleCoords, 0)).rgb * 2 - 1; #endif uv = sampleCoords * _TerrainHeightmapRecipSize.zw; #endif } void TerrainInstancing(inout float4 positionOS, inout float3 normal) { float2 uv = { 0, 0 }; TerrainInstancing(positionOS, normal, uv); } #endif