暫無描述
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.

SixWayLighting.hlsl 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #ifndef SIXWAY_LIGHTING_INCLUDED
  2. #define SIXWAY_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/Lighting.hlsl"
  9. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/SixWayLighting.hlsl"
  10. struct SixWaySurfaceData
  11. {
  12. half3 rightTopBack;
  13. half3 leftBottomFront;
  14. half3 emission;
  15. half4 diffuseGIData0;
  16. half4 diffuseGIData1;
  17. half4 diffuseGIData2;
  18. half3 baseColor;
  19. half alpha;
  20. half occlusion;
  21. half absorptionRange;
  22. };
  23. LightingData CreateLightingData(SixWaySurfaceData surfaceData)
  24. {
  25. LightingData lightingData;
  26. ZERO_INITIALIZE( LightingData, lightingData);
  27. lightingData.emissionColor = surfaceData.emission;
  28. lightingData.mainLightColor = 0;
  29. lightingData.additionalLightsColor = 0;
  30. return lightingData;
  31. }
  32. #if defined(PROBE_VOLUMES_L1) || defined(PROBE_VOLUMES_L2)
  33. void SampleAPVSixWay(APVSample apvSample, half3x3 tbn, out half4 diffuseGIData[3])
  34. {
  35. [unroll]
  36. for (int i = 0; i<3; i++)
  37. {
  38. EvaluateAPVL1(apvSample, tbn[i], diffuseGIData[i].xyz);
  39. diffuseGIData[i].w = apvSample.L0[i];
  40. }
  41. }
  42. #endif
  43. void GatherDiffuseGIData(float3 positionWS, float3 normalWS, float3 tangentWS, inout half4 diffuseGIData0, inout half4 diffuseGIData1, inout half4 diffuseGIData2)
  44. {
  45. #if defined(LIGHTMAP_ON)
  46. //Do nothing
  47. #else
  48. half4 diffuseGIData[] = {diffuseGIData0, diffuseGIData1, diffuseGIData2};
  49. float3x3 tbn = float3x3(tangentWS, cross(-normalWS, tangentWS), -normalWS);
  50. #if defined(PROBE_VOLUMES_L1) || defined(PROBE_VOLUMES_L2)
  51. APVSample apvSample = SampleAPV(positionWS, normalWS, 0xFFFFFFFF, 0);
  52. if (apvSample.status != APV_SAMPLE_STATUS_INVALID)
  53. {
  54. apvSample.Decode();
  55. SampleAPVSixWay(apvSample, tbn, diffuseGIData);
  56. }
  57. #else
  58. half3 L0 = half3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w);
  59. for (int i = 0; i<3; i++)
  60. {
  61. diffuseGIData[i].xyz = SHEvalLinearL1(tbn[i], unity_SHAr.xyz, unity_SHAg.xyz, unity_SHAb.xyz);
  62. diffuseGIData[i].w = L0[i];
  63. }
  64. #endif
  65. diffuseGIData0 = diffuseGIData[0];
  66. diffuseGIData1 = diffuseGIData[1];
  67. diffuseGIData2 = diffuseGIData[2];
  68. #endif
  69. }
  70. half3 ComputeGIColor(SixWaySurfaceData surfaceData)
  71. {
  72. half4 diffuseGIData0 = surfaceData.diffuseGIData0;
  73. half4 diffuseGIData1 = surfaceData.diffuseGIData1;
  74. half4 diffuseGIData2 = surfaceData.diffuseGIData2;
  75. const half3 L0 = half3(diffuseGIData0.w, diffuseGIData1.w, diffuseGIData2.w);
  76. const real3 diffuseGIData[3] = {diffuseGIData0.xyz, diffuseGIData1.xyz, diffuseGIData2.xyz};
  77. #if defined(_BLENDMODE_PREMULTIPLY)
  78. bool alphaPremultipled = true;
  79. #else
  80. bool alphaPremultipled = false;
  81. #endif
  82. half3 giColor = GetSixWayDiffuseContributions(surfaceData.rightTopBack, surfaceData.leftBottomFront,
  83. half4(surfaceData.baseColor, surfaceData.alpha), L0, diffuseGIData,
  84. surfaceData.absorptionRange, alphaPremultipled);
  85. giColor *= surfaceData.occlusion;
  86. return giColor;
  87. }
  88. half3 SixWayLightBlend(SixWaySurfaceData surfaceData, Light light, half3x3 tangentToWorld)
  89. {
  90. half3x3 localFrame = tangentToWorld;
  91. localFrame[1] *= -1;
  92. localFrame[2] *= -1;
  93. half3 dir = mul(localFrame, light.direction);
  94. half3 weights = dir >= 0 ? surfaceData.rightTopBack.xyz : surfaceData.leftBottomFront.xyz;
  95. half3 sqrDir = dir*dir;
  96. half transmission = dot(sqrDir, weights);
  97. #if defined(_BLENDMODE_PREMULTIPLY)
  98. bool alphaPremultipled = true;
  99. #else
  100. bool alphaPremultipled = false;
  101. #endif
  102. half3 cbsdf_R = GetTransmissionWithAbsorption(transmission, half4(surfaceData.baseColor, surfaceData.alpha), surfaceData.absorptionRange, alphaPremultipled);
  103. half3 radiance = light.color * light.distanceAttenuation * light.shadowAttenuation;
  104. return PI * cbsdf_R * radiance; // *PI because URP doesn't multiply by the Lambert term in its Lit implementation
  105. }
  106. half4 UniversalFragmentSixWay(InputData inputData, SixWaySurfaceData surfaceData)
  107. {
  108. if(surfaceData.alpha == 0)
  109. return half4(0,0,0,0);
  110. half4 shadowMask = CalculateShadowMask(inputData);
  111. uint meshRenderingLayers = GetMeshRenderingLayer();
  112. AmbientOcclusionFactor aoFactor = CreateAmbientOcclusionFactor(inputData.normalizedScreenSpaceUV, 1.0f);
  113. Light mainLight = GetMainLight(inputData, shadowMask, aoFactor);
  114. LightingData lightingData = CreateLightingData(surfaceData);
  115. lightingData.giColor = ComputeGIColor(surfaceData);
  116. #ifdef _LIGHT_LAYERS
  117. if (IsMatchingLightLayer(mainLight.layerMask, meshRenderingLayers))
  118. #endif
  119. {
  120. lightingData.mainLightColor = SixWayLightBlend(surfaceData, mainLight, inputData.tangentToWorld);
  121. }
  122. #if defined(_ADDITIONAL_LIGHTS)
  123. uint pixelLightCount = GetAdditionalLightsCount();
  124. #if USE_FORWARD_PLUS
  125. for (uint lightIndex = 0; lightIndex < min(URP_FP_DIRECTIONAL_LIGHTS_COUNT, MAX_VISIBLE_LIGHTS); lightIndex++)
  126. {
  127. FORWARD_PLUS_SUBTRACTIVE_LIGHT_CHECK
  128. Light light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor);
  129. #ifdef _LIGHT_LAYERS
  130. if (IsMatchingLightLayer(light.layerMask, meshRenderingLayers))
  131. #endif
  132. {
  133. lightingData.additionalLightsColor += SixWayLightBlend(surfaceData, light, inputData.tangentToWorld);
  134. }
  135. }
  136. #endif
  137. LIGHT_LOOP_BEGIN(pixelLightCount)
  138. Light light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor);
  139. #ifdef _LIGHT_LAYERS
  140. if (IsMatchingLightLayer(light.layerMask, meshRenderingLayers))
  141. #endif
  142. {
  143. lightingData.additionalLightsColor += SixWayLightBlend(surfaceData, light, inputData.tangentToWorld);
  144. }
  145. LIGHT_LOOP_END
  146. #endif
  147. return CalculateFinalColor(lightingData, surfaceData.alpha);
  148. }
  149. #endif