Lux URP Lit Extended Inputs.hlsl 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. #ifndef LIGHTWEIGHT_LIT_INPUT_INCLUDED
  2. #define LIGHTWEIGHT_LIT_INPUT_INCLUDED
  3. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
  4. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl"
  5. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl"
  6. // Extended CBUFFER
  7. CBUFFER_START(UnityPerMaterial)
  8. float4 _BaseMap_ST;
  9. half4 _BaseColor;
  10. half4 _SpecColor;
  11. half4 _EmissionColor;
  12. half _Cutoff;
  13. half _Smoothness;
  14. half _Metallic;
  15. half _BumpScale;
  16. half _OcclusionStrength;
  17. half4 _RimColor;
  18. half _RimPower;
  19. half _RimMinPower;
  20. half _RimFrequency;
  21. half _RimPerPositionFrequency;
  22. #if defined(_UBER)
  23. half _Parallax;
  24. half _ScreenSpaceVariance;
  25. half _SAAThreshold;
  26. half _GItoAO;
  27. half _GItoAOBias;
  28. half _HorizonOcclusion;
  29. float _CameraFadeDist;
  30. float _CameraShadowFadeDist;
  31. float4 _DetailAlbedoMap_ST;
  32. half _DetailAlbedoMapScale;
  33. half _DetailNormalMapScale;
  34. #endif
  35. float _Surface;
  36. CBUFFER_END
  37. TEXTURE2D(_OcclusionMap); SAMPLER(sampler_OcclusionMap);
  38. TEXTURE2D(_MetallicGlossMap); SAMPLER(sampler_MetallicGlossMap);
  39. TEXTURE2D(_SpecGlossMap); SAMPLER(sampler_SpecGlossMap);
  40. TEXTURE2D(_BentNormalMap); SAMPLER(sampler_BentNormalMap);
  41. #if defined(_PARALLAX) || defined(_PARALLAXSHADOWS)
  42. TEXTURE2D(_HeightMap); SAMPLER(sampler_HeightMap);
  43. #endif
  44. #if defined(_DETAIL)
  45. TEXTURE2D(_DetailMask); SAMPLER(sampler_DetailMask);
  46. TEXTURE2D(_DetailAlbedoMap); SAMPLER(sampler_DetailAlbedoMap);
  47. TEXTURE2D(_DetailNormalMap); SAMPLER(sampler_DetailNormalMap);
  48. #endif
  49. #ifdef _SPECULAR_SETUP
  50. #define SAMPLE_METALLICSPECULAR(uv) SAMPLE_TEXTURE2D(_SpecGlossMap, sampler_SpecGlossMap, uv)
  51. #else
  52. #define SAMPLE_METALLICSPECULAR(uv) SAMPLE_TEXTURE2D(_MetallicGlossMap, sampler_MetallicGlossMap, uv)
  53. #endif
  54. // Used by shadow caster and depth pass (parallax only)
  55. struct VertexInput
  56. {
  57. float3 positionOS : POSITION;
  58. float3 normalOS : NORMAL;
  59. float4 tangentOS : TANGENT;
  60. float2 texcoord : TEXCOORD0;
  61. UNITY_VERTEX_INPUT_INSTANCE_ID
  62. };
  63. struct VertexOutput
  64. {
  65. float4 positionCS : SV_POSITION;
  66. float2 uv : TEXCOORD0;
  67. float3 normalWS : TEXCOORD1;
  68. #if defined(_ALPHATEST_ON)
  69. // We have to use the same inputs...
  70. float4 tangentWS : TEXCOORD2;
  71. float screenPos : TEXCOORD3; // was float4
  72. #endif
  73. float3 viewDirWS : TEXCOORD5;
  74. UNITY_VERTEX_INPUT_INSTANCE_ID
  75. UNITY_VERTEX_OUTPUT_STEREO
  76. };
  77. half4 SampleMetallicSpecGloss(float2 uv, half albedoAlpha)
  78. {
  79. half4 specGloss;
  80. #ifdef _METALLICSPECGLOSSMAP
  81. specGloss = SAMPLE_METALLICSPECULAR(uv);
  82. #ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
  83. specGloss.a = albedoAlpha * _Smoothness;
  84. #else
  85. specGloss.a *= _Smoothness;
  86. #endif
  87. #else // _METALLICSPECGLOSSMAP
  88. #if _SPECULAR_SETUP
  89. specGloss.rgb = _SpecColor.rgb;
  90. #else
  91. specGloss.rgb = _Metallic.rrr;
  92. #endif
  93. #ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
  94. specGloss.a = albedoAlpha * _Smoothness;
  95. #else
  96. specGloss.a = _Smoothness;
  97. #endif
  98. #endif
  99. return specGloss;
  100. }
  101. half SampleOcclusion(float2 uv)
  102. {
  103. #ifdef _OCCLUSIONMAP
  104. // TODO: Controls things like these by exposing SHADER_QUALITY levels (low, medium, high)
  105. #if defined(SHADER_API_GLES)
  106. return SAMPLE_TEXTURE2D(_OcclusionMap, sampler_OcclusionMap, uv).g;
  107. #else
  108. half occ = SAMPLE_TEXTURE2D(_OcclusionMap, sampler_OcclusionMap, uv).g;
  109. return LerpWhiteTo(occ, _OcclusionStrength);
  110. #endif
  111. #else
  112. return 1.0;
  113. #endif
  114. }
  115. half3 SampleNormalExtended(float2 uv, TEXTURE2D_PARAM(bumpMap, sampler_bumpMap), half scale = 1.0h)
  116. {
  117. #if defined (_NORMALMAP) || defined (_BENTNORMAL)
  118. half4 n = SAMPLE_TEXTURE2D(bumpMap, sampler_bumpMap, uv);
  119. #if BUMP_SCALE_NOT_SUPPORTED
  120. return UnpackNormal(n);
  121. #else
  122. return UnpackNormalScale(n, scale);
  123. #endif
  124. #else
  125. return half3(0.0h, 0.0h, 1.0h);
  126. #endif
  127. }
  128. float Dither17(float2 Pos, float frameIndexMod4) {
  129. uint3 k0 = uint3(2, 7, 23);
  130. float Ret = dot( float3(Pos.xy, frameIndexMod4 + 0.5f), k0 / 17.0f);
  131. return frac(Ret);
  132. }
  133. float Dither32(float2 Pos, float frameIndexMod4) {
  134. uint3 k0 = uint3(13, 5, 15);
  135. //float Ret = dot( float3(Pos.xy, frameIndexMod4 + 0.5f), k0 / 32.0f);
  136. float Ret = dot( float3(Pos.xy, 0.5f), k0 / 32.0f);
  137. return frac(Ret);
  138. }
  139. float Dither64(float2 Pos, float frameIndexMod4) {
  140. uint3 k0 = uint3(33, 52, 25);
  141. //float Ret = dot( float3(Pos.xy, frameIndexMod4 + 0.5f), k0 / 32.0f);
  142. float Ret = dot( float3(Pos.xy, 1.0f), k0 / 64.0f);
  143. return frac(Ret);
  144. }
  145. float Dither5(float2 Pos, float frameIndexMod4) {
  146. float Dither = frac((Pos.x + Pos.y * 2 - 1.5 + frameIndexMod4) / 5 );
  147. float Noise = frac( dot( float2(171.0f, 231.0f) / 71, Pos.xy) );
  148. Dither = (Dither * 5 + Noise) * (1.0 / 6.0) - 0.5;
  149. return Dither;
  150. }
  151. inline void InitializeStandardLitSurfaceData(float2 uv, out SurfaceData outSurfaceData)
  152. {
  153. half4 albedoAlpha = SampleAlbedoAlpha(uv, TEXTURE2D_ARGS(_BaseMap, sampler_BaseMap));
  154. outSurfaceData.alpha = Alpha(albedoAlpha.a, _BaseColor, _Cutoff);
  155. half4 specGloss = SampleMetallicSpecGloss(uv, albedoAlpha.a);
  156. outSurfaceData.albedo = albedoAlpha.rgb * _BaseColor.rgb;
  157. #if _SPECULAR_SETUP
  158. outSurfaceData.metallic = 1.0h;
  159. outSurfaceData.specular = specGloss.rgb;
  160. #else
  161. outSurfaceData.metallic = specGloss.r;
  162. outSurfaceData.specular = half3(0.0h, 0.0h, 0.0h);
  163. #endif
  164. outSurfaceData.smoothness = specGloss.a;
  165. outSurfaceData.normalTS = SampleNormal(uv, TEXTURE2D_ARGS(_BumpMap, sampler_BumpMap), _BumpScale);
  166. outSurfaceData.occlusion = SampleOcclusion(uv);
  167. outSurfaceData.emission = SampleEmission(uv, _EmissionColor.rgb, TEXTURE2D_ARGS(_EmissionMap, sampler_EmissionMap));
  168. outSurfaceData.clearCoatMask = 0;
  169. outSurfaceData.clearCoatSmoothness = 0;
  170. }
  171. #if defined(_UBER)
  172. inline void InitializeStandardLitSurfaceDataUber(float2 uv, half3 viewDirTS, out SurfaceData outSurfaceData)
  173. {
  174. #if defined(_PARALLAX)
  175. // Parallax
  176. float3 v = viewDirTS;
  177. v.z += 0.42;
  178. v.xy /= v.z;
  179. float halfParallax = _Parallax * 0.5f;
  180. float parallax = SAMPLE_TEXTURE2D(_HeightMap, sampler_HeightMap, uv).g * _Parallax - halfParallax;
  181. float2 offset1 = parallax * v.xy;
  182. // Calculate 2nd height
  183. parallax = SAMPLE_TEXTURE2D(_HeightMap, sampler_HeightMap, uv + offset1).g * _Parallax - halfParallax;
  184. float2 offset2 = parallax * v.xy;
  185. // Final UVs
  186. uv += (offset1 + offset2) * 0.5f;
  187. #endif
  188. // Default stuff
  189. half4 albedoAlpha = SampleAlbedoAlpha(uv, TEXTURE2D_ARGS(_BaseMap, sampler_BaseMap));
  190. outSurfaceData.alpha = Alpha(albedoAlpha.a, _BaseColor, _Cutoff);
  191. half4 specGloss = SampleMetallicSpecGloss(uv, albedoAlpha.a);
  192. outSurfaceData.albedo = albedoAlpha.rgb * _BaseColor.rgb;
  193. #if _SPECULAR_SETUP
  194. outSurfaceData.metallic = 1.0h;
  195. outSurfaceData.specular = specGloss.rgb;
  196. #else
  197. outSurfaceData.metallic = specGloss.r;
  198. outSurfaceData.specular = half3(0.0h, 0.0h, 0.0h);
  199. #endif
  200. outSurfaceData.smoothness = specGloss.a;
  201. #if defined(_SAMPLENORMAL)
  202. outSurfaceData.normalTS = SampleNormal(uv, TEXTURE2D_ARGS(_BumpMap, sampler_BumpMap), _BumpScale);
  203. #else
  204. outSurfaceData.normalTS = half3(0,0,1);
  205. #endif
  206. outSurfaceData.occlusion = SampleOcclusion(uv);
  207. #if defined (_EMISSION)
  208. outSurfaceData.emission = SampleEmission(uv, _EmissionColor.rgb, TEXTURE2D_ARGS(_EmissionMap, sampler_EmissionMap));
  209. #else
  210. outSurfaceData.emission = 0;
  211. #endif
  212. // Detail Texturing
  213. #if defined(_DETAIL)
  214. half detailMask = SAMPLE_TEXTURE2D(_DetailMask, sampler_DetailMask, uv).a;
  215. float2 detailUV = uv * _DetailAlbedoMap_ST.xy + _DetailAlbedoMap_ST.zw;
  216. half3 detailAlbedo = SAMPLE_TEXTURE2D(_DetailAlbedoMap, sampler_DetailAlbedoMap, detailUV).rgb;
  217. detailAlbedo = 2.0h * detailAlbedo * _DetailAlbedoMapScale - _DetailAlbedoMapScale + 1.0h;
  218. outSurfaceData.albedo *= lerp(half3(1,1,1), detailAlbedo, detailMask.xxx);
  219. #if BUMP_SCALE_NOT_SUPPORTED
  220. half3 detailNormalTS = UnpackNormal(SAMPLE_TEXTURE2D(_DetailNormalMap, sampler_DetailNormalMap, detailUV));
  221. #else
  222. half3 detailNormalTS = UnpackNormalScale(SAMPLE_TEXTURE2D(_DetailNormalMap, sampler_DetailNormalMap, detailUV), _DetailNormalMapScale);
  223. #endif
  224. // With UNITY_NO_DXT5nm unpacked vector is not normalized for BlendNormalRNM
  225. // For visual consistancy we going to do in all cases
  226. detailNormalTS = normalize(detailNormalTS);
  227. outSurfaceData.normalTS = lerp(outSurfaceData.normalTS, BlendNormalRNM(outSurfaceData.normalTS, detailNormalTS), detailMask);
  228. #endif
  229. outSurfaceData.clearCoatMask = 0;
  230. outSurfaceData.clearCoatSmoothness = 0;
  231. }
  232. #endif
  233. #endif // LIGHTWEIGHT_INPUT_SURFACE_PBR_INCLUDED