Browse Source

ASV update for adding instanced object transforms to the DrawSrg. (#603)

* ASV update for adding instanced object transforms to the DrawSrg.

Signed-off-by: Tommy Walton <[email protected]>

* Separate instanced transform functions from the DrawSrg.

Signed-off-by: Tommy Walton <[email protected]>

* Fix up some inconsitent usage of real vs float

Signed-off-by: Tommy Walton <[email protected]>

---------

Signed-off-by: Tommy Walton <[email protected]>
Tommy Walton 2 years ago
parent
commit
5697989f88

+ 8 - 6
Materials/DynamicMaterialTest/EmissiveMaterial.azsl

@@ -7,9 +7,10 @@
  */
 
 #include <viewsrg.srgi>
-#include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli>
 #include <Atom/Features/PBR/AlphaUtils.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/ColorManagement/TransformColor.azsli>
@@ -50,14 +51,15 @@ struct VSOutput
     float3 m_worldPosition : UV0;
     float2 m_uv : UV1;
     float3 m_shadowCoords[ViewSrg::MaxCascadeCount] : UV3;
+    uint m_instanceId : SV_InstanceID;
 };
 
 option bool o_emissive_useTexture; 
 
-VSOutput MainVS(VSInput IN)
+VSOutput MainVS(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_worldPosition = worldPosition;
     OUT.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(OUT.m_worldPosition, 1.0));
     OUT.m_normal = IN.m_normal;
@@ -68,11 +70,11 @@ VSOutput MainVS(VSInput IN)
 
 ForwardPassOutput MainPS(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);
 
     // ------- Surface -------
 

+ 5 - 3
Materials/Pipelines/PrototypeDeferredPipeline/DeferredMaterialPass.azsli

@@ -19,14 +19,16 @@
 //////////////////////////////////////////////////////////////////////////////////////////////////
 
 #include <viewsrg.srgi>
+#include <Atom/Features/PBR/DefaultObjectSrg.azsli>
 #include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli>
 #include <Atom/Features/ColorManagement/TransformColor.azsli>
 #include <Atom/Features/PBR/LightingOptions.azsli>
 
-VsOutput MaterialVS(VsInput IN)
+VsOutput MaterialVS(VsInput IN, uint instanceId : SV_InstanceID)
 {
-    VsOutput OUT = EvaluateVertexGeometry(IN);
-    return OUT;
+    VsSystemValues SV;
+    SV.m_instanceId = instanceId;
+    return EvaluateVertexGeometry(IN, SV);
 }
 
 struct DeferredMaterialOutput

+ 9 - 6
Materials/Types/MinimalMultilayerPBR_ForwardPass.azsl

@@ -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);

+ 3 - 1
Passes/PrototypeDeferredPipeline/DeferredLighting.azsl

@@ -10,7 +10,9 @@
 
 #include <Atom/Features/PostProcessing/FullscreenVertex.azsli>
 #include <Atom/Features/ScreenSpace/ScreenSpaceUtil.azsli>
-#include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli>
+
+// The shader variant system needs a fallback if you have non-static options.
+#include <Atom/RPI/ShaderResourceGroups/UnusedFallbackDrawSrg.azsli>
 
 ShaderResourceGroup PassSrg : SRG_PerPass
 {

+ 5 - 3
Shaders/DebugVertexNormals.azsl

@@ -9,6 +9,8 @@
 #include <scenesrg.srgi>
 #include <viewsrg.srgi>
 #include <Atom/Features/PBR/DefaultObjectSrg.azsli>
+#include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli>
+#include <Atom/Features/InstancedTransforms.azsli>
 
 struct VertexInput
 {
@@ -22,15 +24,15 @@ struct VertexOutput
     float3 m_normal : NORMAL;
 };
 
-VertexOutput MainVS(VertexInput input)
+VertexOutput MainVS(VertexInput input, uint instanceId : SV_InstanceID)
 {
-    const float4x4 objectToWorldMatrix = ObjectSrg::GetWorldMatrix();
+    const float4x4 objectToWorldMatrix = GetObjectToWorldMatrix(instanceId);
 
     VertexOutput output;
     float4 worldPosition = mul(objectToWorldMatrix, float4(input.m_position, 1.0));
     output.m_position = mul(ViewSrg::m_viewProjectionMatrix, worldPosition);
     
-    float3x3 objectToWorldMatrixIT = ObjectSrg::GetWorldMatrixInverseTranspose();
+    float3x3 objectToWorldMatrixIT = GetObjectToWorldMatrixInverseTranspose(instanceId);
     output.m_normal = mul(objectToWorldMatrixIT, input.m_normal);
     output.m_normal = normalize(output.m_normal);
     return output;