DeferredMaterialPass.azsli 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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 <viewsrg.srgi>
  9. #include <Atom/Features/PBR/DefaultObjectSrg.azsli>
  10. //#include <Atom/Features/Pipeline/Forward/ForwardPassSrg.azsli>
  11. //#include <Atom/Features/Pipeline/Forward/ForwardPassOutput.azsli>
  12. //#include <Atom/Features/PBR/AlphaUtils.azsli>
  13. #include <Atom/Features/ColorManagement/TransformColor.azsli>
  14. //#include <Atom/Features/PBR/Lighting/StandardLighting.azsli>
  15. #include <Atom/Features/PBR/Surfaces/StandardSurface.azsli>
  16. //#include <Atom/Features/PBR/Decals.azsli>
  17. struct VSInput
  18. {
  19. float3 m_position : POSITION;
  20. float3 m_normal : NORMAL;
  21. float4 m_tangent : TANGENT;
  22. float3 m_bitangent : BITANGENT;
  23. };
  24. struct VSOutput
  25. {
  26. precise linear centroid float4 m_position : SV_Position;
  27. float3 m_normal: NORMAL;
  28. float3 m_tangent : TANGENT;
  29. float3 m_bitangent : BITANGENT;
  30. float3 m_worldPosition : UV0;
  31. };
  32. #include <Atom/Features/Vertex/VertexHelper.azsli>
  33. void MaterialFunction_AdjustLocalPosition(inout float3 localPosition);
  34. void MaterialFunction_AdjustWorldPosition(inout float3 worldPosition);
  35. void MaterialFunction_AdjustSurface(inout Surface outSurface);
  36. VSOutput MaterialVS(VSInput IN)
  37. {
  38. VSOutput OUT;
  39. MaterialFunction_AdjustLocalPosition(IN.m_position);
  40. float3 worldPosition = mul(ObjectSrg::GetWorldMatrix(), float4(IN.m_position, 1.0)).xyz;
  41. MaterialFunction_AdjustWorldPosition(worldPosition);
  42. VertexHelper(IN, OUT, worldPosition);
  43. return OUT;
  44. }
  45. struct DeferredMaterialOutput
  46. {
  47. float4 m_baseColor : SV_Target0;
  48. float4 m_roughnessMetal : SV_Target1;
  49. float4 m_normal : SV_Target2;
  50. };
  51. #define MATERIALPIPELINE_SHADER_HAS_PIXEL_STAGE 1
  52. DeferredMaterialOutput MaterialPS(VSOutput IN)
  53. {
  54. // ------- Surface -------
  55. // Note, some of the data being set up in this "Surface" section isn't necessary for the deferred material pass,
  56. // we are just doing it for consistency with how the same code is structured in the other material pipelines.
  57. Surface surface;
  58. surface.position = IN.m_worldPosition.xyz;
  59. surface.vertexNormal = normalize(IN.m_normal);
  60. // These are the values we expect MaterialFunction_EvaluateSurface to potentially replace.
  61. surface.normal = surface.vertexNormal;
  62. surface.roughnessLinear = 0.0;
  63. float3 baseColor = float3(0.5, 0.5, 0.5);
  64. float metallic = 0.0;
  65. float specularF0Factor = 0.5f;
  66. surface.SetAlbedoAndSpecularF0(baseColor, specularF0Factor, metallic);
  67. surface.clearCoat.InitializeToZero();
  68. MaterialFunction_AdjustSurface(surface);
  69. surface.CalculateRoughnessA();
  70. // ------- Output -------
  71. DeferredMaterialOutput OUT;
  72. OUT.m_baseColor = float4(surface.baseColor, 1);
  73. OUT.m_roughnessMetal = float4(surface.roughnessLinear, surface.metallic, 0, 0);
  74. OUT.m_normal.rgb = EncodeNormalSignedOctahedron(surface.normal);
  75. //TODO: switch this after o_enableIBL is hooked up
  76. //OUT.m_normal.a = EncodeUnorm2BitFlags(o_enableIBL, o_specularF0_enableMultiScatterCompensation);
  77. OUT.m_normal.a = EncodeUnorm2BitFlags(true, o_specularF0_enableMultiScatterCompensation);
  78. return OUT;
  79. }