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.
84 lines
3.5 KiB
84 lines
3.5 KiB
#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" |
|
|
|
#define PREFERRED_CBUFFER_SIZE (64 * 1024) |
|
#define SIZEOF_VEC4_TILEDATA 1 // uint4 |
|
#define SIZEOF_VEC4_PUNCTUALLIGHTDATA 6 // 6 * float4 |
|
#define MAX_DEPTHRANGE_PER_CBUFFER_BATCH (PREFERRED_CBUFFER_SIZE / 4) // Should be ushort, but extra unpacking code is "too expensive" |
|
#define MAX_TILES_PER_CBUFFER_PATCH (PREFERRED_CBUFFER_SIZE / (16 * SIZEOF_VEC4_TILEDATA)) |
|
#define MAX_PUNCTUALLIGHT_PER_CBUFFER_BATCH (PREFERRED_CBUFFER_SIZE / (16 * SIZEOF_VEC4_PUNCTUALLIGHTDATA)) |
|
#define MAX_REL_LIGHT_INDICES_PER_CBUFFER_BATCH (PREFERRED_CBUFFER_SIZE / 4) // Should be ushort, but extra unpacking code is "too expensive" |
|
|
|
// Keep in sync with kUseCBufferForDepthRange. |
|
// Keep in sync with kUseCBufferForTileData. |
|
// Keep in sync with kUseCBufferForLightData. |
|
// Keep in sync with kUseCBufferForLightList. |
|
#if defined(SHADER_API_SWITCH) |
|
#define USE_CBUFFER_FOR_DEPTHRANGE 0 |
|
#define USE_CBUFFER_FOR_TILELIST 0 |
|
#define USE_CBUFFER_FOR_LIGHTDATA 1 |
|
#define USE_CBUFFER_FOR_LIGHTLIST 0 |
|
#elif defined(SHADER_API_GLES) || defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE) |
|
#define USE_CBUFFER_FOR_DEPTHRANGE 1 |
|
#define USE_CBUFFER_FOR_TILELIST 1 |
|
#define USE_CBUFFER_FOR_LIGHTDATA 1 |
|
#define USE_CBUFFER_FOR_LIGHTLIST 1 |
|
#else |
|
#define USE_CBUFFER_FOR_DEPTHRANGE 0 |
|
#define USE_CBUFFER_FOR_TILELIST 0 |
|
#define USE_CBUFFER_FOR_LIGHTDATA 1 |
|
#define USE_CBUFFER_FOR_LIGHTLIST 0 |
|
#endif |
|
|
|
// 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
|
|
|