3
0

SubsurfaceTransmissionParameterFunctor.cpp 5.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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.GetShaderResourceGroup()->SetConstant(m_scatterDistance, scatterDistance);
  78. context.GetShaderResourceGroup()->SetConstant(m_transmissionParams, transmissionParams);
  79. context.GetShaderResourceGroup()->SetConstant(m_transmissionTintThickness, transmissionTintThickness);
  80. }
  81. } // namespace Render
  82. } // namespace AZ