Açıklama Yok
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.

LitInput.hlsl 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. #ifndef UNIVERSAL_LIT_INPUT_INCLUDED
  2. #define UNIVERSAL_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. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/ParallaxMapping.hlsl"
  7. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl"
  8. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DebugMipmapStreamingMacros.hlsl"
  9. #if defined(_DETAIL_MULX2) || defined(_DETAIL_SCALED)
  10. #define _DETAIL
  11. #endif
  12. // NOTE: Do not ifdef the properties here as SRP batcher can not handle different layouts.
  13. CBUFFER_START(UnityPerMaterial)
  14. float4 _BaseMap_ST;
  15. float4 _DetailAlbedoMap_ST;
  16. half4 _BaseColor;
  17. half4 _SpecColor;
  18. half4 _EmissionColor;
  19. half _Cutoff;
  20. half _Smoothness;
  21. half _Metallic;
  22. half _BumpScale;
  23. half _Parallax;
  24. half _OcclusionStrength;
  25. half _ClearCoatMask;
  26. half _ClearCoatSmoothness;
  27. half _DetailAlbedoMapScale;
  28. half _DetailNormalMapScale;
  29. half _Surface;
  30. UNITY_TEXTURE_STREAMING_DEBUG_VARS;
  31. CBUFFER_END
  32. // NOTE: Do not ifdef the properties for dots instancing, but ifdef the actual usage.
  33. // Otherwise you might break CPU-side as property constant-buffer offsets change per variant.
  34. // NOTE: Dots instancing is orthogonal to the constant buffer above.
  35. #ifdef UNITY_DOTS_INSTANCING_ENABLED
  36. UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)
  37. UNITY_DOTS_INSTANCED_PROP(float4, _BaseColor)
  38. UNITY_DOTS_INSTANCED_PROP(float4, _SpecColor)
  39. UNITY_DOTS_INSTANCED_PROP(float4, _EmissionColor)
  40. UNITY_DOTS_INSTANCED_PROP(float , _Cutoff)
  41. UNITY_DOTS_INSTANCED_PROP(float , _Smoothness)
  42. UNITY_DOTS_INSTANCED_PROP(float , _Metallic)
  43. UNITY_DOTS_INSTANCED_PROP(float , _BumpScale)
  44. UNITY_DOTS_INSTANCED_PROP(float , _Parallax)
  45. UNITY_DOTS_INSTANCED_PROP(float , _OcclusionStrength)
  46. UNITY_DOTS_INSTANCED_PROP(float , _ClearCoatMask)
  47. UNITY_DOTS_INSTANCED_PROP(float , _ClearCoatSmoothness)
  48. UNITY_DOTS_INSTANCED_PROP(float , _DetailAlbedoMapScale)
  49. UNITY_DOTS_INSTANCED_PROP(float , _DetailNormalMapScale)
  50. UNITY_DOTS_INSTANCED_PROP(float , _Surface)
  51. UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)
  52. // Here, we want to avoid overriding a property like e.g. _BaseColor with something like this:
  53. // #define _BaseColor UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float4, _BaseColor0)
  54. //
  55. // It would be simpler, but it can cause the compiler to regenerate the property loading code for each use of _BaseColor.
  56. //
  57. // To avoid this, the property loads are cached in some static values at the beginning of the shader.
  58. // The properties such as _BaseColor are then overridden so that it expand directly to the static value like this:
  59. // #define _BaseColor unity_DOTS_Sampled_BaseColor
  60. //
  61. // This simple fix happened to improve GPU performances by ~10% on Meta Quest 2 with URP on some scenes.
  62. static float4 unity_DOTS_Sampled_BaseColor;
  63. static float4 unity_DOTS_Sampled_SpecColor;
  64. static float4 unity_DOTS_Sampled_EmissionColor;
  65. static float unity_DOTS_Sampled_Cutoff;
  66. static float unity_DOTS_Sampled_Smoothness;
  67. static float unity_DOTS_Sampled_Metallic;
  68. static float unity_DOTS_Sampled_BumpScale;
  69. static float unity_DOTS_Sampled_Parallax;
  70. static float unity_DOTS_Sampled_OcclusionStrength;
  71. static float unity_DOTS_Sampled_ClearCoatMask;
  72. static float unity_DOTS_Sampled_ClearCoatSmoothness;
  73. static float unity_DOTS_Sampled_DetailAlbedoMapScale;
  74. static float unity_DOTS_Sampled_DetailNormalMapScale;
  75. static float unity_DOTS_Sampled_Surface;
  76. void SetupDOTSLitMaterialPropertyCaches()
  77. {
  78. unity_DOTS_Sampled_BaseColor = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float4, _BaseColor);
  79. unity_DOTS_Sampled_SpecColor = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float4, _SpecColor);
  80. unity_DOTS_Sampled_EmissionColor = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float4, _EmissionColor);
  81. unity_DOTS_Sampled_Cutoff = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _Cutoff);
  82. unity_DOTS_Sampled_Smoothness = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _Smoothness);
  83. unity_DOTS_Sampled_Metallic = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _Metallic);
  84. unity_DOTS_Sampled_BumpScale = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _BumpScale);
  85. unity_DOTS_Sampled_Parallax = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _Parallax);
  86. unity_DOTS_Sampled_OcclusionStrength = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _OcclusionStrength);
  87. unity_DOTS_Sampled_ClearCoatMask = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _ClearCoatMask);
  88. unity_DOTS_Sampled_ClearCoatSmoothness = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _ClearCoatSmoothness);
  89. unity_DOTS_Sampled_DetailAlbedoMapScale = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _DetailAlbedoMapScale);
  90. unity_DOTS_Sampled_DetailNormalMapScale = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _DetailNormalMapScale);
  91. unity_DOTS_Sampled_Surface = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float , _Surface);
  92. }
  93. #undef UNITY_SETUP_DOTS_MATERIAL_PROPERTY_CACHES
  94. #define UNITY_SETUP_DOTS_MATERIAL_PROPERTY_CACHES() SetupDOTSLitMaterialPropertyCaches()
  95. #define _BaseColor unity_DOTS_Sampled_BaseColor
  96. #define _SpecColor unity_DOTS_Sampled_SpecColor
  97. #define _EmissionColor unity_DOTS_Sampled_EmissionColor
  98. #define _Cutoff unity_DOTS_Sampled_Cutoff
  99. #define _Smoothness unity_DOTS_Sampled_Smoothness
  100. #define _Metallic unity_DOTS_Sampled_Metallic
  101. #define _BumpScale unity_DOTS_Sampled_BumpScale
  102. #define _Parallax unity_DOTS_Sampled_Parallax
  103. #define _OcclusionStrength unity_DOTS_Sampled_OcclusionStrength
  104. #define _ClearCoatMask unity_DOTS_Sampled_ClearCoatMask
  105. #define _ClearCoatSmoothness unity_DOTS_Sampled_ClearCoatSmoothness
  106. #define _DetailAlbedoMapScale unity_DOTS_Sampled_DetailAlbedoMapScale
  107. #define _DetailNormalMapScale unity_DOTS_Sampled_DetailNormalMapScale
  108. #define _Surface unity_DOTS_Sampled_Surface
  109. #endif
  110. TEXTURE2D(_ParallaxMap); SAMPLER(sampler_ParallaxMap);
  111. TEXTURE2D(_OcclusionMap); SAMPLER(sampler_OcclusionMap);
  112. TEXTURE2D(_DetailMask); SAMPLER(sampler_DetailMask);
  113. TEXTURE2D(_DetailAlbedoMap); SAMPLER(sampler_DetailAlbedoMap);
  114. TEXTURE2D(_DetailNormalMap); SAMPLER(sampler_DetailNormalMap);
  115. TEXTURE2D(_MetallicGlossMap); SAMPLER(sampler_MetallicGlossMap);
  116. TEXTURE2D(_SpecGlossMap); SAMPLER(sampler_SpecGlossMap);
  117. TEXTURE2D(_ClearCoatMap); SAMPLER(sampler_ClearCoatMap);
  118. #ifdef _SPECULAR_SETUP
  119. #define SAMPLE_METALLICSPECULAR(uv) SAMPLE_TEXTURE2D(_SpecGlossMap, sampler_SpecGlossMap, uv)
  120. #else
  121. #define SAMPLE_METALLICSPECULAR(uv) SAMPLE_TEXTURE2D(_MetallicGlossMap, sampler_MetallicGlossMap, uv)
  122. #endif
  123. half4 SampleMetallicSpecGloss(float2 uv, half albedoAlpha)
  124. {
  125. half4 specGloss;
  126. #ifdef _METALLICSPECGLOSSMAP
  127. specGloss = half4(SAMPLE_METALLICSPECULAR(uv));
  128. #ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
  129. specGloss.a = albedoAlpha * _Smoothness;
  130. #else
  131. specGloss.a *= _Smoothness;
  132. #endif
  133. #else // _METALLICSPECGLOSSMAP
  134. #if _SPECULAR_SETUP
  135. specGloss.rgb = _SpecColor.rgb;
  136. #else
  137. specGloss.rgb = _Metallic.rrr;
  138. #endif
  139. #ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
  140. specGloss.a = albedoAlpha * _Smoothness;
  141. #else
  142. specGloss.a = _Smoothness;
  143. #endif
  144. #endif
  145. return specGloss;
  146. }
  147. half SampleOcclusion(float2 uv)
  148. {
  149. #ifdef _OCCLUSIONMAP
  150. half occ = SAMPLE_TEXTURE2D(_OcclusionMap, sampler_OcclusionMap, uv).g;
  151. return LerpWhiteTo(occ, _OcclusionStrength);
  152. #else
  153. return half(1.0);
  154. #endif
  155. }
  156. // Returns clear coat parameters
  157. // .x/.r == mask
  158. // .y/.g == smoothness
  159. half2 SampleClearCoat(float2 uv)
  160. {
  161. #if defined(_CLEARCOAT) || defined(_CLEARCOATMAP)
  162. half2 clearCoatMaskSmoothness = half2(_ClearCoatMask, _ClearCoatSmoothness);
  163. #if defined(_CLEARCOATMAP)
  164. clearCoatMaskSmoothness *= SAMPLE_TEXTURE2D(_ClearCoatMap, sampler_ClearCoatMap, uv).rg;
  165. #endif
  166. return clearCoatMaskSmoothness;
  167. #else
  168. return half2(0.0, 1.0);
  169. #endif // _CLEARCOAT
  170. }
  171. void ApplyPerPixelDisplacement(half3 viewDirTS, inout float2 uv)
  172. {
  173. #if defined(_PARALLAXMAP)
  174. uv += ParallaxMapping(TEXTURE2D_ARGS(_ParallaxMap, sampler_ParallaxMap), viewDirTS, _Parallax, uv);
  175. #endif
  176. }
  177. // Used for scaling detail albedo. Main features:
  178. // - Depending if detailAlbedo brightens or darkens, scale magnifies effect.
  179. // - No effect is applied if detailAlbedo is 0.5.
  180. half3 ScaleDetailAlbedo(half3 detailAlbedo, half scale)
  181. {
  182. // detailAlbedo = detailAlbedo * 2.0h - 1.0h;
  183. // detailAlbedo *= _DetailAlbedoMapScale;
  184. // detailAlbedo = detailAlbedo * 0.5h + 0.5h;
  185. // return detailAlbedo * 2.0f;
  186. // A bit more optimized
  187. return half(2.0) * detailAlbedo * scale - scale + half(1.0);
  188. }
  189. half3 ApplyDetailAlbedo(float2 detailUv, half3 albedo, half detailMask)
  190. {
  191. #if defined(_DETAIL)
  192. half3 detailAlbedo = SAMPLE_TEXTURE2D(_DetailAlbedoMap, sampler_DetailAlbedoMap, detailUv).rgb;
  193. // In order to have same performance as builtin, we do scaling only if scale is not 1.0 (Scaled version has 6 additional instructions)
  194. #if defined(_DETAIL_SCALED)
  195. detailAlbedo = ScaleDetailAlbedo(detailAlbedo, _DetailAlbedoMapScale);
  196. #else
  197. detailAlbedo = half(2.0) * detailAlbedo;
  198. #endif
  199. return albedo * LerpWhiteTo(detailAlbedo, detailMask);
  200. #else
  201. return albedo;
  202. #endif
  203. }
  204. half3 ApplyDetailNormal(float2 detailUv, half3 normalTS, half detailMask)
  205. {
  206. #if defined(_DETAIL)
  207. #if BUMP_SCALE_NOT_SUPPORTED
  208. half3 detailNormalTS = UnpackNormal(SAMPLE_TEXTURE2D(_DetailNormalMap, sampler_DetailNormalMap, detailUv));
  209. #else
  210. half3 detailNormalTS = UnpackNormalScale(SAMPLE_TEXTURE2D(_DetailNormalMap, sampler_DetailNormalMap, detailUv), _DetailNormalMapScale);
  211. #endif
  212. // With UNITY_NO_DXT5nm unpacked vector is not normalized for BlendNormalRNM
  213. // For visual consistancy we going to do in all cases
  214. detailNormalTS = normalize(detailNormalTS);
  215. return lerp(normalTS, BlendNormalRNM(normalTS, detailNormalTS), detailMask); // todo: detailMask should lerp the angle of the quaternion rotation, not the normals
  216. #else
  217. return normalTS;
  218. #endif
  219. }
  220. inline void InitializeStandardLitSurfaceData(float2 uv, out SurfaceData outSurfaceData)
  221. {
  222. half4 albedoAlpha = SampleAlbedoAlpha(uv, TEXTURE2D_ARGS(_BaseMap, sampler_BaseMap));
  223. outSurfaceData.alpha = Alpha(albedoAlpha.a, _BaseColor, _Cutoff);
  224. half4 specGloss = SampleMetallicSpecGloss(uv, albedoAlpha.a);
  225. outSurfaceData.albedo = albedoAlpha.rgb * _BaseColor.rgb;
  226. outSurfaceData.albedo = AlphaModulate(outSurfaceData.albedo, outSurfaceData.alpha);
  227. #if _SPECULAR_SETUP
  228. outSurfaceData.metallic = half(1.0);
  229. outSurfaceData.specular = specGloss.rgb;
  230. #else
  231. outSurfaceData.metallic = specGloss.r;
  232. outSurfaceData.specular = half3(0.0, 0.0, 0.0);
  233. #endif
  234. outSurfaceData.smoothness = specGloss.a;
  235. outSurfaceData.normalTS = SampleNormal(uv, TEXTURE2D_ARGS(_BumpMap, sampler_BumpMap), _BumpScale);
  236. outSurfaceData.occlusion = SampleOcclusion(uv);
  237. outSurfaceData.emission = SampleEmission(uv, _EmissionColor.rgb, TEXTURE2D_ARGS(_EmissionMap, sampler_EmissionMap));
  238. #if defined(_CLEARCOAT) || defined(_CLEARCOATMAP)
  239. half2 clearCoat = SampleClearCoat(uv);
  240. outSurfaceData.clearCoatMask = clearCoat.r;
  241. outSurfaceData.clearCoatSmoothness = clearCoat.g;
  242. #else
  243. outSurfaceData.clearCoatMask = half(0.0);
  244. outSurfaceData.clearCoatSmoothness = half(0.0);
  245. #endif
  246. #if defined(_DETAIL)
  247. half detailMask = SAMPLE_TEXTURE2D(_DetailMask, sampler_DetailMask, uv).a;
  248. float2 detailUv = uv * _DetailAlbedoMap_ST.xy + _DetailAlbedoMap_ST.zw;
  249. outSurfaceData.albedo = ApplyDetailAlbedo(detailUv, outSurfaceData.albedo, detailMask);
  250. outSurfaceData.normalTS = ApplyDetailNormal(detailUv, outSurfaceData.normalTS, detailMask);
  251. #endif
  252. }
  253. #endif // UNIVERSAL_INPUT_SURFACE_PBR_INCLUDED