12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- #ifndef UNIVERSAL_DEFERRED_INCLUDED
- #define UNIVERSAL_DEFERRED_INCLUDED
-
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl"
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl"
-
- // This structure is used in StructuredBuffer.
- // TODO move some of the properties to half storage (color, attenuation, spotDirection, flag to 16bits, occlusionProbeInfo)
- struct PunctualLightData
- {
- float3 posWS;
- float radius2; // squared radius
- float4 color;
- float4 attenuation; // .xy are used by DistanceAttenuation - .zw are used by AngleAttenuation (for SpotLights)
- float3 spotDirection; // spotLights support
- int flags; // Light flags (enum kLightFlags and LightFlag in C# code)
- float4 occlusionProbeInfo;
- uint layerMask; // Optional light layer mask
- };
-
- Light UnityLightFromPunctualLightDataAndWorldSpacePosition(PunctualLightData punctualLightData, float3 positionWS, half4 shadowMask, int shadowLightIndex, bool materialFlagReceiveShadowsOff)
- {
- // Keep in sync with GetAdditionalPerObjectLight in Lighting.hlsl
-
- half4 probesOcclusion = shadowMask;
-
- Light light;
-
- float3 lightVector = punctualLightData.posWS - positionWS.xyz;
- float distanceSqr = max(dot(lightVector, lightVector), HALF_MIN);
-
- half3 lightDirection = half3(lightVector * rsqrt(distanceSqr));
-
- // full-float precision required on some platforms
- float attenuation = DistanceAttenuation(distanceSqr, punctualLightData.attenuation.xy) * AngleAttenuation(punctualLightData.spotDirection.xyz, lightDirection, punctualLightData.attenuation.zw);
-
- light.direction = lightDirection;
- light.color = punctualLightData.color.rgb;
-
- light.distanceAttenuation = attenuation;
-
- [branch] if (materialFlagReceiveShadowsOff)
- light.shadowAttenuation = 1.0;
- else
- {
- light.shadowAttenuation = AdditionalLightShadow(shadowLightIndex, positionWS, lightDirection, shadowMask, punctualLightData.occlusionProbeInfo);
- }
-
- light.layerMask = punctualLightData.layerMask;
-
- return light;
- }
-
- #endif
|