You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
4.7 KiB
145 lines
4.7 KiB
#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" |
|
|
|
CBUFFER_START(UnityPerMaterial) |
|
float4 _MainTex_ST; |
|
half4 _BaseColor; |
|
half _Cutoff; |
|
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; |
|
clip(hole == 0.0f ? -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
|
|
|