ForwardLighting.bslinc 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "$ENGINE$\LightGridCommon.bslinc"
  2. #include "$ENGINE$\ReflectionCubemapCommon.bslinc"
  3. #define USE_LIGHT_GRID_INDICES 1
  4. #include "$ENGINE$\DirectLighting.bslinc"
  5. #include "$ENGINE$\ImageBasedLighting.bslinc"
  6. options
  7. {
  8. forward = true;
  9. };
  10. mixin ForwardLighting
  11. {
  12. mixin DirectLighting;
  13. mixin ReflectionCubemapCommon;
  14. mixin ImageBasedLighting;
  15. #if CLUSTERED
  16. mixin LightGridCommon;
  17. mixin LightAccumulatorIndexed;
  18. mixin ReflProbeAccumulatorIndexed;
  19. featureset = HighEnd;
  20. #else
  21. mixin LightAccumulatorDirect;
  22. mixin ReflProbeAccumulatorDirect;
  23. #endif
  24. variations
  25. {
  26. CLUSTERED = { true, false };
  27. };
  28. code
  29. {
  30. #if CLUSTERED
  31. Buffer<uint4> gGridLightOffsetsAndSize;
  32. Buffer<uint2> gGridProbeOffsetsAndSize;
  33. #else
  34. [internal]
  35. cbuffer LightAndReflProbeParams
  36. {
  37. // Number of lights per type in the lights buffer
  38. // x - number of directional lights
  39. // y - offset to radial lights
  40. // z - offset to spot lights
  41. // w - total number of lights
  42. uint4 gLightOffsets;
  43. uint gReflProbeCount;
  44. }
  45. #endif
  46. float3 calcLighting(float3 worldPosition, float3 screenPosition, float2 uv, SurfaceData surfaceData)
  47. {
  48. #if CLUSTERED
  49. uint2 pixelPos = (uint2)screenPosition.xy;
  50. uint cellIdx = calcCellIdx(pixelPos, screenPosition.z);
  51. uint3 lightOffsetAndSize = gGridLightOffsetsAndSize[cellIdx].rgb;
  52. uint4 lightOffsets;
  53. lightOffsets.x = gLightCounts.x;
  54. lightOffsets.y = lightOffsetAndSize.x;
  55. lightOffsets.z = lightOffsets.y + lightOffsetAndSize.y;
  56. lightOffsets.w = lightOffsets.z + lightOffsetAndSize.z;
  57. uint2 reflProbeOffsetAndSize = gGridProbeOffsetsAndSize[cellIdx];
  58. #else
  59. uint4 lightOffsets = gLightOffsets;
  60. uint2 reflProbeOffsetAndSize = uint2(0, gReflProbeCount);
  61. #endif
  62. float3 V = normalize(gViewOrigin - worldPosition);
  63. float3 N = surfaceData.worldNormal.xyz;
  64. float3 R = 2 * dot(V, N) * N - V;
  65. float3 specR = getSpecularDominantDir(N, R, surfaceData.roughness);
  66. float4 directLighting = getDirectLighting(worldPosition, V, specR, surfaceData, lightOffsets);
  67. float ao = gAmbientOcclusionTex.Sample(gAmbientOcclusionSamp, uv);
  68. float4 ssr = gSSRTex.Sample(gSSRSamp, uv);
  69. float3 imageBasedSpecular = getImageBasedSpecular(worldPosition, V, specR, surfaceData, ao, ssr,
  70. reflProbeOffsetAndSize.x, reflProbeOffsetAndSize.y);
  71. float3 totalLighting = directLighting.rgb;
  72. totalLighting.rgb += imageBasedSpecular;
  73. return totalLighting;
  74. }
  75. };
  76. };