ApplyIrradianceToReflection.ankiprog 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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/Pack.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. if(gl_GlobalInvocationID.x >= cubeSizeu.x || gl_GlobalInvocationID.y >= cubeSizeu.y)
  21. {
  22. return;
  23. }
  24. const U32 faceIdx = gl_LocalInvocationID.z;
  25. // Compute the UVs to read the gbuffer from
  26. Vec2 sampleUv = (Vec2(gl_GlobalInvocationID.xy) + 0.5) / Vec2(cubeSize);
  27. sampleUv.x *= (1.0 / 6.0);
  28. sampleUv.x += (1.0 / 6.0) * F32(faceIdx);
  29. // Read the gbuffer
  30. GbufferInfo gbuffer;
  31. readGBuffer(u_gbufferTex[0u], u_gbufferTex[1u], u_gbufferTex[2u], u_nearestAnyClampSampler, sampleUv, 0.0, gbuffer);
  32. // Sample
  33. const Vec3 irradiance = sampleAmbientDice(u_irradianceDice[0u].xyz, u_irradianceDice[1u].xyz,
  34. u_irradianceDice[2u].xyz, u_irradianceDice[3u].xyz,
  35. u_irradianceDice[4u].xyz, u_irradianceDice[5u].xyz, gbuffer.m_normal);
  36. // Compute the indirect term
  37. const Vec3 indirect = gbuffer.m_diffuse * irradiance;
  38. // Read the prev color and apply indirect
  39. const IVec3 coords = IVec3(gl_GlobalInvocationID.x, gl_GlobalInvocationID.y, faceIdx);
  40. const Vec3 prevColor = imageLoad(u_cubeTex, coords).xyz;
  41. const Vec3 prevColorWithIndirectDiffuse = prevColor + gbuffer.m_diffuse * indirect;
  42. // Barrier just in case
  43. memoryBarrierImage();
  44. barrier();
  45. // Write it back
  46. imageStore(u_cubeTex, coords, Vec4(prevColorWithIndirectDiffuse, 0.0));
  47. }
  48. #pragma anki end