ForwardLighting.bslinc 2.4 KB

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