ApplyIrradianceToReflection.ankiprog 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma anki start comp
  6. #include <AnKi/Shaders/PackFunctions.glsl>
  7. #include <AnKi/Shaders/LightFunctions.glsl>
  8. layout(local_size_x = 8, local_size_y = 8, local_size_z = 6) in;
  9. layout(set = 0, binding = 0) uniform sampler u_nearestAnyClampSampler;
  10. layout(set = 0, binding = 1) uniform texture2D u_gbufferTex[3u];
  11. layout(set = 0, binding = 2) buffer readonly ssbo_
  12. {
  13. Vec4 u_irradianceDice[6u];
  14. };
  15. layout(set = 0, binding = 3, r11f_g11f_b10f) uniform imageCube u_cubeTex;
  16. void main()
  17. {
  18. const UVec2 cubeSizeu = UVec2(imageSize(u_cubeTex));
  19. const Vec2 cubeSize = Vec2(cubeSizeu);
  20. const UVec2 globalInvocationID = min(gl_GlobalInvocationID.xy, cubeSizeu - 1u);
  21. const U32 faceIdx = gl_LocalInvocationID.z;
  22. // Compute the UVs to read the gbuffer from
  23. Vec2 sampleUv = (Vec2(globalInvocationID) + 0.5) / Vec2(cubeSize);
  24. sampleUv.x *= (1.0 / 6.0);
  25. sampleUv.x += (1.0 / 6.0) * F32(faceIdx);
  26. // Read the gbuffer
  27. GbufferInfo gbuffer;
  28. readGBuffer(u_gbufferTex[0u], u_gbufferTex[1u], u_gbufferTex[2u], u_nearestAnyClampSampler, sampleUv, 0.0, gbuffer);
  29. // Sample
  30. const Vec3 irradiance = sampleAmbientDice(u_irradianceDice[0u].xyz, u_irradianceDice[1u].xyz,
  31. u_irradianceDice[2u].xyz, u_irradianceDice[3u].xyz,
  32. u_irradianceDice[4u].xyz, u_irradianceDice[5u].xyz, gbuffer.m_normal);
  33. // Compute the indirect term
  34. const Vec3 indirect = gbuffer.m_diffuse * irradiance;
  35. // Read the prev color and apply indirect
  36. const IVec3 coords = IVec3(globalInvocationID, faceIdx);
  37. const Vec3 prevColor = imageLoad(u_cubeTex, coords).xyz;
  38. const Vec3 prevColorWithIndirectDiffuse = prevColor + gbuffer.m_diffuse * indirect;
  39. // Barrier just in case
  40. memoryBarrierImage();
  41. barrier();
  42. // Write it back
  43. imageStore(u_cubeTex, coords, Vec4(prevColorWithIndirectDiffuse, 0.0));
  44. }
  45. #pragma anki end