TraditionalDeferredShadingSkybox.ankiprog 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright (C) 2009-present, 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 mutator METHOD 0 1 2 // 0: solid colod, 1: 2D image, 2: Generated
  6. #pragma anki technique vert pixel
  7. #include <AnKi/Shaders/QuadVert.hlsl>
  8. #if ANKI_PIXEL_SHADER
  9. # include <AnKi/Shaders/Functions.hlsl>
  10. # include <AnKi/Shaders/Sky.hlsl>
  11. # include <AnKi/Shaders/TonemappingFunctions.hlsl>
  12. # include <AnKi/Shaders/Include/TraditionalDeferredShadingTypes.h>
  13. # include <AnKi/Shaders/Include/MiscRendererTypes.h>
  14. ANKI_FAST_CONSTANTS(TraditionalDeferredSkyboxConstants, g_consts)
  15. SamplerState g_nearestAnyClampSampler : register(s0);
  16. Texture2D g_depthTex : register(t0);
  17. # if METHOD == 1
  18. SamplerState g_trilinearAnySampler : register(s1);
  19. Texture2D<Vec4> g_envMapTex : register(t1);
  20. # elif METHOD == 2
  21. SamplerState g_linearAnyClampSampler : register(s1);
  22. Texture2D<Vec4> g_skyLut : register(t1);
  23. # endif
  24. ConstantBuffer<GlobalRendererConstants> g_globalRendererConsts : register(b0);
  25. Vec4 main(VertOut input) : SV_TARGET0
  26. {
  27. const Vec2 uv = input.m_uv;
  28. const F32 depth = g_depthTex.SampleLevel(g_nearestAnyClampSampler, uv, 0.0).r;
  29. if(depth != 1.0f)
  30. {
  31. discard;
  32. }
  33. # if METHOD == 0
  34. ANKI_MAYBE_UNUSED(uv);
  35. const Vec3 outColor = g_consts.m_solidColor;
  36. # elif METHOD == 1
  37. const F32 depthFar = 1.0;
  38. const Vec2 ndc = uvToNdc(uv);
  39. const Vec4 worldPos4 = mul(g_consts.m_invertedViewProjectionMat, Vec4(ndc, depthFar, 1.0));
  40. const Vec3 worldPos = worldPos4.xyz / worldPos4.w;
  41. const Vec3 eyeToFrag = normalize(worldPos - g_consts.m_cameraPos);
  42. const Vec2 uv2 = equirectangularMapping(eyeToFrag);
  43. const Vec3 outColor = g_envMapTex.Sample(g_trilinearAnySampler, uv2).rgb * g_consts.m_scale + g_consts.m_bias;
  44. # else
  45. const Vec2 ndc = uvToNdc(uv);
  46. const Vec4 worldPos4 = mul(g_consts.m_invertedViewProjectionMat, Vec4(ndc, depth, 1.0));
  47. const Vec3 worldPos = worldPos4.xyz / worldPos4.w;
  48. const Vec3 eyeToFrag = normalize(worldPos - g_consts.m_cameraPos);
  49. const F32 sunPower = computeLuminance(g_globalRendererConsts.m_directionalLight.m_diffuseColor);
  50. const Vec3 outColor =
  51. computeSkyColor(g_skyLut, g_linearAnyClampSampler, eyeToFrag, -g_globalRendererConsts.m_directionalLight.m_direction, sunPower, false);
  52. # endif
  53. return Vec4(outColor, 0.0);
  54. }
  55. #endif // ANKI_PIXEL_SHADER