DeferredMaterialPass.azsli 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. #define MATERIALPIPELINE_SHADER_HAS_PIXEL_STAGE 1
  9. //TODO(DeferredPOC): Support clear coat
  10. #define ENABLE_CLEAR_COAT 0
  11. #define ENABLE_TRANSMISSION 0
  12. //////////////////////////////////////////////////////////////////////////////////////////////////
  13. #include MATERIAL_TYPE_AZSLI_FILE_PATH
  14. //////////////////////////////////////////////////////////////////////////////////////////////////
  15. #include <viewsrg.srgi>
  16. #include <Atom/Features/PBR/DefaultObjectSrg.azsli>
  17. #include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli>
  18. #include <Atom/Features/ColorManagement/TransformColor.azsli>
  19. #include <Atom/Features/PBR/LightingOptions.azsli>
  20. VsOutput MaterialVS(VsInput IN, uint instanceId : SV_InstanceID)
  21. {
  22. VsSystemValues SV;
  23. SV.m_instanceId = instanceId;
  24. return EvaluateVertexGeometry(IN, SV, GetMaterialParameters());
  25. }
  26. struct DeferredMaterialOutput
  27. {
  28. float4 m_baseColor : SV_Target0;
  29. float4 m_roughnessMetal : SV_Target1;
  30. float4 m_normal : SV_Target2;
  31. #if OUTPUT_DEPTH
  32. float m_depth : SV_Depth;
  33. #endif
  34. };
  35. // TODO(MaterialPipeline): Probably replace this with FORCE_EARLY_DEPTH_STENCIL like how it's done in MultiViewForwardPassVertexAndPixel.azsli
  36. #if !OUTPUT_DEPTH
  37. [earlydepthstencil]
  38. #endif
  39. DeferredMaterialOutput MaterialPS(VsOutput IN, bool isFrontFace : SV_IsFrontFace)
  40. {
  41. // ------- Geometry -> Surface -------
  42. PixelGeometryData geoData = EvaluatePixelGeometry(IN, isFrontFace, GetMaterialParameters());
  43. Surface surface = EvaluateSurface(IN, geoData, GetMaterialParameters());
  44. // ------- Output -------
  45. DeferredMaterialOutput OUT;
  46. OUT.m_baseColor = float4(surface.baseColor, 1);
  47. OUT.m_roughnessMetal = float4(surface.roughnessLinear, surface.metallic, 0, 0);
  48. OUT.m_normal.rgb = EncodeNormalSignedOctahedron(surface.normal);
  49. OUT.m_normal.a = EncodeUnorm2BitFlags(o_enableIBL, o_specularF0_enableMultiScatterCompensation);
  50. #if OUTPUT_DEPTH
  51. // Can be modified in Parallax calculations in EvaluatePixelGeometry
  52. OUT.m_depth = IN.position.z;
  53. #endif
  54. return OUT;
  55. }