No Description
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.

Lighting.hlsl 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. #ifndef UNIVERSAL_LIGHTING_INCLUDED
  2. #define UNIVERSAL_LIGHTING_INCLUDED
  3. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/BRDF.hlsl"
  4. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/Debugging3D.hlsl"
  5. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/GlobalIllumination.hlsl"
  6. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RealtimeLights.hlsl"
  7. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/AmbientOcclusion.hlsl"
  8. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl"
  9. #if defined(LIGHTMAP_ON)
  10. #define DECLARE_LIGHTMAP_OR_SH(lmName, shName, index) float2 lmName : TEXCOORD##index
  11. #define OUTPUT_LIGHTMAP_UV(lightmapUV, lightmapScaleOffset, OUT) OUT.xy = lightmapUV.xy * lightmapScaleOffset.xy + lightmapScaleOffset.zw;
  12. #define OUTPUT_SH4(absolutePositionWS, normalWS, viewDir, OUT, OUT_OCCLUSION)
  13. #define OUTPUT_SH(normalWS, OUT)
  14. #else
  15. #define DECLARE_LIGHTMAP_OR_SH(lmName, shName, index) half3 shName : TEXCOORD##index
  16. #define OUTPUT_LIGHTMAP_UV(lightmapUV, lightmapScaleOffset, OUT)
  17. #ifdef USE_APV_PROBE_OCCLUSION
  18. #define OUTPUT_SH4(absolutePositionWS, normalWS, viewDir, OUT, OUT_OCCLUSION) OUT.xyz = SampleProbeSHVertex(absolutePositionWS, normalWS, viewDir, OUT_OCCLUSION)
  19. #else
  20. #define OUTPUT_SH4(absolutePositionWS, normalWS, viewDir, OUT, OUT_OCCLUSION) OUT.xyz = SampleProbeSHVertex(absolutePositionWS, normalWS, viewDir)
  21. #endif
  22. // Note: This is the legacy function, which does not support APV.
  23. // Kept to avoid breaking shaders still calling it (UUM-37723)
  24. #define OUTPUT_SH(normalWS, OUT) OUT.xyz = SampleSHVertex(normalWS)
  25. #endif
  26. ///////////////////////////////////////////////////////////////////////////////
  27. // Lighting Functions //
  28. ///////////////////////////////////////////////////////////////////////////////
  29. half3 LightingLambert(half3 lightColor, half3 lightDir, half3 normal)
  30. {
  31. half NdotL = saturate(dot(normal, lightDir));
  32. return lightColor * NdotL;
  33. }
  34. half3 LightingSpecular(half3 lightColor, half3 lightDir, half3 normal, half3 viewDir, half4 specular, half smoothness)
  35. {
  36. float3 halfVec = SafeNormalize(float3(lightDir) + float3(viewDir));
  37. half NdotH = half(saturate(dot(normal, halfVec)));
  38. half modifier = pow(float(NdotH), float(smoothness)); // Half produces banding, need full precision
  39. // NOTE: In order to fix internal compiler error on mobile platforms, this needs to be float3
  40. float3 specularReflection = specular.rgb * modifier;
  41. return lightColor * specularReflection;
  42. }
  43. half3 LightingPhysicallyBased(BRDFData brdfData, BRDFData brdfDataClearCoat,
  44. half3 lightColor, half3 lightDirectionWS, float lightAttenuation,
  45. half3 normalWS, half3 viewDirectionWS,
  46. half clearCoatMask, bool specularHighlightsOff)
  47. {
  48. half NdotL = saturate(dot(normalWS, lightDirectionWS));
  49. half3 radiance = lightColor * (lightAttenuation * NdotL);
  50. half3 brdf = brdfData.diffuse;
  51. #ifndef _SPECULARHIGHLIGHTS_OFF
  52. [branch] if (!specularHighlightsOff)
  53. {
  54. brdf += brdfData.specular * DirectBRDFSpecular(brdfData, normalWS, lightDirectionWS, viewDirectionWS);
  55. #if defined(_CLEARCOAT) || defined(_CLEARCOATMAP)
  56. // Clear coat evaluates the specular a second timw and has some common terms with the base specular.
  57. // We rely on the compiler to merge these and compute them only once.
  58. half brdfCoat = kDielectricSpec.r * DirectBRDFSpecular(brdfDataClearCoat, normalWS, lightDirectionWS, viewDirectionWS);
  59. // Mix clear coat and base layer using khronos glTF recommended formula
  60. // https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md
  61. // Use NoV for direct too instead of LoH as an optimization (NoV is light invariant).
  62. half NoV = saturate(dot(normalWS, viewDirectionWS));
  63. // Use slightly simpler fresnelTerm (Pow4 vs Pow5) as a small optimization.
  64. // It is matching fresnel used in the GI/Env, so should produce a consistent clear coat blend (env vs. direct)
  65. half coatFresnel = kDielectricSpec.x + kDielectricSpec.a * Pow4(1.0 - NoV);
  66. brdf = brdf * (1.0 - clearCoatMask * coatFresnel) + brdfCoat * clearCoatMask;
  67. #endif // _CLEARCOAT
  68. }
  69. #endif // _SPECULARHIGHLIGHTS_OFF
  70. return brdf * radiance;
  71. }
  72. half3 LightingPhysicallyBased(BRDFData brdfData, BRDFData brdfDataClearCoat, Light light, half3 normalWS, half3 viewDirectionWS, half clearCoatMask, bool specularHighlightsOff)
  73. {
  74. return LightingPhysicallyBased(brdfData, brdfDataClearCoat, light.color, light.direction, light.distanceAttenuation * light.shadowAttenuation, normalWS, viewDirectionWS, clearCoatMask, specularHighlightsOff);
  75. }
  76. // Backwards compatibility
  77. half3 LightingPhysicallyBased(BRDFData brdfData, Light light, half3 normalWS, half3 viewDirectionWS)
  78. {
  79. #ifdef _SPECULARHIGHLIGHTS_OFF
  80. bool specularHighlightsOff = true;
  81. #else
  82. bool specularHighlightsOff = false;
  83. #endif
  84. const BRDFData noClearCoat = (BRDFData)0;
  85. return LightingPhysicallyBased(brdfData, noClearCoat, light, normalWS, viewDirectionWS, 0.0, specularHighlightsOff);
  86. }
  87. half3 LightingPhysicallyBased(BRDFData brdfData, half3 lightColor, half3 lightDirectionWS, float lightAttenuation, half3 normalWS, half3 viewDirectionWS)
  88. {
  89. Light light;
  90. light.color = lightColor;
  91. light.direction = lightDirectionWS;
  92. light.distanceAttenuation = lightAttenuation;
  93. light.shadowAttenuation = 1;
  94. return LightingPhysicallyBased(brdfData, light, normalWS, viewDirectionWS);
  95. }
  96. half3 LightingPhysicallyBased(BRDFData brdfData, Light light, half3 normalWS, half3 viewDirectionWS, bool specularHighlightsOff)
  97. {
  98. const BRDFData noClearCoat = (BRDFData)0;
  99. return LightingPhysicallyBased(brdfData, noClearCoat, light, normalWS, viewDirectionWS, 0.0, specularHighlightsOff);
  100. }
  101. half3 LightingPhysicallyBased(BRDFData brdfData, half3 lightColor, half3 lightDirectionWS, float lightAttenuation, half3 normalWS, half3 viewDirectionWS, bool specularHighlightsOff)
  102. {
  103. Light light;
  104. light.color = lightColor;
  105. light.direction = lightDirectionWS;
  106. light.distanceAttenuation = lightAttenuation;
  107. light.shadowAttenuation = 1;
  108. return LightingPhysicallyBased(brdfData, light, viewDirectionWS, specularHighlightsOff, specularHighlightsOff);
  109. }
  110. half3 VertexLighting(float3 positionWS, half3 normalWS)
  111. {
  112. half3 vertexLightColor = half3(0.0, 0.0, 0.0);
  113. #ifdef _ADDITIONAL_LIGHTS_VERTEX
  114. uint lightsCount = GetAdditionalLightsCount();
  115. uint meshRenderingLayers = GetMeshRenderingLayer();
  116. LIGHT_LOOP_BEGIN(lightsCount)
  117. Light light = GetAdditionalLight(lightIndex, positionWS);
  118. #ifdef _LIGHT_LAYERS
  119. if (IsMatchingLightLayer(light.layerMask, meshRenderingLayers))
  120. #endif
  121. {
  122. half3 lightColor = light.color * light.distanceAttenuation;
  123. vertexLightColor += LightingLambert(lightColor, light.direction, normalWS);
  124. }
  125. LIGHT_LOOP_END
  126. #endif
  127. return vertexLightColor;
  128. }
  129. struct LightingData
  130. {
  131. half3 giColor;
  132. half3 mainLightColor;
  133. half3 additionalLightsColor;
  134. half3 vertexLightingColor;
  135. half3 emissionColor;
  136. };
  137. half3 CalculateLightingColor(LightingData lightingData, half3 albedo)
  138. {
  139. half3 lightingColor = 0;
  140. if (IsOnlyAOLightingFeatureEnabled())
  141. {
  142. return lightingData.giColor; // Contains white + AO
  143. }
  144. if (IsLightingFeatureEnabled(DEBUGLIGHTINGFEATUREFLAGS_GLOBAL_ILLUMINATION))
  145. {
  146. lightingColor += lightingData.giColor;
  147. }
  148. if (IsLightingFeatureEnabled(DEBUGLIGHTINGFEATUREFLAGS_MAIN_LIGHT))
  149. {
  150. lightingColor += lightingData.mainLightColor;
  151. }
  152. if (IsLightingFeatureEnabled(DEBUGLIGHTINGFEATUREFLAGS_ADDITIONAL_LIGHTS))
  153. {
  154. lightingColor += lightingData.additionalLightsColor;
  155. }
  156. if (IsLightingFeatureEnabled(DEBUGLIGHTINGFEATUREFLAGS_VERTEX_LIGHTING))
  157. {
  158. lightingColor += lightingData.vertexLightingColor;
  159. }
  160. lightingColor *= albedo;
  161. if (IsLightingFeatureEnabled(DEBUGLIGHTINGFEATUREFLAGS_EMISSION))
  162. {
  163. lightingColor += lightingData.emissionColor;
  164. }
  165. return lightingColor;
  166. }
  167. half4 CalculateFinalColor(LightingData lightingData, half alpha)
  168. {
  169. half3 finalColor = CalculateLightingColor(lightingData, 1);
  170. return half4(finalColor, alpha);
  171. }
  172. half4 CalculateFinalColor(LightingData lightingData, half3 albedo, half alpha, float fogCoord)
  173. {
  174. #if defined(_FOG_FRAGMENT)
  175. #if (defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2))
  176. float viewZ = -fogCoord;
  177. float nearToFarZ = max(viewZ - _ProjectionParams.y, 0);
  178. half fogFactor = ComputeFogFactorZ0ToFar(nearToFarZ);
  179. #else
  180. half fogFactor = 0;
  181. #endif
  182. #else
  183. half fogFactor = fogCoord;
  184. #endif
  185. half3 lightingColor = CalculateLightingColor(lightingData, albedo);
  186. half3 finalColor = MixFog(lightingColor, fogFactor);
  187. return half4(finalColor, alpha);
  188. }
  189. LightingData CreateLightingData(InputData inputData, SurfaceData surfaceData)
  190. {
  191. LightingData lightingData;
  192. lightingData.giColor = inputData.bakedGI;
  193. lightingData.emissionColor = surfaceData.emission;
  194. lightingData.vertexLightingColor = 0;
  195. lightingData.mainLightColor = 0;
  196. lightingData.additionalLightsColor = 0;
  197. return lightingData;
  198. }
  199. half3 CalculateBlinnPhong(Light light, InputData inputData, SurfaceData surfaceData)
  200. {
  201. half3 attenuatedLightColor = light.color * (light.distanceAttenuation * light.shadowAttenuation);
  202. half3 lightDiffuseColor = LightingLambert(attenuatedLightColor, light.direction, inputData.normalWS);
  203. half3 lightSpecularColor = half3(0,0,0);
  204. #if defined(_SPECGLOSSMAP) || defined(_SPECULAR_COLOR)
  205. half smoothness = exp2(10 * surfaceData.smoothness + 1);
  206. lightSpecularColor += LightingSpecular(attenuatedLightColor, light.direction, inputData.normalWS, inputData.viewDirectionWS, half4(surfaceData.specular, 1), smoothness);
  207. #endif
  208. #if _ALPHAPREMULTIPLY_ON
  209. return lightDiffuseColor * surfaceData.albedo * surfaceData.alpha + lightSpecularColor;
  210. #else
  211. return lightDiffuseColor * surfaceData.albedo + lightSpecularColor;
  212. #endif
  213. }
  214. ///////////////////////////////////////////////////////////////////////////////
  215. // Fragment Functions //
  216. // Used by ShaderGraph and others builtin renderers //
  217. ///////////////////////////////////////////////////////////////////////////////
  218. ////////////////////////////////////////////////////////////////////////////////
  219. /// PBR lighting...
  220. ////////////////////////////////////////////////////////////////////////////////
  221. half4 UniversalFragmentPBR(InputData inputData, SurfaceData surfaceData)
  222. {
  223. #if defined(_SPECULARHIGHLIGHTS_OFF)
  224. bool specularHighlightsOff = true;
  225. #else
  226. bool specularHighlightsOff = false;
  227. #endif
  228. BRDFData brdfData;
  229. // NOTE: can modify "surfaceData"...
  230. InitializeBRDFData(surfaceData, brdfData);
  231. #if defined(DEBUG_DISPLAY)
  232. half4 debugColor;
  233. if (CanDebugOverrideOutputColor(inputData, surfaceData, brdfData, debugColor))
  234. {
  235. return debugColor;
  236. }
  237. #endif
  238. // Clear-coat calculation...
  239. BRDFData brdfDataClearCoat = CreateClearCoatBRDFData(surfaceData, brdfData);
  240. half4 shadowMask = CalculateShadowMask(inputData);
  241. AmbientOcclusionFactor aoFactor = CreateAmbientOcclusionFactor(inputData, surfaceData);
  242. uint meshRenderingLayers = GetMeshRenderingLayer();
  243. Light mainLight = GetMainLight(inputData, shadowMask, aoFactor);
  244. // NOTE: We don't apply AO to the GI here because it's done in the lighting calculation below...
  245. MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI);
  246. LightingData lightingData = CreateLightingData(inputData, surfaceData);
  247. lightingData.giColor = GlobalIllumination(brdfData, brdfDataClearCoat, surfaceData.clearCoatMask,
  248. inputData.bakedGI, aoFactor.indirectAmbientOcclusion, inputData.positionWS,
  249. inputData.normalWS, inputData.viewDirectionWS, inputData.normalizedScreenSpaceUV);
  250. #ifdef _LIGHT_LAYERS
  251. if (IsMatchingLightLayer(mainLight.layerMask, meshRenderingLayers))
  252. #endif
  253. {
  254. lightingData.mainLightColor = LightingPhysicallyBased(brdfData, brdfDataClearCoat,
  255. mainLight,
  256. inputData.normalWS, inputData.viewDirectionWS,
  257. surfaceData.clearCoatMask, specularHighlightsOff);
  258. }
  259. #if defined(_ADDITIONAL_LIGHTS)
  260. uint pixelLightCount = GetAdditionalLightsCount();
  261. #if USE_FORWARD_PLUS
  262. [loop] for (uint lightIndex = 0; lightIndex < min(URP_FP_DIRECTIONAL_LIGHTS_COUNT, MAX_VISIBLE_LIGHTS); lightIndex++)
  263. {
  264. FORWARD_PLUS_SUBTRACTIVE_LIGHT_CHECK
  265. Light light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor);
  266. #ifdef _LIGHT_LAYERS
  267. if (IsMatchingLightLayer(light.layerMask, meshRenderingLayers))
  268. #endif
  269. {
  270. lightingData.additionalLightsColor += LightingPhysicallyBased(brdfData, brdfDataClearCoat, light,
  271. inputData.normalWS, inputData.viewDirectionWS,
  272. surfaceData.clearCoatMask, specularHighlightsOff);
  273. }
  274. }
  275. #endif
  276. LIGHT_LOOP_BEGIN(pixelLightCount)
  277. Light light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor);
  278. #ifdef _LIGHT_LAYERS
  279. if (IsMatchingLightLayer(light.layerMask, meshRenderingLayers))
  280. #endif
  281. {
  282. lightingData.additionalLightsColor += LightingPhysicallyBased(brdfData, brdfDataClearCoat, light,
  283. inputData.normalWS, inputData.viewDirectionWS,
  284. surfaceData.clearCoatMask, specularHighlightsOff);
  285. }
  286. LIGHT_LOOP_END
  287. #endif
  288. #if defined(_ADDITIONAL_LIGHTS_VERTEX)
  289. lightingData.vertexLightingColor += inputData.vertexLighting * brdfData.diffuse;
  290. #endif
  291. #if REAL_IS_HALF
  292. // Clamp any half.inf+ to HALF_MAX
  293. return min(CalculateFinalColor(lightingData, surfaceData.alpha), HALF_MAX);
  294. #else
  295. return CalculateFinalColor(lightingData, surfaceData.alpha);
  296. #endif
  297. }
  298. // Deprecated: Use the version which takes "SurfaceData" instead of passing all of these arguments...
  299. half4 UniversalFragmentPBR(InputData inputData, half3 albedo, half metallic, half3 specular,
  300. half smoothness, half occlusion, half3 emission, half alpha)
  301. {
  302. SurfaceData surfaceData;
  303. surfaceData.albedo = albedo;
  304. surfaceData.specular = specular;
  305. surfaceData.metallic = metallic;
  306. surfaceData.smoothness = smoothness;
  307. surfaceData.normalTS = half3(0, 0, 1);
  308. surfaceData.emission = emission;
  309. surfaceData.occlusion = occlusion;
  310. surfaceData.alpha = alpha;
  311. surfaceData.clearCoatMask = 0;
  312. surfaceData.clearCoatSmoothness = 1;
  313. return UniversalFragmentPBR(inputData, surfaceData);
  314. }
  315. ////////////////////////////////////////////////////////////////////////////////
  316. /// Phong lighting...
  317. ////////////////////////////////////////////////////////////////////////////////
  318. half4 UniversalFragmentBlinnPhong(InputData inputData, SurfaceData surfaceData)
  319. {
  320. #if defined(DEBUG_DISPLAY)
  321. half4 debugColor;
  322. if (CanDebugOverrideOutputColor(inputData, surfaceData, debugColor))
  323. {
  324. return debugColor;
  325. }
  326. #endif
  327. uint meshRenderingLayers = GetMeshRenderingLayer();
  328. half4 shadowMask = CalculateShadowMask(inputData);
  329. AmbientOcclusionFactor aoFactor = CreateAmbientOcclusionFactor(inputData, surfaceData);
  330. Light mainLight = GetMainLight(inputData, shadowMask, aoFactor);
  331. MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, aoFactor);
  332. inputData.bakedGI *= surfaceData.albedo;
  333. LightingData lightingData = CreateLightingData(inputData, surfaceData);
  334. #ifdef _LIGHT_LAYERS
  335. if (IsMatchingLightLayer(mainLight.layerMask, meshRenderingLayers))
  336. #endif
  337. {
  338. lightingData.mainLightColor += CalculateBlinnPhong(mainLight, inputData, surfaceData);
  339. }
  340. #if defined(_ADDITIONAL_LIGHTS)
  341. uint pixelLightCount = GetAdditionalLightsCount();
  342. #if USE_FORWARD_PLUS
  343. [loop] for (uint lightIndex = 0; lightIndex < min(URP_FP_DIRECTIONAL_LIGHTS_COUNT, MAX_VISIBLE_LIGHTS); lightIndex++)
  344. {
  345. FORWARD_PLUS_SUBTRACTIVE_LIGHT_CHECK
  346. Light light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor);
  347. #ifdef _LIGHT_LAYERS
  348. if (IsMatchingLightLayer(light.layerMask, meshRenderingLayers))
  349. #endif
  350. {
  351. lightingData.additionalLightsColor += CalculateBlinnPhong(light, inputData, surfaceData);
  352. }
  353. }
  354. #endif
  355. LIGHT_LOOP_BEGIN(pixelLightCount)
  356. Light light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor);
  357. #ifdef _LIGHT_LAYERS
  358. if (IsMatchingLightLayer(light.layerMask, meshRenderingLayers))
  359. #endif
  360. {
  361. lightingData.additionalLightsColor += CalculateBlinnPhong(light, inputData, surfaceData);
  362. }
  363. LIGHT_LOOP_END
  364. #endif
  365. #if defined(_ADDITIONAL_LIGHTS_VERTEX)
  366. lightingData.vertexLightingColor += inputData.vertexLighting * surfaceData.albedo;
  367. #endif
  368. return CalculateFinalColor(lightingData, surfaceData.alpha);
  369. }
  370. // Deprecated: Use the version which takes "SurfaceData" instead of passing all of these arguments...
  371. half4 UniversalFragmentBlinnPhong(InputData inputData, half3 diffuse, half4 specularGloss, half smoothness, half3 emission, half alpha, half3 normalTS)
  372. {
  373. SurfaceData surfaceData;
  374. surfaceData.albedo = diffuse;
  375. surfaceData.alpha = alpha;
  376. surfaceData.emission = emission;
  377. surfaceData.metallic = 0;
  378. surfaceData.occlusion = 1;
  379. surfaceData.smoothness = smoothness;
  380. surfaceData.specular = specularGloss.rgb;
  381. surfaceData.clearCoatMask = 0;
  382. surfaceData.clearCoatSmoothness = 1;
  383. surfaceData.normalTS = normalTS;
  384. return UniversalFragmentBlinnPhong(inputData, surfaceData);
  385. }
  386. ////////////////////////////////////////////////////////////////////////////////
  387. /// Unlit
  388. ////////////////////////////////////////////////////////////////////////////////
  389. half4 UniversalFragmentBakedLit(InputData inputData, SurfaceData surfaceData)
  390. {
  391. #if defined(DEBUG_DISPLAY)
  392. half4 debugColor;
  393. if (CanDebugOverrideOutputColor(inputData, surfaceData, debugColor))
  394. {
  395. return debugColor;
  396. }
  397. #endif
  398. AmbientOcclusionFactor aoFactor = CreateAmbientOcclusionFactor(inputData, surfaceData);
  399. LightingData lightingData = CreateLightingData(inputData, surfaceData);
  400. if (IsLightingFeatureEnabled(DEBUGLIGHTINGFEATUREFLAGS_AMBIENT_OCCLUSION))
  401. {
  402. lightingData.giColor *= aoFactor.indirectAmbientOcclusion;
  403. }
  404. return CalculateFinalColor(lightingData, surfaceData.albedo, surfaceData.alpha, inputData.fogCoord);
  405. }
  406. // Deprecated: Use the version which takes "SurfaceData" instead of passing all of these arguments...
  407. half4 UniversalFragmentBakedLit(InputData inputData, half3 color, half alpha, half3 normalTS)
  408. {
  409. SurfaceData surfaceData;
  410. surfaceData.albedo = color;
  411. surfaceData.alpha = alpha;
  412. surfaceData.emission = half3(0, 0, 0);
  413. surfaceData.metallic = 0;
  414. surfaceData.occlusion = 1;
  415. surfaceData.smoothness = 1;
  416. surfaceData.specular = half3(0, 0, 0);
  417. surfaceData.clearCoatMask = 0;
  418. surfaceData.clearCoatSmoothness = 1;
  419. surfaceData.normalTS = normalTS;
  420. return UniversalFragmentBakedLit(inputData, surfaceData);
  421. }
  422. #endif