#include "LightLoop.cs.hlsl" #include "../../Sky/SkyVariables.hlsl" StructuredBuffer g_vLightListGlobal; // don't support Buffer yet in unity #define DWORD_PER_TILE 16 // See dwordsPerTile in LightLoop.cs, we have roomm for 31 lights and a number of light value all store on 16 bit (ushort) CBUFFER_START(UnityTilePass) uint _NumTileFtplX; uint _NumTileFtplY; // these uniforms are only needed for when OPAQUES_ONLY is NOT defined // but there's a problem with our front-end compilation of compute shaders with multiple kernels causing it to error //#ifdef USE_CLUSTERED_LIGHTLIST float4x4 g_mInvScrProjection; float g_fClustScale; float g_fClustBase; float g_fNearPlane; float g_fFarPlane; int g_iLog2NumClusters; // We need to always define these to keep constant buffer layouts compatible uint g_isLogBaseBufferEnabled; //#endif //#ifdef USE_CLUSTERED_LIGHTLIST uint _NumTileClusteredX; uint _NumTileClusteredY; CBUFFER_END StructuredBuffer g_vLayeredOffsetsBuffer; // don't support Buffer yet in unity StructuredBuffer g_logBaseBuffer; // don't support Buffer yet in unity //#endif StructuredBuffer _DirectionalLightDatas; StructuredBuffer _LightDatas; StructuredBuffer _EnvLightDatas; StructuredBuffer _ShadowDatas; // Used by directional and spot lights TEXTURE2D_ARRAY(_CookieTextures); SAMPLER2D(sampler_CookieTextures); // Used by point lights TEXTURECUBE_ARRAY_ABSTRACT(_CookieCubeTextures); SAMPLERCUBE_ABSTRACT(sampler_CookieCubeTextures); // Use texture array for reflection (or LatLong 2D array for mobile) TEXTURECUBE_ARRAY_ABSTRACT(_EnvTextures); SAMPLERCUBE_ABSTRACT(sampler_EnvTextures); TEXTURE2D(_DeferredShadowTexture); CBUFFER_START(UnityPerLightLoop) uint _DirectionalLightCount; uint _PunctualLightCount; uint _AreaLightCount; uint _EnvLightCount; float4 _DirShadowSplitSpheres[4]; // TODO: share this max between C# and hlsl int _EnvLightSkyEnabled; // TODO: make it a bool CBUFFER_END // LightLoopContext is not visible from Material (user should not use these properties in Material file) // It allow the lightloop to have transmit sampling information (do we use atlas, or texture array etc...) struct LightLoopContext { int sampleReflection; ShadowContext shadowContext; }; //----------------------------------------------------------------------------- // Cookie sampling functions // ---------------------------------------------------------------------------- // Used by directional and spot lights. float3 SampleCookie2D(LightLoopContext lightLoopContext, float2 coord, int index) { return SAMPLE_TEXTURE2D_ARRAY_LOD(_CookieTextures, sampler_CookieTextures, coord, index, 0).rgb; } // Used by point lights. float3 SampleCookieCube(LightLoopContext lightLoopContext, float3 coord, int index) { return SAMPLE_TEXTURECUBE_ARRAY_LOD_ABSTRACT(_CookieCubeTextures, sampler_CookieCubeTextures, coord, index, 0).rgb; } //----------------------------------------------------------------------------- // Reflection proble / Sky sampling function // ---------------------------------------------------------------------------- #define SINGLE_PASS_CONTEXT_SAMPLE_REFLECTION_PROBES 0 #define SINGLE_PASS_CONTEXT_SAMPLE_SKY 1 // Note: index is whatever the lighting architecture want, it can contain information like in which texture to sample (in case we have a compressed BC6H texture and an uncompressed for real time reflection ?) // EnvIndex can also be use to fetch in another array of struct (to atlas information etc...). float4 SampleEnv(LightLoopContext lightLoopContext, int index, float3 texCoord, float lod) { // This code will be inlined as lightLoopContext is hardcoded in the light loop if (lightLoopContext.sampleReflection == SINGLE_PASS_CONTEXT_SAMPLE_REFLECTION_PROBES) { return SAMPLE_TEXTURECUBE_ARRAY_LOD_ABSTRACT(_EnvTextures, sampler_EnvTextures, texCoord, index, lod); } else // SINGLE_PASS_SAMPLE_SKY { return SampleSkyTexture(texCoord, lod); } }