ExponentialShadowmappingResolve.glslp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright (C) 2009-2018, 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 input const UVec2 INPUT_TEXTURE_SIZE
  6. const F32 OFFSET = 1.25;
  7. const Vec2 TEXEL_SIZE = 1.0 / Vec2(INPUT_TEXTURE_SIZE);
  8. const Vec2 HALF_TEXEL_SIZE = TEXEL_SIZE / 2.0;
  9. #pragma anki start vert
  10. #include <shaders/Common.glsl>
  11. out gl_PerVertex
  12. {
  13. Vec4 gl_Position;
  14. };
  15. layout(ANKI_UBO_BINDING(0, 0)) uniform u_
  16. {
  17. Vec4 u_nearFarPad2;
  18. Vec4 u_uvScaleAndTranslation;
  19. };
  20. layout(location = 0) out Vec2 out_uv;
  21. layout(location = 1) flat out Vec2 out_maxUv;
  22. layout(location = 2) flat out Vec2 out_minUv;
  23. void main()
  24. {
  25. out_uv = Vec2(gl_VertexID & 1, gl_VertexID >> 1) * 2.0;
  26. Vec2 pos = out_uv * 2.0 - 1.0;
  27. out_uv = fma(out_uv, u_uvScaleAndTranslation.zw, u_uvScaleAndTranslation.xy);
  28. gl_Position = Vec4(pos, 0.0, 1.0);
  29. // Compute the limits
  30. out_maxUv = fma(Vec2(1.0), u_uvScaleAndTranslation.zw, u_uvScaleAndTranslation.xy) - HALF_TEXEL_SIZE;
  31. out_minUv = fma(Vec2(0.0), u_uvScaleAndTranslation.zw, u_uvScaleAndTranslation.xy) + HALF_TEXEL_SIZE;
  32. }
  33. #pragma anki end
  34. #pragma anki start frag
  35. #include <shaders/GaussianBlurCommon.glsl>
  36. #include <shaders/Functions.glsl>
  37. layout(location = 0) in Vec2 in_uv;
  38. layout(location = 1) flat in Vec2 in_maxUv;
  39. layout(location = 2) flat in Vec2 in_minUv;
  40. layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_inputTex;
  41. layout(ANKI_UBO_BINDING(0, 0)) uniform u_
  42. {
  43. Vec4 u_nearFarPad2;
  44. Vec4 u_uvScaleAndTranslation;
  45. };
  46. #define u_near u_nearFarPad2.x
  47. #define u_far u_nearFarPad2.y
  48. layout(location = 0) out F32 out_color;
  49. F32 sampleLinearDepth(Vec2 uv)
  50. {
  51. uv = clamp(uv, in_minUv, in_maxUv);
  52. return linearizeDepth(textureLod(u_inputTex, uv, 0.0).r, u_near, u_far);
  53. }
  54. void main()
  55. {
  56. const Vec2 UV_OFFSET = OFFSET * TEXEL_SIZE;
  57. out_color = sampleLinearDepth(in_uv) * BOX_WEIGHTS[0u];
  58. out_color += sampleLinearDepth(in_uv + Vec2(UV_OFFSET.x, 0.0)) * BOX_WEIGHTS[1u];
  59. out_color += sampleLinearDepth(in_uv + Vec2(-UV_OFFSET.x, 0.0)) * BOX_WEIGHTS[1u];
  60. out_color += sampleLinearDepth(in_uv + Vec2(0.0, UV_OFFSET.y)) * BOX_WEIGHTS[1u];
  61. out_color += sampleLinearDepth(in_uv + Vec2(0.0, -UV_OFFSET.y)) * BOX_WEIGHTS[1u];
  62. out_color += sampleLinearDepth(in_uv + Vec2(UV_OFFSET.x, UV_OFFSET.y)) * BOX_WEIGHTS[2u];
  63. out_color += sampleLinearDepth(in_uv + Vec2(-UV_OFFSET.x, UV_OFFSET.y)) * BOX_WEIGHTS[2u];
  64. out_color += sampleLinearDepth(in_uv + Vec2(UV_OFFSET.x, -UV_OFFSET.y)) * BOX_WEIGHTS[2u];
  65. out_color += sampleLinearDepth(in_uv + Vec2(-UV_OFFSET.x, -UV_OFFSET.y)) * BOX_WEIGHTS[2u];
  66. }
  67. #pragma anki end