|
@@ -7,8 +7,9 @@
|
|
|
*/
|
|
|
|
|
|
#include <viewsrg.srgi>
|
|
|
-#include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli>
|
|
|
#include <Atom/Features/PBR/DefaultObjectSrg.azsli>
|
|
|
+#include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli>
|
|
|
+#include <Atom/Features/InstancedTransforms.azsli>
|
|
|
#include <Atom/Features/Pipeline/Forward/ForwardPassSrg.azsli>
|
|
|
#include <Atom/Features/Pipeline/Forward/ForwardPassOutput.azsli>
|
|
|
#include <Atom/Features/PBR/AlphaUtils.azsli>
|
|
@@ -64,13 +65,14 @@ struct VSOutput
|
|
|
float2 m_uv : UV0;
|
|
|
float3 m_worldPosition : UV1;
|
|
|
float3 m_shadowCoords[ViewSrg::MaxCascadeCount] : UV2;
|
|
|
+ uint m_instanceId : SV_InstanceID;
|
|
|
};
|
|
|
|
|
|
-VSOutput MinimalMultilayerPBR_MainPassVS(VSInput IN)
|
|
|
+VSOutput MinimalMultilayerPBR_MainPassVS(VSInput IN, uint instanceId : SV_InstanceID)
|
|
|
{
|
|
|
VSOutput OUT;
|
|
|
|
|
|
- float3 worldPosition = mul(ObjectSrg::GetWorldMatrix(), float4(IN.m_position, 1.0)).xyz;
|
|
|
+ float3 worldPosition = mul(GetObjectToWorldMatrix(instanceId), float4(IN.m_position, 1.0)).xyz;
|
|
|
|
|
|
OUT.m_uv = IN.m_uv;
|
|
|
|
|
@@ -78,6 +80,7 @@ VSOutput MinimalMultilayerPBR_MainPassVS(VSInput IN)
|
|
|
OUT.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(OUT.m_worldPosition, 1.0));
|
|
|
OUT.m_normal = IN.m_normal;
|
|
|
OUT.m_tangent = IN.m_tangent;
|
|
|
+ OUT.m_instanceId = instanceId;
|
|
|
|
|
|
return OUT;
|
|
|
}
|
|
@@ -86,11 +89,11 @@ VSOutput MinimalMultilayerPBR_MainPassVS(VSInput IN)
|
|
|
|
|
|
ForwardPassOutput MinimalMultilayerPBR_MainPassPS(VSOutput IN)
|
|
|
{
|
|
|
- float4x4 objectToWorld = ObjectSrg::GetWorldMatrix();
|
|
|
- float3x3 objectToWorldIT = ObjectSrg::GetWorldMatrixInverseTranspose();
|
|
|
+ real4x4 objectToWorld = real4x4(GetObjectToWorldMatrix(IN.m_instanceId));
|
|
|
+ real3x3 objectToWorldIT = real3x3(GetObjectToWorldMatrixInverseTranspose(IN.m_instanceId));
|
|
|
|
|
|
float3 vertexNormal, vertexTangent, vertexBitangent;
|
|
|
- ConstructTBN(IN.m_normal, IN.m_tangent, objectToWorld, objectToWorldIT, vertexNormal, vertexTangent, vertexBitangent);
|
|
|
+ ConstructTBN(real3(IN.m_normal), real4(IN.m_tangent), objectToWorld, objectToWorldIT, vertexNormal, vertexTangent, vertexBitangent);
|
|
|
|
|
|
float3 baseColor1 = GetBaseColorInput(MaterialSrg::m_layer1_baseColorTexture, MaterialSrg::m_sampler, IN.m_uv, MaterialSrg::m_layer1_baseColor, o_layer1_useBaseColorTexture);
|
|
|
float3 baseColor2 = GetBaseColorInput(MaterialSrg::m_layer2_baseColorTexture, MaterialSrg::m_sampler, IN.m_uv, MaterialSrg::m_layer2_baseColor, o_layer2_useBaseColorTexture);
|