SubsurfaceTransmissionParameterFunctor.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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 "./SubsurfaceTransmissionParameterFunctor.h"
  9. #include <Atom/RPI.Public/Material/Material.h>
  10. #include <Atom/RPI.Public/Shader/ShaderResourceGroup.h>
  11. #include <Atom/RPI.Public/Pass/PassSystemInterface.h>
  12. namespace AZ
  13. {
  14. namespace Render
  15. {
  16. void SubsurfaceTransmissionParameterFunctor::Reflect(ReflectContext* context)
  17. {
  18. if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
  19. {
  20. serializeContext->Class<SubsurfaceTransmissionParameterFunctor, RPI::MaterialFunctor>()
  21. ->Version(2)
  22. ->Field("m_mode", &SubsurfaceTransmissionParameterFunctor::m_mode)
  23. ->Field("m_scale", &SubsurfaceTransmissionParameterFunctor::m_scale)
  24. ->Field("m_power", &SubsurfaceTransmissionParameterFunctor::m_power)
  25. ->Field("m_distortion", &SubsurfaceTransmissionParameterFunctor::m_distortion)
  26. ->Field("m_attenuation", &SubsurfaceTransmissionParameterFunctor::m_attenuation)
  27. ->Field("m_shrinkFactor", &SubsurfaceTransmissionParameterFunctor::m_shrinkFactor)
  28. ->Field("m_transmissionNdLBias", &SubsurfaceTransmissionParameterFunctor::m_transmissionNdLBias)
  29. ->Field("m_distanceAttenuation", &SubsurfaceTransmissionParameterFunctor::m_distanceAttenuation)
  30. ->Field("m_tintColor", &SubsurfaceTransmissionParameterFunctor::m_tintColor)
  31. ->Field("m_thickness", &SubsurfaceTransmissionParameterFunctor::m_thickness)
  32. ->Field("m_enabled", &SubsurfaceTransmissionParameterFunctor::m_enabled)
  33. ->Field("m_scatterDistanceColor", &SubsurfaceTransmissionParameterFunctor::m_scatterDistanceColor)
  34. ->Field("m_scatterDistanceIntensity", &SubsurfaceTransmissionParameterFunctor::m_scatterDistanceIntensity)
  35. ->Field("m_scatterDistance", &SubsurfaceTransmissionParameterFunctor::m_scatterDistance)
  36. ->Field("m_transmissionParams", &SubsurfaceTransmissionParameterFunctor::m_transmissionParams)
  37. ->Field("m_transmissionTintThickness", &SubsurfaceTransmissionParameterFunctor::m_transmissionTintThickness)
  38. ;
  39. }
  40. }
  41. void SubsurfaceTransmissionParameterFunctor::Process(RPI::MaterialFunctorAPI::RuntimeContext& context)
  42. {
  43. // Build & preprocess all parameters used by subsurface scattering feature
  44. using namespace RPI;
  45. enum class TransmissionMode { None, ThickObject, ThinObject };
  46. auto mode = context.GetMaterialPropertyValue<uint32_t>(m_mode);
  47. auto scale = context.GetMaterialPropertyValue<float>(m_scale);
  48. auto power = context.GetMaterialPropertyValue<float>(m_power);
  49. auto distortion = context.GetMaterialPropertyValue<float>(m_distortion);
  50. auto attenuation = context.GetMaterialPropertyValue<float>(m_attenuation);
  51. auto shrinkFactor = context.GetMaterialPropertyValue<float>(m_shrinkFactor);
  52. auto transmissionNdLBias = context.GetMaterialPropertyValue<float>(m_transmissionNdLBias);
  53. auto distanceAttenuation = context.GetMaterialPropertyValue<float>(m_distanceAttenuation);
  54. auto tintColor = context.GetMaterialPropertyValue<Color>(m_tintColor);
  55. auto thickness = context.GetMaterialPropertyValue<float>(m_thickness);
  56. auto scatterDistanceColor = context.GetMaterialPropertyValue<Color>(m_scatterDistanceColor);
  57. auto scatterDistanceIntensity = context.GetMaterialPropertyValue<float>(m_scatterDistanceIntensity);
  58. Vector3 scatterDistance = Vector3(scatterDistanceColor.GetAsVector3()) * Vector3(scatterDistanceIntensity, scatterDistanceIntensity, scatterDistanceIntensity);
  59. Vector4 transmissionParams;
  60. if (mode == static_cast<uint32_t>(TransmissionMode::ThickObject))
  61. {
  62. transmissionParams.SetX(attenuation);
  63. transmissionParams.SetY(power);
  64. transmissionParams.SetZ(distortion);
  65. transmissionParams.SetW(scale);
  66. }
  67. else
  68. {
  69. transmissionParams.SetX(shrinkFactor);
  70. transmissionParams.SetY(transmissionNdLBias);
  71. transmissionParams.SetZ(distanceAttenuation);
  72. transmissionParams.SetW(scale);
  73. }
  74. Vector4 transmissionTintThickness;
  75. transmissionTintThickness.Set(tintColor.GetAsVector3());
  76. transmissionTintThickness.SetW(thickness);
  77. context.GetMaterialShaderParameter()->SetParameter(m_scatterDistance, scatterDistance);
  78. context.GetMaterialShaderParameter()->SetParameter(m_transmissionParams, transmissionParams);
  79. context.GetMaterialShaderParameter()->SetParameter(m_transmissionTintThickness, transmissionTintThickness);
  80. }
  81. bool SubsurfaceTransmissionParameterFunctor::UpdateShaderParameterConnections(const RPI::MaterialShaderParameterLayout* layout)
  82. {
  83. bool valid = true;
  84. if (m_scatterDistance.ValidateOrFindIndex(layout) == false)
  85. {
  86. AZ_Error(
  87. "SubsurfaceTransmissionParameterFunctorSourceData",
  88. false,
  89. "Could not find shader parameter '%s'",
  90. m_scatterDistance.GetName().GetCStr());
  91. valid &= false;
  92. }
  93. if (m_transmissionParams.ValidateOrFindIndex(layout) == false)
  94. {
  95. AZ_Error(
  96. "SubsurfaceTransmissionParameterFunctorSourceData",
  97. false,
  98. "Could not find shader parameter '%s'",
  99. m_transmissionParams.GetName().GetCStr());
  100. valid &= false;
  101. }
  102. if (m_transmissionTintThickness.ValidateOrFindIndex(layout) == false)
  103. {
  104. AZ_Error(
  105. "SubsurfaceTransmissionParameterFunctorSourceData",
  106. false,
  107. "Could not find shader parameter '%s'",
  108. m_transmissionTintThickness.GetName().GetCStr());
  109. valid &= false;
  110. }
  111. return valid;
  112. }
  113. } // namespace Render
  114. } // namespace AZ