Move wrinkle mask data out of default object srg (#4578)

* Refactored depth, shadow, and motion vector shaders to support custom object srgs. Added a new skin object srg and moved wrinklemask data out of the default object srg. Added a new minimal morph target asset for testing wrinkle masks to AutomatedTesting.

Signed-off-by: Tommy Walton <waltont@amazon.com>

* Fix copyright header

Signed-off-by: Tommy Walton <waltont@amazon.com>
monroegm-disable-blank-issue-2
Tommy Walton 4 years ago committed by GitHub
parent 999ec261c9
commit 2dd00e2983
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,13 @@
{
"description": "",
"materialType": "Materials/Types/Skin.materialtype",
"parentMaterial": "",
"propertyLayoutVersion": 3,
"properties": {
"wrinkleLayers": {
"count": 3,
"enable": true,
"showBlendValues": true
}
}
}

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:53e17ec8155911c8b42e85436130f600bd6dddd8931a8ccb1b2f8a9f8674cc85
size 45104

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0da56a05daa0ec1c476cfe25ca6d3b65267c98886cf33408f6e852fb325a8e2c
size 198084

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e3537fbe9205731a242251c525a67bbb5f3b8f5307537f1dc0c318b5b885ce52
size 198112

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bd794d5dd4b749c3275bfab79b9b5ae3f8e007d3e6741c0566c9c2d3931123bf
size 198112

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:45ded862987a64061deffd8e4c9aa1dff4eec3bcff5f7b505679f1959e8ae137
size 51440

@ -9,7 +9,7 @@
#include "Skin_Common.azsli"
// SRGs
#include <Atom/Features/PBR/DefaultObjectSrg.azsli>
#include <Atom/Features/Skin/SkinObjectSrg.azsli>
#include <Atom/Features/PBR/ForwardPassSrg.azsli>
// Pass Output

@ -973,15 +973,15 @@
"tag": "ForwardPass"
},
{
"file": "Shaders/Shadow/Shadowmap.shader",
"file": "Shaders/Shadow/ShadowmapSkin.shader",
"tag": "Shadowmap"
},
{
"file": "Shaders/Depth/DepthPass.shader",
"file": "Shaders/Depth/DepthPassSkin.shader",
"tag": "DepthPass"
},
{
"file": "Shaders/MotionVector/MeshMotionVector.shader",
"file": "Shaders/MotionVector/MeshMotionVectorSkin.shader",
"tag": "MeshMotionVector"
}
],

@ -27,16 +27,6 @@ ShaderResourceGroup ObjectSrg : SRG_PerObject
return SceneSrg::GetObjectToWorldInverseTransposeMatrix(m_objectId);
}
//[GFX TODO][ATOM-15280] Move wrinkle mask data from the default object srg into something specific to the Skin shader
uint m_wrinkle_mask_count;
float4 m_wrinkle_mask_weights[4];
Texture2D m_wrinkle_masks[16];
float GetWrinkleMaskWeight(uint index)
{
return m_wrinkle_mask_weights[index / 4][index % 4];
}
//! Reflection Probe (smallest probe volume that overlaps the object position)
struct ReflectionProbeData
{

@ -0,0 +1,81 @@
/*
* 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
#include <scenesrg.srgi>
ShaderResourceGroup ObjectSrg : SRG_PerObject
{
uint m_objectId;
//! Returns the matrix for transforming points from Object Space to World Space.
float4x4 GetWorldMatrix()
{
return SceneSrg::GetObjectToWorldMatrix(m_objectId);
}
//! Returns the inverse-transpose of the world matrix.
//! Commonly used to transform normals while supporting non-uniform scale.
float3x3 GetWorldMatrixInverseTranspose()
{
return SceneSrg::GetObjectToWorldInverseTransposeMatrix(m_objectId);
}
uint m_wrinkle_mask_count;
float4 m_wrinkle_mask_weights[4];
Texture2D m_wrinkle_masks[16];
float GetWrinkleMaskWeight(uint index)
{
return m_wrinkle_mask_weights[index / 4][index % 4];
}
//! Reflection Probe (smallest probe volume that overlaps the object position)
struct ReflectionProbeData
{
row_major float3x4 m_modelToWorld;
row_major float3x4 m_modelToWorldInverse; // does not include extents
float3 m_outerObbHalfLengths;
float3 m_innerObbHalfLengths;
float m_padding;
bool m_useReflectionProbe;
bool m_useParallaxCorrection;
};
ReflectionProbeData m_reflectionProbeData;
TextureCube m_reflectionProbeCubeMap;
float4x4 GetReflectionProbeWorldMatrix()
{
float4x4 modelToWorld = float4x4(
float4(1, 0, 0, 0),
float4(0, 1, 0, 0),
float4(0, 0, 1, 0),
float4(0, 0, 0, 1));
modelToWorld[0] = m_reflectionProbeData.m_modelToWorld[0];
modelToWorld[1] = m_reflectionProbeData.m_modelToWorld[1];
modelToWorld[2] = m_reflectionProbeData.m_modelToWorld[2];
return modelToWorld;
}
float4x4 GetReflectionProbeWorldMatrixInverse()
{
float4x4 modelToWorldInverse = float4x4(
float4(1, 0, 0, 0),
float4(0, 1, 0, 0),
float4(0, 0, 1, 0),
float4(0, 0, 0, 1));
modelToWorldInverse[0] = m_reflectionProbeData.m_modelToWorldInverse[0];
modelToWorldInverse[1] = m_reflectionProbeData.m_modelToWorldInverse[1];
modelToWorldInverse[2] = m_reflectionProbeData.m_modelToWorldInverse[2];
return modelToWorldInverse;
}
}

@ -6,30 +6,7 @@
*
*/
#include <viewsrg.srgi>
#include <Atom/Features/PBR/DefaultObjectSrg.azsli>
#include <DepthPassCommon.azsli>
struct VSInput
{
float3 m_position : POSITION;
};
struct VSDepthOutput
{
float4 m_position : SV_Position;
};
VSDepthOutput DepthPassVS(VSInput IN)
{
VSDepthOutput OUT;
float4x4 objectToWorld = ObjectSrg::GetWorldMatrix();
float4 worldPosition = mul(objectToWorld, float4(IN.m_position, 1.0));
OUT.m_position = mul(ViewSrg::m_viewProjectionMatrix, worldPosition);
return OUT;
}
// Use the depth pass shader with the default object srg

@ -0,0 +1,36 @@
/*
* 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
#include <viewsrg.srgi>
struct VSInput
{
float3 m_position : POSITION;
};
struct VSDepthOutput
{
float4 m_position : SV_Position;
};
VSDepthOutput DepthPassVS(VSInput IN)
{
VSDepthOutput OUT;
float4x4 objectToWorld = ObjectSrg::GetWorldMatrix();
float4 worldPosition = mul(objectToWorld, float4(IN.m_position, 1.0));
OUT.m_position = mul(ViewSrg::m_viewProjectionMatrix, worldPosition);
return OUT;
}

@ -0,0 +1,12 @@
/*
* 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
*
*/
#include <Atom/Features/Skin/SkinObjectSrg.azsli>
#include <DepthPassCommon.azsli>
// Use the depth pass shader with the skin object srg

@ -0,0 +1,24 @@
{
"Source" : "DepthPassSkin",
"DepthStencilState" : {
"Depth" : { "Enable" : true, "CompareFunc" : "GreaterEqual" }
},
"CompilerHints" : {
"DisableOptimizations" : false
},
"ProgramSettings" :
{
"EntryPoints":
[
{
"name": "DepthPassVS",
"type" : "Vertex"
}
]
},
"DrawList" : "depth"
}

@ -6,77 +6,7 @@
*
*/
#include <scenesrg.srgi>
#include <viewsrg.srgi>
#include <Atom/Features/PBR/DefaultObjectSrg.azsli>
#include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli>
struct VSInput
{
float3 m_position : POSITION;
// 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_prevPosition_isBound, which will be set to true whenever m_optional_prevPosition is available.
// (search "m_optional_" in ShaderVariantAssetBuilder for details on the naming convention).
// [GFX TODO][ATOM-14475]: Come up with a more elegant way to associate the isBound flag with the input stream.
// Vertex position of last frame to capture small scale motion due to vertex animation
float3 m_optional_prevPosition : POSITIONT;
};
struct VSOutput
{
float4 m_position : SV_Position;
float3 m_worldPos : TEXCOORD0;
float3 m_worldPosPrev: TEXCOORD1;
};
struct PSOutput
{
float2 m_motion : SV_Target0;
};
// Indicates whether the vertex input struct's "m_optional_prevPosition" is bound. If false, it is not safe to read from m_optional_prevPosition.
// This option gets set automatically by the system at runtime; there is a soft naming convention that associates it with m_optional_prevPosition.
// (search "m_optional_" in ShaderVariantAssetBuilder for details on the naming convention).
// [GFX TODO][ATOM-14475]: Come up with a more elegant way to associate the isBound flag with the input stream.
option bool o_prevPosition_isBound;
VSOutput MainVS(VSInput IN)
{
VSOutput OUT;
OUT.m_worldPos = mul(SceneSrg::GetObjectToWorldMatrix(ObjectSrg::m_objectId), float4(IN.m_position, 1.0)).xyz;
OUT.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(OUT.m_worldPos, 1.0));
if (o_prevPosition_isBound)
{
OUT.m_worldPosPrev = mul(SceneSrg::GetObjectToWorldMatrixPrev(ObjectSrg::m_objectId), float4(IN.m_optional_prevPosition, 1.0)).xyz;
}
else
{
OUT.m_worldPosPrev = mul(SceneSrg::GetObjectToWorldMatrixPrev(ObjectSrg::m_objectId), float4(IN.m_position, 1.0)).xyz;
}
return OUT;
}
PSOutput MainPS(VSOutput IN)
{
PSOutput OUT;
// Current clip position
float4 clipPos = mul(ViewSrg::m_viewProjectionMatrix, float4(IN.m_worldPos, 1.0));
// Reprojected last frame's clip position, for skinned mesh it also implies last key frame
float4 clipPosPrev = mul(ViewSrg::m_viewProjectionPrevMatrix, float4(IN.m_worldPosPrev, 1.0));
float2 motion = (clipPos.xy / clipPos.w - clipPosPrev.xy / clipPosPrev.w) * 0.5;
#include <MeshMotionVectorCommon.azsli>
OUT.m_motion = motion;
// Flip y to line up with uv coordinates
OUT.m_motion.y = -OUT.m_motion.y;
return OUT;
}
// Use the mesh motion vector with the default object srg

@ -0,0 +1,83 @@
/*
* 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
#include <scenesrg.srgi>
#include <viewsrg.srgi>
#include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli>
struct VSInput
{
float3 m_position : POSITION;
// 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_prevPosition_isBound, which will be set to true whenever m_optional_prevPosition is available.
// (search "m_optional_" in ShaderVariantAssetBuilder for details on the naming convention).
// [GFX TODO][ATOM-14475]: Come up with a more elegant way to associate the isBound flag with the input stream.
// Vertex position of last frame to capture small scale motion due to vertex animation
float3 m_optional_prevPosition : POSITIONT;
};
struct VSOutput
{
float4 m_position : SV_Position;
float3 m_worldPos : TEXCOORD0;
float3 m_worldPosPrev: TEXCOORD1;
};
struct PSOutput
{
float2 m_motion : SV_Target0;
};
// Indicates whether the vertex input struct's "m_optional_prevPosition" is bound. If false, it is not safe to read from m_optional_prevPosition.
// This option gets set automatically by the system at runtime; there is a soft naming convention that associates it with m_optional_prevPosition.
// (search "m_optional_" in ShaderVariantAssetBuilder for details on the naming convention).
// [GFX TODO][ATOM-14475]: Come up with a more elegant way to associate the isBound flag with the input stream.
option bool o_prevPosition_isBound;
VSOutput MainVS(VSInput IN)
{
VSOutput OUT;
OUT.m_worldPos = mul(SceneSrg::GetObjectToWorldMatrix(ObjectSrg::m_objectId), float4(IN.m_position, 1.0)).xyz;
OUT.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(OUT.m_worldPos, 1.0));
if (o_prevPosition_isBound)
{
OUT.m_worldPosPrev = mul(SceneSrg::GetObjectToWorldMatrixPrev(ObjectSrg::m_objectId), float4(IN.m_optional_prevPosition, 1.0)).xyz;
}
else
{
OUT.m_worldPosPrev = mul(SceneSrg::GetObjectToWorldMatrixPrev(ObjectSrg::m_objectId), float4(IN.m_position, 1.0)).xyz;
}
return OUT;
}
PSOutput MainPS(VSOutput IN)
{
PSOutput OUT;
// Current clip position
float4 clipPos = mul(ViewSrg::m_viewProjectionMatrix, float4(IN.m_worldPos, 1.0));
// Reprojected last frame's clip position, for skinned mesh it also implies last key frame
float4 clipPosPrev = mul(ViewSrg::m_viewProjectionPrevMatrix, float4(IN.m_worldPosPrev, 1.0));
float2 motion = (clipPos.xy / clipPos.w - clipPosPrev.xy / clipPosPrev.w) * 0.5;
OUT.m_motion = motion;
// Flip y to line up with uv coordinates
OUT.m_motion.y = -OUT.m_motion.y;
return OUT;
}

@ -0,0 +1,12 @@
/*
* 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
*
*/
#include <Atom/Features/Skin/SkinObjectSrg.azsli>
#include <MeshMotionVectorCommon.azsli>
// Use the mesh motion vector with the skin object srg

@ -0,0 +1,24 @@
{
"Source" : "MeshMotionVectorSkin",
"DepthStencilState" : {
"Depth" : { "Enable" : true, "CompareFunc" : "GreaterEqual" }
},
"DrawList" : "motion",
"ProgramSettings":
{
"EntryPoints":
[
{
"name": "MainVS",
"type": "Vertex"
},
{
"name": "MainPS",
"type": "Fragment"
}
]
}
}

@ -6,27 +6,7 @@
*
*/
#include <scenesrg.srgi>
#include <viewsrg.srgi>
#include <Atom/Features/PBR/DefaultObjectSrg.azsli>
#include <ShadowmapCommon.azsli>
struct VertexInput
{
float3 m_position : POSITION;
};
struct VertexOutput
{
float4 m_position : SV_Position;
};
VertexOutput MainVS(VertexInput input)
{
const float4x4 worldMatrix = ObjectSrg::GetWorldMatrix();
VertexOutput output;
const float3 worldPosition = mul(worldMatrix, float4(input.m_position, 1.0)).xyz;
output.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(worldPosition, 1.0));
return output;
}
// Use the shadowmap shader with the default object srg

@ -0,0 +1,33 @@
/*
* 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
#include <scenesrg.srgi>
#include <viewsrg.srgi>
struct VertexInput
{
float3 m_position : POSITION;
};
struct VertexOutput
{
float4 m_position : SV_Position;
};
VertexOutput MainVS(VertexInput input)
{
const float4x4 worldMatrix = ObjectSrg::GetWorldMatrix();
VertexOutput output;
const float3 worldPosition = mul(worldMatrix, float4(input.m_position, 1.0)).xyz;
output.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(worldPosition, 1.0));
return output;
}

@ -0,0 +1,12 @@
/*
* 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
*
*/
#include <Atom/Features/Skin/SkinObjectSrg.azsli>
#include <ShadowmapCommon.azsli>
// Use the shadowmap shader with the skin object srg

@ -0,0 +1,26 @@
{
"Source" : "ShadowmapSkin",
"DepthStencilState" : {
"Depth" : { "Enable" : true, "CompareFunc" : "LessEqual" }
},
"DrawList" : "shadow",
"RasterState" :
{
"depthBias" : "10",
"depthBiasSlopeScale" : "4"
},
"ProgramSettings":
{
"EntryPoints":
[
{
"name": "MainVS",
"type": "Vertex"
}
]
}
}
Loading…
Cancel
Save