Skip to content

Commit 70543a7

Browse files
committed
Added skinning support in shadow render pass
1 parent f054983 commit 70543a7

2 files changed

Lines changed: 37 additions & 5 deletions

File tree

Resources/Engine/Shaders/ShadowFallback.ovfx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
1+
#pass SHADOW_PASS
2+
#feature SKINNING
3+
14
#shader vertex
25
#version 450 core
36

47
layout (location = 0) in vec3 geo_Pos;
8+
layout (location = 5) in vec4 geo_BoneIDs;
9+
layout (location = 6) in vec4 geo_BoneWeights;
510

611
#include ":Shaders/Common/Buffers/EngineUBO.ovfxh"
12+
#include ":Shaders/Common/Buffers/SkinningSSBO.ovfxh"
713

814
void main()
915
{
10-
gl_Position = ubo_Projection * ubo_View * ubo_Model * vec4(geo_Pos, 1.0);
16+
mat4 skinningMatrix = mat4(1.0);
17+
#if defined(SKINNING)
18+
skinningMatrix = ComputeSkinningMatrix(geo_BoneIDs, geo_BoneWeights);
19+
#endif
20+
21+
gl_Position = ubo_Projection * ubo_View * ubo_Model * skinningMatrix * vec4(geo_Pos, 1.0);
1122
}
1223

1324
#shader fragment

Sources/OvCore/src/OvCore/Rendering/ShadowRenderPass.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,24 @@
44
* @licence: MIT
55
*/
66

7+
#include <cstdint>
8+
#include <string>
9+
710
#include <OvCore/ECS/Components/CMaterialRenderer.h>
11+
#include <OvCore/ECS/Components/CSkinnedMeshRenderer.h>
812
#include <OvCore/Global/ServiceLocator.h>
913
#include <OvCore/Rendering/EngineBufferRenderFeature.h>
1014
#include <OvCore/Rendering/EngineDrawableDescriptor.h>
1115
#include <OvCore/Rendering/ShadowRenderPass.h>
16+
#include <OvCore/Rendering/SkinningUtils.h>
1217
#include <OvCore/ResourceManagement/ShaderManager.h>
1318

1419
#include <OvRendering/Features/LightingRenderFeature.h>
1520
#include <OvRendering/HAL/Profiling.h>
1621

1722
constexpr uint8_t kMaxShadowMaps = 1;
23+
const std::string kShadowPassName = "SHADOW_PASS";
24+
const std::string kSkinningFeatureName = std::string{ OvCore::Rendering::SkinningUtils::kFeatureName };
1825

1926
OvCore::Rendering::ShadowRenderPass::ShadowRenderPass(OvRendering::Core::CompositeRenderer& p_renderer) :
2027
OvRendering::Core::ARenderPass(p_renderer)
@@ -91,6 +98,8 @@ void OvCore::Rendering::ShadowRenderPass::_DrawShadows(
9198
OvCore::SceneSystem::Scene& p_scene
9299
)
93100
{
101+
using namespace OvCore::Rendering;
102+
94103
for (auto modelRenderer : p_scene.GetFastAccessComponents().modelRenderers)
95104
{
96105
auto& actor = modelRenderer->owner;
@@ -106,18 +115,25 @@ void OvCore::Rendering::ShadowRenderPass::_DrawShadows(
106115
continue;
107116
}
108117

118+
const auto skinnedRenderer = actor.GetComponent<OvCore::ECS::Components::CSkinnedMeshRenderer>();
119+
const bool hasSkinning = SkinningUtils::IsSkinningActive(skinnedRenderer);
120+
109121
const auto& materials = materialRenderer->GetMaterials();
110122
const auto& modelMatrix = actor.transform.GetWorldMatrix();
111123

112124
for (auto mesh : model->GetMeshes())
113125
{
114126
if (auto material = materials.at(mesh->GetMaterialIndex()); material && material->IsValid() && material->IsShadowCaster())
115127
{
116-
const std::string shadowPassName = "SHADOW_PASS";
128+
const bool materialHasShadowPass = material->HasPass(kShadowPassName);
129+
const bool canUseMaterialShadowPass =
130+
materialHasShadowPass &&
131+
(!hasSkinning || material->SupportsFeature(kSkinningFeatureName));
117132

118-
// If the material has shadow pass, use it, otherwise use the shadow fallback material
133+
// If the material has a compatible shadow pass, use it.
134+
// Otherwise, use the shadow fallback material.
119135
auto& targetMaterial =
120-
material->HasPass(shadowPassName) ?
136+
canUseMaterialShadowPass ?
121137
*material :
122138
m_shadowMaterial;
123139

@@ -138,13 +154,18 @@ void OvCore::Rendering::ShadowRenderPass::_DrawShadows(
138154
drawable.stateMask.frontfaceCulling = false;
139155
drawable.stateMask.backfaceCulling = false;
140156

141-
drawable.pass = shadowPassName;
157+
drawable.pass = kShadowPassName;
142158

143159
drawable.AddDescriptor<EngineDrawableDescriptor>({
144160
modelMatrix,
145161
materialRenderer->GetUserMatrix()
146162
});
147163

164+
if (hasSkinning && targetMaterial.SupportsFeature(kSkinningFeatureName))
165+
{
166+
SkinningUtils::ApplyToDrawable(drawable, *skinnedRenderer, &targetMaterial.GetFeatures());
167+
}
168+
148169
m_renderer.DrawEntity(p_pso, drawable);
149170
}
150171
}

0 commit comments

Comments
 (0)