MultipleViewsShadow.azsl 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Atom/Features/SrgSemantics.azsli>
  9. ShaderResourceGroup ShadowViewSrg : SRG_PerObject
  10. {
  11. row_major float4x4 m_worldMatrix;
  12. row_major float4x4 m_viewProjectionMatrix;
  13. row_major float4x4 m_lightViewProjectionMatrix;
  14. float4 m_lightPosition;
  15. float4 m_ambientColor;
  16. float4 m_diffuseColor;
  17. Texture2D m_depthMapTexture;
  18. Sampler ShadowSampler
  19. {
  20. AddressU = Clamp;
  21. AddressV = Clamp;
  22. };
  23. }
  24. struct VSInput
  25. {
  26. float3 m_position : POSITION;
  27. float4 m_color : COLOR0;
  28. float3 m_normal: NORMAL;
  29. };
  30. struct VSOutput
  31. {
  32. float4 m_position : SV_Position;
  33. float4 m_color : COLOR0;
  34. float3 m_normal: NORMAL;
  35. float4 m_lightViewPosition : TEXCOORD1;
  36. float3 m_worldPosition : TEXCOORD2;
  37. };
  38. VSOutput MainVS(VSInput vsInput)
  39. {
  40. VSOutput OUT;
  41. OUT.m_worldPosition = mul(ShadowViewSrg::m_worldMatrix, float4(vsInput.m_position, 1.0)).xyz;
  42. OUT.m_position = mul(ShadowViewSrg::m_viewProjectionMatrix, float4(OUT.m_worldPosition, 1.0));
  43. OUT.m_lightViewPosition = mul(ShadowViewSrg::m_lightViewProjectionMatrix, float4(OUT.m_worldPosition, 1.0));
  44. OUT.m_color = vsInput.m_color;
  45. float4 normalsToWorld = mul(float4(vsInput.m_normal, 0.0), ShadowViewSrg::m_worldMatrix);
  46. OUT.m_normal = normalsToWorld.xyz;
  47. OUT.m_normal = normalize(OUT.m_normal);
  48. return OUT;
  49. }
  50. struct PSOutput
  51. {
  52. float4 m_color : SV_Target0;
  53. };
  54. PSOutput MainPS(VSOutput vsOutput)
  55. {
  56. PSOutput OUT;
  57. float bias;
  58. float shadowMask;
  59. float lightIntensity;
  60. float3 projectTexCoord;
  61. float3 lightDirection;
  62. bias = 0.001f;
  63. OUT.m_color = ShadowViewSrg::m_ambientColor;
  64. lightDirection = ShadowViewSrg::m_lightPosition.xyz - vsOutput.m_worldPosition;
  65. lightDirection = normalize(lightDirection);
  66. projectTexCoord.xyz = vsOutput.m_lightViewPosition.xyz / vsOutput.m_lightViewPosition.w;
  67. projectTexCoord.xy = (projectTexCoord.xy / float2(2.0f, -2.0f)) + 0.5f;
  68. projectTexCoord.z -= bias;
  69. shadowMask = ShadowViewSrg::m_depthMapTexture.Sample(ShadowViewSrg::ShadowSampler, projectTexCoord.xy).r;
  70. shadowMask = float(shadowMask > projectTexCoord.z);
  71. lightIntensity = shadowMask * saturate(dot(normalize(vsOutput.m_normal), lightDirection));
  72. OUT.m_color += (ShadowViewSrg::m_diffuseColor * lightIntensity);
  73. OUT.m_color = saturate(OUT.m_color);
  74. OUT.m_color = OUT.m_color * vsOutput.m_color;
  75. return OUT;
  76. }