Kaynağa Gözat

Vertex color support (#18044)

* Add vertex color support

Add vertex color property to BasePBR, StandardPBR and EnhancedPBR materials
Add vertex color node to Material Canvas
Add vertex color to viewport model ShaderBall.fbx

Signed-off-by: Akio Gaule <[email protected]>
Akio Gaule 1 yıl önce
ebeveyn
işleme
a20fb6e01b
28 değiştirilmiş dosya ile 1023 ekleme ve 21 silme
  1. 3 0
      Gems/Atom/Feature/Common/Assets/Materials/Types/BasePBR.azsli
  2. 3 0
      Gems/Atom/Feature/Common/Assets/Materials/Types/BasePBR.materialtype
  3. 38 0
      Gems/Atom/Feature/Common/Assets/Materials/Types/BasePBR_VertexColorEnableFeature.lua
  4. 3 0
      Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.azsli
  5. 3 0
      Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype
  6. 47 0
      Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/VertexColorPropertyGroup.json
  7. 1 1
      Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.azsli
  8. 3 0
      Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.azsli
  9. 3 0
      Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype
  10. 2 0
      Gems/Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_MaterialSrg.azsli
  11. 13 4
      Gems/Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_SurfaceEval.azsli
  12. 20 0
      Gems/Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_VertexData.azsli
  13. 24 2
      Gems/Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_VertexEval.azsli
  14. 2 0
      Gems/Atom/Feature/Common/Assets/Shaders/Materials/EnhancedPBR/EnhancedPBR_MaterialSrg.azsli
  15. 3 0
      Gems/Atom/Feature/Common/Assets/Shaders/Materials/EnhancedPBR/EnhancedPBR_VertexData.azsli
  16. 5 3
      Gems/Atom/Feature/Common/Assets/Shaders/Materials/EnhancedPBR/EnhancedPBR_VertexEval.azsli
  17. 20 0
      Gems/Atom/Feature/Common/Assets/Shaders/Materials/MaterialInputs/VertexColorInput.azsli
  18. 2 0
      Gems/Atom/Feature/Common/Assets/Shaders/Materials/StandardPBR/StandardPBR_MaterialSrg.azsli
  19. 9 5
      Gems/Atom/Feature/Common/Assets/Shaders/Materials/StandardPBR/StandardPBR_SurfaceEval.azsli
  20. 4 0
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Common.azsli
  21. 1 0
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_SurfaceEval.azsli
  22. 15 2
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_VertexEval.azsli
  23. 4 0
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Common.azsli
  24. 1 0
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_SurfaceEval.azsli
  25. 16 2
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_VertexEval.azsli
  26. 78 0
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/Vertex/color.materialgraphnode
  27. 698 0
      Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/TestData/test_vertex_color.materialgraph
  28. 2 2
      Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Shaderball.fbx

+ 3 - 0
Gems/Atom/Feature/Common/Assets/Materials/Types/BasePBR.azsli

@@ -5,6 +5,8 @@
  * SPDX-License-Identifier: Apache-2.0 OR MIT
  *
  */
+
+#define ENABLE_VERTEX_COLOR 1
     
 //TODO(MaterialPipeline): Inline the MaterialSrg files since they aren't reused.
 //TODO(MaterialPipeline): Try removing different parts of the SRG and see how hard/easy it is to customize the surface function.
@@ -16,6 +18,7 @@
 #if MATERIALPIPELINE_SHADER_HAS_PIXEL_STAGE
 
     COMMON_OPTIONS_BASE_COLOR()
+    COMMON_OPTIONS_VERTEX_COLOR()
     COMMON_OPTIONS_ROUGHNESS()
     COMMON_OPTIONS_METALLIC()
     COMMON_OPTIONS_SPECULAR_F0()

+ 3 - 0
Gems/Atom/Feature/Common/Assets/Materials/Types/BasePBR.materialtype

@@ -15,6 +15,9 @@
             { 
                 "$import": "MaterialInputs/BaseColorPropertyGroup.json"
             },
+            { 
+                "$import": "MaterialInputs/VertexColorPropertyGroup.json"
+            },
             {
                 "$import": "MaterialInputs/MetallicPropertyGroup.json"
             },

+ 38 - 0
Gems/Atom/Feature/Common/Assets/Materials/Types/BasePBR_VertexColorEnableFeature.lua

@@ -0,0 +1,38 @@
+--------------------------------------------------------------------------------------
+--
+-- Copyright (c) Contributors to the Open 3D Engine Project.
+-- For complete copyright and license terms please see the LICENSE at the root of this distribution.
+--
+-- SPDX-License-Identifier: Apache-2.0 OR MIT
+--
+--
+--
+----------------------------------------------------------------------------------------------------
+
+-- This functor controls the flag that enables the overall feature for the shader.
+
+function GetMaterialPropertyDependencies()
+    return { "enable" }
+end
+
+function GetShaderOptionDependencies()
+    return { "o_useVertexColor" }
+end
+ 
+function Process(context)
+    local enable = context:GetMaterialPropertyValue_bool("enable")
+    context:SetShaderOptionValue_bool("o_useVertexColor", enable)
+end
+
+function ProcessEditor(context)
+    local enable = context:GetMaterialPropertyValue_bool("enable")
+    local mainVisibility
+    if(enable) then
+        mainVisibility = MaterialPropertyVisibility_Enabled
+    else
+        mainVisibility = MaterialPropertyVisibility_Disabled
+    end
+
+    context:SetMaterialPropertyVisibility("factor", mainVisibility)
+    context:SetMaterialPropertyVisibility("blendMode", mainVisibility)    
+end

+ 3 - 0
Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.azsli

@@ -8,6 +8,8 @@
 
 #pragma once
 
+#define ENABLE_VERTEX_COLOR 1
+
 //TODO(MaterialPipeline): Inline the MaterialSrg files since they aren't reused.
 //TODO(MaterialPipeline): Try removing different parts of the SRG and see how hard/easy it is to customize the surface function.
 #include <Atom/Feature/Common/Assets/Shaders/Materials/EnhancedPBR/EnhancedPBR_MaterialSrg.azsli>
@@ -24,6 +26,7 @@
     #include "Atom/Feature/Common/Assets/Shaders/Materials/MaterialInputs/TransmissionInput.azsli"
 
     COMMON_OPTIONS_BASE_COLOR()
+    COMMON_OPTIONS_VERTEX_COLOR()
     COMMON_OPTIONS_ROUGHNESS()
     COMMON_OPTIONS_METALLIC()
     COMMON_OPTIONS_SPECULAR_F0()

+ 3 - 0
Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype

@@ -33,6 +33,9 @@
             { 
                 "$import": "MaterialInputs/BaseColorPropertyGroup.json"
             },
+            { 
+                "$import": "MaterialInputs/VertexColorPropertyGroup.json"
+            },
             { 
                 "$import": "MaterialInputs/MetallicPropertyGroup.json"
             },

+ 47 - 0
Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/VertexColorPropertyGroup.json

@@ -0,0 +1,47 @@
+{
+    "name": "vertexColor",
+    "displayName": "Vertex Color",
+    "description": "Properties for configuring the vertex color.",
+    "properties": [
+        {
+            "name": "enable",
+            "displayName": "Use Vertex Color",
+            "description": "Whether to use vertex color.",
+            "type": "Bool",
+            "defaultValue": false
+        },
+        {
+            "name": "factor",
+            "displayName": "Vertex Color Factor",
+            "description": "Factor for blending Color and Vertex Color. The behavior depends on Vertex Color Blend Mode.",
+            "type": "Float",
+            "defaultValue": 1.0,
+            "min": 0.0,
+            "max": 1.0,
+            "connection": {
+                "type": "ShaderInput",
+                "name": "m_vertexColorFactor"
+            }
+        },
+        {
+            "name": "blendMode",
+            "displayName": "Vertex Color Blend Mode",
+            "description": "Selects the equation to use when combining Color, Factor, and Vertex Color.",
+            "type": "Enum",
+            "enumValues": [ "Multiply", "LinearLight", "Lerp", "Overlay" ],
+            "defaultValue": "Multiply",
+            "connection": {
+                "type": "ShaderOption",
+                "name": "o_vertexColorBlendMode"
+            }
+        }
+    ],
+    "functors": [
+        {
+            "type": "Lua",
+            "args": {
+                "file": "Materials/Types/BasePBR_VertexColorEnableFeature.lua"
+            }
+        }
+    ]
+}

+ 1 - 1
Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.azsli

@@ -83,7 +83,7 @@ option enum class OpacityMode {Opaque, Cutout, Blended, TintedTransparent} o_opa
         uint instanceId,
         bool useVertexBlendMask)
     {
-        VsOutput output = EvaluateVertexGeometry_BasePBR(position, normal, tangent, uv0, uv1, instanceId);
+        VsOutput output = EvaluateVertexGeometry_BasePBR(position, normal, tangent, uv0, uv1, float4(1.0f, 1.0f, 1.0f, 1.0f), instanceId, false);
 
         if(useVertexBlendMask)
         {

+ 3 - 0
Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.azsli

@@ -8,6 +8,8 @@
 
 #pragma once
 
+#define ENABLE_VERTEX_COLOR 1
+
 //TODO(MaterialPipeline): Inline the MaterialSrg files since they aren't reused.
 //TODO(MaterialPipeline): Try removing different parts of the SRG and see how hard/easy it is to customize the surface function.
 #include <Atom/Feature/Common/Assets/Shaders/Materials/StandardPBR/StandardPBR_MaterialSrg.azsli>
@@ -18,6 +20,7 @@
 #if MATERIALPIPELINE_SHADER_HAS_PIXEL_STAGE
 
     COMMON_OPTIONS_BASE_COLOR()
+    COMMON_OPTIONS_VERTEX_COLOR()
     COMMON_OPTIONS_ROUGHNESS()
     COMMON_OPTIONS_METALLIC()
     COMMON_OPTIONS_SPECULAR_F0()

+ 3 - 0
Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype

@@ -21,6 +21,9 @@
             { 
                 "$import": "MaterialInputs/BaseColorPropertyGroup.json"
             },
+            { 
+                "$import": "MaterialInputs/VertexColorPropertyGroup.json"
+            },
             { 
                 "$import": "MaterialInputs/MetallicPropertyGroup.json"
             },

+ 2 - 0
Gems/Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_MaterialSrg.azsli

@@ -9,6 +9,7 @@
 #pragma once 
 
 #include "../MaterialInputs/BaseColorInput.azsli"
+#include "../MaterialInputs/VertexColorInput.azsli"
 #include "../MaterialInputs/RoughnessInput.azsli"
 #include "../MaterialInputs/MetallicInput.azsli"
 #include "../MaterialInputs/SpecularInput.azsli"
@@ -22,6 +23,7 @@ ShaderResourceGroup MaterialSrg : SRG_PerMaterial
 {
     // Auto-generate material SRG fields for common inputs
     COMMON_SRG_INPUTS_BASE_COLOR()
+    COMMON_SRG_INPUTS_VERTEX_COLOR()
     COMMON_SRG_INPUTS_ROUGHNESS()
     COMMON_SRG_INPUTS_METALLIC()
     COMMON_SRG_INPUTS_SPECULAR_F0()

+ 13 - 4
Gems/Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_SurfaceEval.azsli

@@ -25,7 +25,8 @@ Surface EvaluateSurface_BasePBR(
     float2 uvs[UvSetCount],
     bool isFrontFace,
     float4 uvDxDy,
-    bool customDerivatives)
+    bool customDerivatives,
+    float4 vertexColor)
 {
     Surface surface;
     surface.position = positionWS;
@@ -52,6 +53,11 @@ Surface EvaluateSurface_BasePBR(
     float2 baseColorUv = uvs[MaterialSrg::m_baseColorMapUvIndex];
     real3 sampledColor = GetBaseColorInput(MaterialSrg::m_baseColorMap, MaterialSrg::m_sampler, baseColorUv, real3(MaterialSrg::m_baseColor.rgb), o_baseColor_useTexture, uvDxDy, customDerivatives);
     real3 baseColor = BlendBaseColor(sampledColor, real3(MaterialSrg::m_baseColor.rgb), real(MaterialSrg::m_baseColorFactor), o_baseColorTextureBlendMode, o_baseColor_useTexture);
+    // Check to ensure the material is using vertex colors (i.e o_useVertexColor) and that the mesh supports color vertex stream (i.e o_color0_isBound)
+    if(o_useVertexColor && o_color0_isBound)
+    {
+        baseColor = BlendBaseColor(real3(vertexColor.rgb), baseColor, real(MaterialSrg::m_vertexColorFactor), o_vertexColorBlendMode, true);
+    }
     
     // ------- Metallic -------
 
@@ -93,7 +99,8 @@ Surface EvaluateSurface_BasePBR(
         uvs,
         isFrontFace,
         float4(0.0f, 0.0f, 0.0f, 0.0f),
-        false);
+        false,
+        float4(1.0f, 1.0f, 1.0f, 1.0f));
 }
 
 Surface EvaluateSurface_BasePBR(VsOutput IN, PixelGeometryData geoData, float4 uvDxDy, bool customDerivatives)
@@ -106,7 +113,8 @@ Surface EvaluateSurface_BasePBR(VsOutput IN, PixelGeometryData geoData, float4 u
         geoData.uvs,
         geoData.isFrontFace,
         uvDxDy,
-        customDerivatives);
+        customDerivatives,
+        IN.color0);
 }
 
 Surface EvaluateSurface_BasePBR(VsOutput IN, PixelGeometryData geoData)
@@ -119,5 +127,6 @@ Surface EvaluateSurface_BasePBR(VsOutput IN, PixelGeometryData geoData)
         geoData.uvs,
         geoData.isFrontFace,
         float4(0.0f, 0.0f, 0.0f, 0.0f),
-        false);
+        false,
+        IN.color0);
 }

+ 20 - 0
Gems/Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_VertexData.azsli

@@ -23,6 +23,15 @@
 #define VsOutput        VsOutput_BasePBR
 #endif
 
+#ifndef ENABLE_VERTEX_COLOR
+#define ENABLE_VERTEX_COLOR 0
+#endif
+
+
+#if ENABLE_VERTEX_COLOR
+option bool o_color0_isBound = false;
+#endif
+
 struct VsInput_BasePBR
 {
     // Base fields (required by the template azsli file)...
@@ -35,6 +44,12 @@ struct VsInput_BasePBR
     // Extended fields (only referenced in this azsl file)...
     float2 uv0 : UV0;
     float2 uv1 : UV1;
+
+#if ENABLE_VERTEX_COLOR
+    // This gets set automatically by the system at runtime only if it's available.
+    // There is a soft naming convention that associates this with o_color0_isBound, which will be set to true whenever o_color0_isBound is available.
+    float4 m_optional_color0 : COLOR0;
+#endif
 };
 
 struct VsSystemValues_BasePBR
@@ -55,4 +70,9 @@ struct VsOutput_BasePBR
     // Extended fields (only referenced in this azsl file)...
     float2 uvs[UvSetCount] : UV1;
     uint m_instanceId : SV_InstanceID;
+
+#if ENABLE_VERTEX_COLOR
+    // Optional
+    float4 color0 : UV7; // Using UV7 just to leave some room for non optional attributes
+#endif
 };

+ 24 - 2
Gems/Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_VertexEval.azsli

@@ -25,7 +25,9 @@ VsOutput EvaluateVertexGeometry_BasePBR(
     float4 tangent,
     float2 uv0,
     float2 uv1,
-    uint instanceId)
+    float4 color0,
+    uint instanceId,
+    bool useVertexColor0)
 {
     VsOutput output;
 
@@ -41,6 +43,17 @@ VsOutput EvaluateVertexGeometry_BasePBR(
     output.normal = normal;
     output.tangent = tangent;
 
+#if ENABLE_VERTEX_COLOR
+    if(useVertexColor0)
+    {
+        output.color0 =  color0;
+    }
+    else
+    {
+        output.color0 = float4(1,1,1,1);
+    }
+#endif
+
     // Set the instanceId on the output so the pixel shader can use it
     // since you can't use SV_InstanceID for both a vertex and a pixel shader at the same time
     output.m_instanceId = instanceId;
@@ -50,11 +63,20 @@ VsOutput EvaluateVertexGeometry_BasePBR(
 
 VsOutput EvaluateVertexGeometry_BasePBR(VsInput IN, VsSystemValues SV)
 {
+#if ENABLE_VERTEX_COLOR
+    float4 color0 = IN.m_optional_color0;
+    bool useVertexColor0 = o_color0_isBound;
+#else
+    float4 color0 = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    bool useVertexColor0 = false;
+#endif
     return EvaluateVertexGeometry_BasePBR(
         IN.position,
         IN.normal,
         IN.tangent,
         IN.uv0,
         IN.uv1,
-        SV.m_instanceId);
+        color0,
+        SV.m_instanceId,
+        useVertexColor0);
 }

+ 2 - 0
Gems/Atom/Feature/Common/Assets/Shaders/Materials/EnhancedPBR/EnhancedPBR_MaterialSrg.azsli

@@ -12,6 +12,7 @@
 #include <Atom/Features/PBR/LightingOptions.azsli>
 
 #include "../MaterialInputs/BaseColorInput.azsli"
+#include "../MaterialInputs/VertexColorInput.azsli"
 #include "../MaterialInputs/RoughnessInput.azsli"
 #include "../MaterialInputs/MetallicInput.azsli"
 #include "../MaterialInputs/SpecularInput.azsli"
@@ -29,6 +30,7 @@ ShaderResourceGroup MaterialSrg : SRG_PerMaterial
 {
     // Auto-generate material SRG fields for common inputs
     COMMON_SRG_INPUTS_BASE_COLOR()
+    COMMON_SRG_INPUTS_VERTEX_COLOR()
     COMMON_SRG_INPUTS_ROUGHNESS()
     COMMON_SRG_INPUTS_METALLIC()
     COMMON_SRG_INPUTS_SPECULAR_F0()

+ 3 - 0
Gems/Atom/Feature/Common/Assets/Shaders/Materials/EnhancedPBR/EnhancedPBR_VertexData.azsli

@@ -38,6 +38,9 @@
         // Extended fields (only referenced in this azsl file)...
         float2 uvs[UvSetCount] : UV1;
         float2 detailUvs[UvSetCount] : UV3;
+
+        // Optional
+        float4 color0 : UV7; // Using UV7 just to leave some room for non optional attributes
     };
 
 #endif

+ 5 - 3
Gems/Atom/Feature/Common/Assets/Shaders/Materials/EnhancedPBR/EnhancedPBR_VertexEval.azsli

@@ -24,10 +24,11 @@ VsOutput EvaluateVertexGeometry_EnhancedPBR(
     float4 tangent,
     float2 uv0,
     float2 uv1,
-    uint instanceId)
+    uint instanceId,
+    float4 color0)
 {
     // BasePBRP
-    VsOutput output = EvaluateVertexGeometry_BasePBR(position, normal, tangent, uv0, uv1, instanceId);
+    VsOutput output = EvaluateVertexGeometry_BasePBR(position, normal, tangent, uv0, uv1, color0, instanceId, o_color0_isBound);
 
     // Detail UVs
     float2 detailUvs[UvSetCount] = { uv0, uv1 };
@@ -44,5 +45,6 @@ VsOutput EvaluateVertexGeometry_EnhancedPBR(VsInput IN, VsSystemValues SV)
         IN.tangent,
         IN.uv0,
         IN.uv1,
-        SV.m_instanceId);
+        SV.m_instanceId,
+        IN.m_optional_color0);
 }

+ 20 - 0
Gems/Atom/Feature/Common/Assets/Shaders/Materials/MaterialInputs/VertexColorInput.azsli

@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#pragma once
+
+// These macros can be used to declare common shader inputs for this feature. 
+// Use the COMMON_SRG_INPUTS_* macro in your material SRG definition, and use the COMMON_OPTIONS_* macro at the global scope in your shader. Then you can pass these variables to the Get*Input() function below.
+// You can optionally provide a prefix for the set of inputs which corresponds to a prefix string supplied by the .materialtype file. This is common for multi-layered material types.
+
+#define COMMON_SRG_INPUTS_VERTEX_COLOR(prefix) \
+float     prefix##m_vertexColorFactor;
+
+#define COMMON_OPTIONS_VERTEX_COLOR(prefix) \
+option bool prefix##o_useVertexColor; \
+option TextureBlendMode prefix##o_vertexColorBlendMode = TextureBlendMode::Multiply;

+ 2 - 0
Gems/Atom/Feature/Common/Assets/Shaders/Materials/StandardPBR/StandardPBR_MaterialSrg.azsli

@@ -12,6 +12,7 @@
 #include <Atom/Features/PBR/AlphaUtils.azsli>
 
 #include "../MaterialInputs/BaseColorInput.azsli"
+#include "../MaterialInputs/VertexColorInput.azsli"
 #include "../MaterialInputs/RoughnessInput.azsli"
 #include "../MaterialInputs/MetallicInput.azsli"
 #include "../MaterialInputs/SpecularInput.azsli"
@@ -29,6 +30,7 @@ ShaderResourceGroup MaterialSrg : SRG_PerMaterial
 {
     // Auto-generate material SRG fields for common inputs
     COMMON_SRG_INPUTS_BASE_COLOR()
+    COMMON_SRG_INPUTS_VERTEX_COLOR()
     COMMON_SRG_INPUTS_ROUGHNESS()
     COMMON_SRG_INPUTS_METALLIC()
     COMMON_SRG_INPUTS_SPECULAR_F0()

+ 9 - 5
Gems/Atom/Feature/Common/Assets/Shaders/Materials/StandardPBR/StandardPBR_SurfaceEval.azsli

@@ -28,9 +28,10 @@ Surface EvaluateSurface_StandardPBR(
     bool isFrontFace,
     bool isDisplacementClipped,
     float4 uvDxDy,
-    bool customDerivatives)
+    bool customDerivatives,
+    float4 vertexColor)
 {
-    Surface surface = EvaluateSurface_BasePBR(positionWS, vertexNormal, tangents, bitangents, uvs, isFrontFace, uvDxDy, customDerivatives);
+    Surface surface = EvaluateSurface_BasePBR(positionWS, vertexNormal, tangents, bitangents, uvs, isFrontFace, uvDxDy, customDerivatives, vertexColor);
 
     // ------- Parallax Clipping -------
 
@@ -101,7 +102,8 @@ Surface EvaluateSurface_StandardPBR(
         isFrontFace,
         isDisplacementClipped,
         float4(0.0f, 0.0f, 0.0f, 0.0f),
-        false);
+        false,
+        float4(1.0f, 1.0f, 1.0f, 1.0f));
 }
 
 Surface EvaluateSurface_StandardPBR(VsOutput IN, PixelGeometryData geoData, float4 uvDxDy, bool customDerivatives)
@@ -115,7 +117,8 @@ Surface EvaluateSurface_StandardPBR(VsOutput IN, PixelGeometryData geoData, floa
         geoData.isFrontFace,
         geoData.isDisplacementClipped,
         uvDxDy,
-        customDerivatives);
+        customDerivatives,
+        IN.color0);
 }
 
 Surface EvaluateSurface_StandardPBR(VsOutput IN, PixelGeometryData geoData)
@@ -129,5 +132,6 @@ Surface EvaluateSurface_StandardPBR(VsOutput IN, PixelGeometryData geoData)
         geoData.isFrontFace,
         geoData.isDisplacementClipped,
         float4(0.0f, 0.0f, 0.0f, 0.0f),
-        false);
+        false,
+        IN.color0);
 }

+ 4 - 0
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_Common.azsli

@@ -13,6 +13,10 @@
 #define ENABLE_PARALLAX 0
 #endif
 
+#ifndef ENABLE_VERTEX_COLOR
+#define ENABLE_VERTEX_COLOR 1
+#endif
+
 #ifndef UvSetCount
 #define UvSetCount 2
 #endif

+ 1 - 0
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_SurfaceEval.azsli

@@ -38,6 +38,7 @@ Surface EvaluateSurface_MaterialGraphName(
     const float3 O3DE_MC_NORMAL_WS = normalWS;
     const float3 O3DE_MC_TANGENT_WS = tangents[0];
     const float3 O3DE_MC_BITANGENT_WS = bitangents[0];
+    const float4 O3DE_MC_COLOR = IN.color0;
     #define O3DE_MC_UV(index) uvs[clamp(index, 0, UvSetCount-1)];
 
     // m_placeHolder keeps MaterialSrg from being compiled out when iterating on graphs

+ 15 - 2
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/BasePBR/MaterialGraphName_VertexEval.azsli

@@ -24,7 +24,9 @@ VsOutput EvaluateVertexGeometry_MaterialGraphName(
     real4 tangent,
     float2 uv0,
     float2 uv1,
-    uint instanceId)
+    float4 color0,
+    uint instanceId,
+    bool useVertexColor0)
 {
     const float4x4 objectToWorld = GetObjectToWorldMatrix(instanceId);
     const float3x3 objectToWorldIT = GetObjectToWorldMatrixInverseTranspose(instanceId);
@@ -42,6 +44,7 @@ VsOutput EvaluateVertexGeometry_MaterialGraphName(
     const float3 O3DE_MC_NORMAL_WS = normalWS;
     const float3 O3DE_MC_TANGENT_WS = tangentWS;
     const float3 O3DE_MC_BITANGENT_WS = bitangentWS;
+    const float4 O3DE_MC_COLOR = color0;
     #define O3DE_MC_UV(index) (index == 0 ? uv0 : uv1);
 
     // m_placeHolder keeps MaterialSrg from being compiled out when iterating on graphs
@@ -61,6 +64,14 @@ VsOutput EvaluateVertexGeometry_MaterialGraphName(
     output.normal = normal;
     output.tangent = tangent;
     output.m_instanceId = instanceId;
+    if(useVertexColor0)
+    {
+        output.color0 =  color0;
+    }
+    else
+    {
+        output.color0 = float4(1,1,1,1);
+    }
     return output;
 }
 
@@ -72,5 +83,7 @@ VsOutput EvaluateVertexGeometry_MaterialGraphName(VsInput IN, VsSystemValues SV)
         real4(IN.tangent),
         IN.uv0,
         IN.uv1,
-        SV.m_instanceId);
+        IN.m_optional_color0,
+        SV.m_instanceId,
+        o_color0_isBound);
 }

+ 4 - 0
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_Common.azsli

@@ -17,6 +17,10 @@
 #define ENABLE_PARALLAX 0
 #endif
 
+#ifndef ENABLE_VERTEX_COLOR
+#define ENABLE_VERTEX_COLOR 1
+#endif
+
 #ifndef UvSetCount
 #define UvSetCount 2
 #endif

+ 1 - 0
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_SurfaceEval.azsli

@@ -40,6 +40,7 @@ Surface EvaluateSurface_MaterialGraphName(
     const float3 O3DE_MC_NORMAL_WS = normalWS;
     const float3 O3DE_MC_TANGENT_WS = tangents[0];
     const float3 O3DE_MC_BITANGENT_WS = bitangents[0];
+    const float4 O3DE_MC_COLOR = IN.color0;
     #define O3DE_MC_UV(index) uvs[clamp(index, 0, UvSetCount-1)];
 
     // m_placeHolder keeps MaterialSrg from being compiled out when iterating on graphs

+ 16 - 2
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/MaterialOutputs/StandardPBR/MaterialGraphName_VertexEval.azsli

@@ -24,7 +24,9 @@ VsOutput EvaluateVertexGeometry_MaterialGraphName(
     real4 tangent,
     float2 uv0,
     float2 uv1,
-    uint instanceId)
+    float4 color0,
+    uint instanceId,
+    bool useVertexColor0)
 {
     const float4x4 objectToWorld = GetObjectToWorldMatrix(instanceId);
     const float3x3 objectToWorldIT = GetObjectToWorldMatrixInverseTranspose(instanceId);
@@ -42,6 +44,7 @@ VsOutput EvaluateVertexGeometry_MaterialGraphName(
     const float3 O3DE_MC_NORMAL_WS = normalWS;
     const float3 O3DE_MC_TANGENT_WS = tangentWS;
     const float3 O3DE_MC_BITANGENT_WS = bitangentWS;
+    const float4 O3DE_MC_COLOR = color0;
     #define O3DE_MC_UV(index) (index == 0 ? uv0 : uv1);
 
     // m_placeHolder keeps MaterialSrg from being compiled out when iterating on graphs
@@ -61,6 +64,15 @@ VsOutput EvaluateVertexGeometry_MaterialGraphName(
     output.normal = normal;
     output.tangent = tangent;
     output.m_instanceId = instanceId;
+    if(useVertexColor0)
+    {
+        output.color0 =  color0;
+    }
+    else
+    {
+        output.color0 = float4(1,1,1,1);
+    }
+
     return output;
 }
 
@@ -72,5 +84,7 @@ VsOutput EvaluateVertexGeometry_MaterialGraphName(VsInput IN, VsSystemValues SV)
         real4(IN.tangent),
         IN.uv0,
         IN.uv1,
-        SV.m_instanceId);
+        IN.m_optional_color0,        
+        SV.m_instanceId,
+        o_color0_isBound);
 }

+ 78 - 0
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/GraphData/Nodes/Vertex/color.materialgraphnode

@@ -0,0 +1,78 @@
+{
+    "Type": "JsonSerialization",
+    "Version": 1,
+    "ClassName": "DynamicNodeConfig",
+    "ClassData": {
+        "id": "{65F174D6-8D10-4E64-ABF1-1B8861E14063}",
+        "category": "Vertex",
+        "title": "Vertex Color",
+        "titlePaletteName": "VertexNodeTitlePalette",
+        "description": "The color the current vertex",
+        "slotDataTypeGroups": [
+            "outColor",
+            "outR|outG|outB|outA"
+        ],
+        "settings": {
+            "instructions": [
+                "float4 outColor = O3DE_MC_COLOR;"
+            ]
+        },
+        "outputSlots": [
+            {
+                "name": "outColor",
+                "displayName": "Color",
+                "description": "Color",
+                "supportedDataTypeRegex": "float4",
+                "defaultDataType": "float4"
+            },
+            {
+                "name": "outR",
+                "displayName": "R",
+                "description": "R",
+                "supportedDataTypeRegex": "float",
+                "defaultDataType": "float",
+                "settings": {
+                    "instructions": [
+                        "SLOTTYPE SLOTNAME = outColor.r;"
+                    ]
+                }
+            },
+            {
+                "name": "outB",
+                "displayName": "B",
+                "description": "B",
+                "supportedDataTypeRegex": "float",
+                "defaultDataType": "float",
+                "settings": {
+                    "instructions": [
+                        "SLOTTYPE SLOTNAME = outUV.g;"
+                    ]
+                }
+            },
+            {
+                "name": "outG",
+                "displayName": "G",
+                "description": "G",
+                "supportedDataTypeRegex": "float",
+                "defaultDataType": "float",
+                "settings": {
+                    "instructions": [
+                        "SLOTTYPE SLOTNAME = outUV.b;"
+                    ]
+                }
+            },
+            {
+                "name": "outA",
+                "displayName": "A",
+                "description": "A",
+                "supportedDataTypeRegex": "float",
+                "defaultDataType": "float",
+                "settings": {
+                    "instructions": [
+                        "SLOTTYPE SLOTNAME = outUV.a;"
+                    ]
+                }
+            }
+        ]
+    }
+}

+ 698 - 0
Gems/Atom/Tools/MaterialCanvas/Assets/MaterialCanvas/TestData/test_vertex_color.materialgraph

@@ -0,0 +1,698 @@
+{
+    "Type": "JsonSerialization",
+    "Version": 1,
+    "ClassName": "Graph",
+    "ClassData": {
+        "m_nodes": [
+            {
+                "Key": 11,
+                "Value": {
+                    "$type": "DynamicNode",
+                    "m_propertySlots": [
+                        {
+                            "Key": {
+                                "m_name": "inApplySpecularAA"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "bool",
+                                    "Value": true
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inCastShadows"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "bool",
+                                    "Value": true
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inDescription"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+                                    "Value": ""
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inDoubleSided"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "bool",
+                                    "Value": false
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inEnableAreaLights"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "bool",
+                                    "Value": true
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inEnableDirectionalLights"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "bool",
+                                    "Value": true
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inEnableIBL"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "bool",
+                                    "Value": true
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inEnableNormal"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "bool",
+                                    "Value": false
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inEnablePunctualLights"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "bool",
+                                    "Value": true
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inEnableShadows"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "bool",
+                                    "Value": true
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inUseForwardPassIBLSpecular"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "bool",
+                                    "Value": true
+                                }
+                            }
+                        }
+                    ],
+                    "m_inputDataSlots": [
+                        {
+                            "Key": {
+                                "m_name": "inBaseColor"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "Vector3",
+                                    "Value": [
+                                        1.0,
+                                        1.0,
+                                        1.0
+                                    ]
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inMetallic"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "float",
+                                    "Value": 0.0
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inNormal"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "Vector3",
+                                    "Value": [
+                                        0.0,
+                                        0.0,
+                                        0.0
+                                    ]
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inPositionOffset"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "Vector3",
+                                    "Value": [
+                                        0.0,
+                                        0.0,
+                                        0.0
+                                    ]
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inRoughness"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "float",
+                                    "Value": 0.0
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inSpecularF0Factor"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "float",
+                                    "Value": 0.0
+                                }
+                            }
+                        }
+                    ],
+                    "toolId": {
+                        "Value": 2034248906
+                    },
+                    "configId": "{B352A2E4-D6A6-4178-9406-57716051024F}"
+                }
+            },
+            {
+                "Key": 13,
+                "Value": {
+                    "$type": "DynamicNode",
+                    "toolId": {
+                        "Value": 2034248906
+                    },
+                    "configId": "{65F174D6-8D10-4E64-ABF1-1B8861E14063}"
+                }
+            },
+            {
+                "Key": 14,
+                "Value": {
+                    "$type": "DynamicNode",
+                    "m_inputDataSlots": [
+                        {
+                            "Key": {
+                                "m_name": "inValue1"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "Vector4",
+                                    "Value": [
+                                        0.0,
+                                        0.0,
+                                        0.0,
+                                        0.0
+                                    ]
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "m_name": "inValue2"
+                            },
+                            "Value": {
+                                "m_value": {
+                                    "$type": "Vector4",
+                                    "Value": [
+                                        0.0,
+                                        0.5,
+                                        0.0,
+                                        0.0
+                                    ]
+                                }
+                            }
+                        }
+                    ],
+                    "toolId": {
+                        "Value": 2034248906
+                    },
+                    "configId": "{FEA94EB4-72AA-4CC2-80F5-75A62ED9B7CA}"
+                }
+            }
+        ],
+        "m_connections": [
+            {
+                "m_sourceEndpoint": [
+                    13,
+                    {
+                        "m_name": "outColor"
+                    }
+                ],
+                "m_targetEndpoint": [
+                    14,
+                    {
+                        "m_name": "inValue1"
+                    }
+                ]
+            },
+            {
+                "m_sourceEndpoint": [
+                    14,
+                    {
+                        "m_name": "outValue"
+                    }
+                ],
+                "m_targetEndpoint": [
+                    11,
+                    {
+                        "m_name": "inBaseColor"
+                    }
+                ]
+            }
+        ],
+        "m_uiMetadata": {
+            "m_sceneMetadata": {
+                "ComponentData": {
+                    "{5F84B500-8C45-40D1-8EFC-A5306B241444}": {
+                        "$type": "SceneComponentSaveData",
+                        "ViewParams": {
+                            "Scale": 0.85,
+                            "AnchorX": 268.23529052734375,
+                            "AnchorY": -489.4117736816406
+                        }
+                    }
+                }
+            },
+            "m_nodeMetadata": [
+                {
+                    "Key": 1,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                "$type": "GeneralNodeTitleComponentSaveData",
+                                "PaletteOverride": "DefaultNodeTitlePalette"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    760.0,
+                                    -200.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{931CC6D4-CD3C-4979-A8E7-DD3458B6BA78}"
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 2,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    300.0,
+                                    120.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{442701F5-F477-4BA6-8C7D-3CDBB5330C8D}"
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 3,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    200.0,
+                                    100.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{3D0698E8-41FE-4601-BF60-CE65F83BD1CF}"
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 4,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    160.0,
+                                    180.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{2D5F8E87-CDF7-4B52-A92F-0319E068032C}"
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 5,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    320.0,
+                                    40.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{C30020BC-EE14-411E-9C65-812EFFC9E8E3}"
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 6,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    180.0,
+                                    -140.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{79D6F1B5-F012-4AB0-9354-B5F9F435E114}"
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 7,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    640.0,
+                                    -80.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{080B66FB-1AB7-4993-87A9-FEC1334F7CC6}"
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 8,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                "$type": "GeneralNodeTitleComponentSaveData",
+                                "PaletteOverride": "DefaultNodeTitlePalette"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    40.0,
+                                    -280.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{86380651-C9D0-4AEC-BE29-36A3338DBFBE}"
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 9,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                "$type": "GeneralNodeTitleComponentSaveData",
+                                "PaletteOverride": "DefaultNodeTitlePalette"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    220.0,
+                                    -60.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{09A7F9FE-A559-44EE-9D21-231D84C33C39}"
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 10,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                "$type": "GeneralNodeTitleComponentSaveData",
+                                "PaletteOverride": "MaterialInputNodeTitlePalette"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    800.0,
+                                    100.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{3BB9B6B0-C7F5-4911-8DA9-2EC6CA2D1C6A}"
+                            },
+                            "{FC18625B-1E97-415D-9832-B222DE054680}": {
+                                "$type": "GraphCanvasSelectionData",
+                                "selected": true
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 11,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                "$type": "GeneralNodeTitleComponentSaveData",
+                                "PaletteOverride": "MaterialOutputNodeTitlePalette"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    1100.0,
+                                    -160.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{554E1782-AC82-4C6E-901B-845554CD7B3B}"
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 12,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                "$type": "GeneralNodeTitleComponentSaveData",
+                                "PaletteOverride": "ConstantNodeTitlePalette"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    660.0,
+                                    -160.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{D745542B-F13F-46EE-A3F4-EC5D895E4FDD}"
+                            },
+                            "{FC18625B-1E97-415D-9832-B222DE054680}": {
+                                "$type": "GraphCanvasSelectionData",
+                                "selected": true
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 13,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                "$type": "GeneralNodeTitleComponentSaveData",
+                                "PaletteOverride": "VertexNodeTitlePalette"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    180.0,
+                                    -340.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{E3A1C1D9-F8D0-4F36-86BC-9E18DCF453A6}"
+                            }
+                        }
+                    }
+                },
+                {
+                    "Key": 14,
+                    "Value": {
+                        "ComponentData": {
+                            "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                "$type": "NodeSaveData"
+                            },
+                            "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                "$type": "GeneralNodeTitleComponentSaveData",
+                                "PaletteOverride": "MathNodeTitlePalette"
+                            },
+                            "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                "$type": "GeometrySaveData",
+                                "Position": [
+                                    420.0,
+                                    -120.0
+                                ]
+                            },
+                            "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                "$type": "StylingComponentSaveData"
+                            },
+                            "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                "$type": "PersistentIdComponentSaveData",
+                                "PersistentId": "{4D51A1A3-C77B-43F9-BF0B-52ECA4C72909}"
+                            }
+                        }
+                    }
+                }
+            ]
+        }
+    }
+}

+ 2 - 2
Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Shaderball.fbx

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:6e63a55a35c749a16a03e10a1f53a48bd426c61db80151de080235b14cf6b70d
-size 2479344
+oid sha256:ad3b5915d503faa0f2ebedb80d6c2d6999f31e108834cc3702153d06c1b2d0cf
+size 2709532