| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- //
- // Contains helper mixin used for initializing different forms of light accumulation. Can be removed
- // when template/specialization support for mixins is added to BSL.
- //
- #ifdef USE_UNIFORM_BUFFER
- mixin LightAccumulatorDirect
- #else
- mixin LightAccumulatorIndexed
- #endif
- {
- code
- {
- #ifdef USE_UNIFORM_BUFFER
- #define MAX_LIGHTS 8
-
- [internal]
- cbuffer Lights
- {
- LightData gLights[MAX_LIGHTS];
- }
- #else
- #define MAX_LIGHTS 512 // Arbitrary limit, increase if needed
-
- #ifdef USE_COMPUTE_INDICES
- groupshared uint gLightIndices[MAX_LIGHTS];
- StructuredBuffer<LightData> gLights;
- #endif
-
- #ifdef USE_LIGHT_GRID_INDICES
- Buffer<uint> gLightIndices;
- StructuredBuffer<LightData> gLights;
- #endif
- #endif
-
- float4 getDirectLighting(float3 worldPos, float3 V, float3 R, SurfaceData surfaceData, uint4 lightOffsets)
- {
- float3 N = surfaceData.worldNormal.xyz;
- float roughness2 = max(surfaceData.roughness, 0.08f);
- roughness2 *= roughness2;
-
- float3 outLuminance = 0;
- float alpha = 0.0f;
- if(surfaceData.worldNormal.w > 0.0f)
- {
- // Handle directional lights
- [loop]
- for(uint i = 0; i < lightOffsets.x; ++i)
- {
- LightData lightData = gLights[i];
- outLuminance += getLuminanceDirectional(lightData, worldPos, V, R, surfaceData);
- }
-
- // Handle radial lights
- [loop]
- for (uint j = lightOffsets.y; j < lightOffsets.z; ++j)
- {
- #ifdef USE_UNIFORM_BUFFER
- uint lightIdx = j;
- #else
- uint lightIdx = gLightIndices[j];
- #endif
-
- LightData lightData = gLights[lightIdx];
- outLuminance += getLuminanceRadial(lightData, worldPos, V, R, roughness2, surfaceData);
- }
- // Handle spot lights
- [loop]
- for(uint k = lightOffsets.z; k < lightOffsets.w; ++k)
- {
- #ifdef USE_UNIFORM_BUFFER
- uint lightIdx = k;
- #else
- uint lightIdx = gLightIndices[k];
- #endif
-
- LightData lightData = gLights[lightIdx];
- outLuminance += getLuminanceSpot(lightData, worldPos, V, R, roughness2, surfaceData);
- }
-
- // Ambient term for in-editor visualization, not used in actual lighting
- outLuminance += surfaceData.albedo.rgb * gAmbientFactor / PI;
- alpha = 1.0f;
- }
-
- return float4(outLuminance, alpha);
- }
- };
- };
|