Skip to content

Commit 7a569a8

Browse files
authored
Add backwards compatibility function for materials (o3de#18076)
Signed-off-by: Akio Gaule <[email protected]>
1 parent 3c8f9f4 commit 7a569a8

File tree

11 files changed

+240
-37
lines changed

11 files changed

+240
-37
lines changed

Gems/Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_SurfaceEval.azsli

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88

99
#pragma once
1010

11+
#ifndef ENABLE_VERTEX_COLOR
12+
#define ENABLE_VERTEX_COLOR 0
13+
#endif
14+
1115
// This #define magic lets you use the EvaluateSurface function in this file without making it the final EvaluateSurface
1216
// used in your shader. Simply #define EvaluateSurface to your custom definition before including this file
1317
//
@@ -17,6 +21,18 @@
1721

1822
#include <Atom/Features/MatrixUtility.azsli>
1923

24+
real3 BlendVertexColor(real3 baseColor, real3 vertexColor)
25+
{
26+
#if ENABLE_VERTEX_COLOR
27+
// 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)
28+
if(o_useVertexColor && o_color0_isBound)
29+
{
30+
baseColor = BlendBaseColor(vertexColor, baseColor, real(MaterialSrg::m_vertexColorFactor), o_vertexColorBlendMode, true);
31+
}
32+
#endif
33+
return baseColor;
34+
}
35+
2036
Surface EvaluateSurface_BasePBR(
2137
float3 positionWS,
2238
real3 vertexNormal,
@@ -53,11 +69,7 @@ Surface EvaluateSurface_BasePBR(
5369
float2 baseColorUv = uvs[MaterialSrg::m_baseColorMapUvIndex];
5470
real3 sampledColor = GetBaseColorInput(MaterialSrg::m_baseColorMap, MaterialSrg::m_sampler, baseColorUv, real3(MaterialSrg::m_baseColor.rgb), o_baseColor_useTexture, uvDxDy, customDerivatives);
5571
real3 baseColor = BlendBaseColor(sampledColor, real3(MaterialSrg::m_baseColor.rgb), real(MaterialSrg::m_baseColorFactor), o_baseColorTextureBlendMode, o_baseColor_useTexture);
56-
// 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)
57-
if(o_useVertexColor && o_color0_isBound)
58-
{
59-
baseColor = BlendBaseColor(real3(vertexColor.rgb), baseColor, real(MaterialSrg::m_vertexColorFactor), o_vertexColorBlendMode, true);
60-
}
72+
baseColor = BlendVertexColor(baseColor, real3(vertexColor.rgb));
6173

6274
// ------- Metallic -------
6375

@@ -81,8 +93,39 @@ Surface EvaluateSurface_BasePBR(
8193
return surface;
8294
}
8395

96+
float4 GetVertexColor(VsOutput IN)
97+
{
98+
#if ENABLE_VERTEX_COLOR
99+
return IN.color0;
100+
#else
101+
return float4(1.0f, 1.0f, 1.0f, 1.0f);
102+
#endif
103+
}
104+
84105
// helper function to keep compatible with the previous version
85106
// because dxc compiler doesn't allow default parameters on functions with overloads
107+
Surface EvaluateSurface_BasePBR(
108+
float3 positionWS,
109+
real3 vertexNormal,
110+
float3 tangents[UvSetCount],
111+
float3 bitangents[UvSetCount],
112+
float2 uvs[UvSetCount],
113+
bool isFrontFace,
114+
float4 uvDxDy,
115+
bool customDerivatives)
116+
{
117+
return EvaluateSurface_BasePBR(
118+
positionWS,
119+
vertexNormal,
120+
tangents,
121+
bitangents,
122+
uvs,
123+
isFrontFace,
124+
uvDxDy,
125+
customDerivatives,
126+
float4(1.0f, 1.0f, 1.0f, 1.0f));
127+
}
128+
86129
Surface EvaluateSurface_BasePBR(
87130
float3 positionWS,
88131
real3 vertexNormal,
@@ -99,8 +142,7 @@ Surface EvaluateSurface_BasePBR(
99142
uvs,
100143
isFrontFace,
101144
float4(0.0f, 0.0f, 0.0f, 0.0f),
102-
false,
103-
float4(1.0f, 1.0f, 1.0f, 1.0f));
145+
false);
104146
}
105147

106148
Surface EvaluateSurface_BasePBR(VsOutput IN, PixelGeometryData geoData, float4 uvDxDy, bool customDerivatives)
@@ -114,7 +156,7 @@ Surface EvaluateSurface_BasePBR(VsOutput IN, PixelGeometryData geoData, float4 u
114156
geoData.isFrontFace,
115157
uvDxDy,
116158
customDerivatives,
117-
IN.color0);
159+
GetVertexColor(IN));
118160
}
119161

120162
Surface EvaluateSurface_BasePBR(VsOutput IN, PixelGeometryData geoData)
@@ -128,5 +170,5 @@ Surface EvaluateSurface_BasePBR(VsOutput IN, PixelGeometryData geoData)
128170
geoData.isFrontFace,
129171
float4(0.0f, 0.0f, 0.0f, 0.0f),
130172
false,
131-
IN.color0);
173+
GetVertexColor(IN));
132174
}

Gems/Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_VertexData.azsli

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
#define ENABLE_VERTEX_COLOR 0
2828
#endif
2929

30-
3130
#if ENABLE_VERTEX_COLOR
3231
option bool o_color0_isBound = false;
3332
#endif

Gems/Atom/Feature/Common/Assets/Shaders/Materials/BasePBR/BasePBR_VertexEval.azsli

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88

99
#pragma once
1010

11+
#ifndef ENABLE_VERTEX_COLOR
12+
#define ENABLE_VERTEX_COLOR 0
13+
#endif
14+
1115
// This #define magic allows you to use the EvaluateVertexGeometry function in this file without making it the final
1216
// EvaluateVertexGeometry used in your shader. Simply #define EvaluateVertexGeometry before including this file
1317
//
@@ -25,9 +29,9 @@ VsOutput EvaluateVertexGeometry_BasePBR(
2529
float4 tangent,
2630
float2 uv0,
2731
float2 uv1,
28-
float4 color0,
2932
uint instanceId,
30-
bool useVertexColor0)
33+
bool useVertexColor0,
34+
float4 color0)
3135
{
3236
VsOutput output;
3337

@@ -61,22 +65,49 @@ VsOutput EvaluateVertexGeometry_BasePBR(
6165
return output;
6266
}
6367

64-
VsOutput EvaluateVertexGeometry_BasePBR(VsInput IN, VsSystemValues SV)
68+
void GetVertexColor(VsInput IN, out float4 color, out bool useVertexColor)
6569
{
6670
#if ENABLE_VERTEX_COLOR
67-
float4 color0 = IN.m_optional_color0;
68-
bool useVertexColor0 = o_color0_isBound;
71+
color = IN.m_optional_color0;
72+
useVertexColor = o_color0_isBound;
6973
#else
70-
float4 color0 = float4(1.0f, 1.0f, 1.0f, 1.0f);
71-
bool useVertexColor0 = false;
74+
color = float4(1.0f, 1.0f, 1.0f, 1.0f);
75+
useVertexColor = false;
7276
#endif
77+
}
78+
79+
VsOutput EvaluateVertexGeometry_BasePBR(VsInput IN, VsSystemValues SV)
80+
{
81+
float4 color0;
82+
bool useVertexColor0;
83+
GetVertexColor(IN, color0, useVertexColor0);
84+
7385
return EvaluateVertexGeometry_BasePBR(
7486
IN.position,
7587
IN.normal,
7688
IN.tangent,
7789
IN.uv0,
7890
IN.uv1,
79-
color0,
8091
SV.m_instanceId,
81-
useVertexColor0);
92+
useVertexColor0,
93+
color0);
94+
}
95+
96+
VsOutput EvaluateVertexGeometry_BasePBR(
97+
float3 position,
98+
float3 normal,
99+
float4 tangent,
100+
float2 uv0,
101+
float2 uv1,
102+
uint instanceId)
103+
{
104+
return EvaluateVertexGeometry_BasePBR(
105+
position,
106+
normal,
107+
tangent,
108+
uv0,
109+
uv1,
110+
instanceId,
111+
float4(1.0f, 1.0f, 1.0f, 1.0f),
112+
false);
82113
}

Gems/Atom/Feature/Common/Assets/Shaders/Materials/EnhancedPBR/EnhancedPBR_SurfaceEval.azsli

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ Surface EvaluateSurface_EnhancedPBR(
2828
bool isFrontFace,
2929
bool isDisplacementClipped,
3030
float4 uvDxDy,
31-
bool customDerivatives)
31+
bool customDerivatives,
32+
float4 vertexColor)
3233
{
3334
Surface surface;
3435
surface.position = positionWS;
@@ -73,6 +74,7 @@ Surface EvaluateSurface_EnhancedPBR(
7374
real3 baseColor = GetDetailedBaseColorInput(
7475
MaterialSrg::m_baseColorMap, MaterialSrg::m_sampler, baseColorUv, o_baseColor_useTexture, real3(MaterialSrg::m_baseColor), real(MaterialSrg::m_baseColorFactor), o_baseColorTextureBlendMode,
7576
MaterialSrg::m_detail_baseColor_texture, MaterialSrg::m_sampler, detailUv, o_detail_baseColor_useTexture, detailLayerBaseColorFactor, uvDxDy, customDerivatives);
77+
baseColor = BlendVertexColor(baseColor, real3(vertexColor.rgb));
7678

7779
// ------- Parallax Clipping -------
7880

@@ -175,8 +177,34 @@ Surface EvaluateSurface_EnhancedPBR(
175177
return surface;
176178
}
177179

178-
// helper function to keep compatible with the previous version
180+
// Helper functions to keep compatible with the previous version
179181
// because dxc compiler doesn't allow default parameters on functions with overloads
182+
Surface EvaluateSurface_EnhancedPBR(
183+
float3 positionWS,
184+
real3 normalWS,
185+
float3 tangents[UvSetCount],
186+
float3 bitangents[UvSetCount],
187+
float2 uvs[UvSetCount],
188+
float2 detailUvs[UvSetCount],
189+
bool isFrontFace,
190+
bool isDisplacementClipped,
191+
float4 uvDxDy,
192+
bool customDerivatives)
193+
{
194+
return EvaluateSurface_EnhancedPBR(
195+
positionWS,
196+
normalWS,
197+
tangents,
198+
bitangents,
199+
uvs,
200+
detailUvs,
201+
isFrontFace,
202+
isDisplacementClipped,
203+
uvDxDy,
204+
customDerivatives,
205+
float4(1.0f, 1.0f, 1.0f, 1.0f));
206+
}
207+
180208
Surface EvaluateSurface_EnhancedPBR(
181209
float3 positionWS,
182210
real3 normalWS,
@@ -212,7 +240,8 @@ Surface EvaluateSurface_EnhancedPBR(VsOutput IN, PixelGeometryData geoData, floa
212240
geoData.isFrontFace,
213241
geoData.isDisplacementClipped,
214242
uvDxDy,
215-
customDerivatives);
243+
customDerivatives,
244+
GetVertexColor(IN));
216245
}
217246

218247
Surface EvaluateSurface_EnhancedPBR(VsOutput IN, PixelGeometryData geoData)
@@ -227,5 +256,6 @@ Surface EvaluateSurface_EnhancedPBR(VsOutput IN, PixelGeometryData geoData)
227256
geoData.isFrontFace,
228257
geoData.isDisplacementClipped,
229258
float4(0.0f, 0.0f, 0.0f, 0.0f),
230-
false);
259+
false,
260+
GetVertexColor(IN));
231261
}

Gems/Atom/Feature/Common/Assets/Shaders/Materials/EnhancedPBR/EnhancedPBR_VertexData.azsli

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88

99
#pragma once
1010

11+
#ifndef ENABLE_VERTEX_COLOR
12+
#define ENABLE_VERTEX_COLOR 0
13+
#endif
14+
1115
#ifndef VsOutput
1216
#define VsOutput VsOutput_EnhancedPBR
1317
#endif
@@ -39,8 +43,10 @@
3943
float2 uvs[UvSetCount] : UV1;
4044
float2 detailUvs[UvSetCount] : UV3;
4145

46+
#if ENABLE_VERTEX_COLOR
4247
// Optional
4348
float4 color0 : UV7; // Using UV7 just to leave some room for non optional attributes
49+
#endif
4450
};
4551

4652
#endif

Gems/Atom/Feature/Common/Assets/Shaders/Materials/EnhancedPBR/EnhancedPBR_VertexEval.azsli

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@ VsOutput EvaluateVertexGeometry_EnhancedPBR(
2525
float2 uv0,
2626
float2 uv1,
2727
uint instanceId,
28+
bool useVertexColor,
2829
float4 color0)
2930
{
3031
// BasePBRP
31-
VsOutput output = EvaluateVertexGeometry_BasePBR(position, normal, tangent, uv0, uv1, color0, instanceId, o_color0_isBound);
32+
VsOutput output = EvaluateVertexGeometry_BasePBR(position, normal, tangent, uv0, uv1, instanceId, useVertexColor, color0);
3233

3334
// Detail UVs
3435
float2 detailUvs[UvSetCount] = { uv0, uv1 };
@@ -37,14 +38,40 @@ VsOutput EvaluateVertexGeometry_EnhancedPBR(
3738
return output;
3839
}
3940

41+
// Helper functions to keep compatible with the previous version
42+
// because dxc compiler doesn't allow default parameters on functions with overloads
4043
VsOutput EvaluateVertexGeometry_EnhancedPBR(VsInput IN, VsSystemValues SV)
4144
{
45+
float4 color0;
46+
bool useVertexColor0;
47+
GetVertexColor(IN, color0, useVertexColor0);
48+
4249
return EvaluateVertexGeometry_EnhancedPBR(
4350
IN.position,
4451
IN.normal,
4552
IN.tangent,
4653
IN.uv0,
4754
IN.uv1,
4855
SV.m_instanceId,
49-
IN.m_optional_color0);
56+
useVertexColor0,
57+
color0);
58+
}
59+
60+
VsOutput EvaluateVertexGeometry_EnhancedPBR(
61+
float3 position,
62+
float3 normal,
63+
float4 tangent,
64+
float2 uv0,
65+
float2 uv1,
66+
uint instanceId)
67+
{
68+
return EvaluateVertexGeometry_EnhancedPBR(
69+
position,
70+
normal,
71+
tangent,
72+
uv0,
73+
uv1,
74+
instanceId,
75+
false,
76+
float4(1.0f, 1.0f, 1.0f, 1.0f));
5077
}

0 commit comments

Comments
 (0)