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
parent
999ec261c9
commit
2dd00e2983
@ -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
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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"
|
||||||
|
}
|
||||||
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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…
Reference in New Issue