diff --git a/examples/Showcase/main.cpp b/examples/Showcase/main.cpp index 5183b269e..f029663b8 100644 --- a/examples/Showcase/main.cpp +++ b/examples/Showcase/main.cpp @@ -147,7 +147,7 @@ int main() std::shared_ptr bobMat = std::make_shared(); std::shared_ptr bobMatPass = std::make_shared(Nz::BasicMaterial::GetSettings()); - bobMatPass->SetSharedUniformBuffer(0, renderBuffer); + bobMatPass->SetSharedUniformBuffer(1, renderBuffer); bobMatPass->EnableDepthBuffer(true); { diff --git a/include/Nazara/Graphics/ForwardFramePipeline.hpp b/include/Nazara/Graphics/ForwardFramePipeline.hpp index f4f63f341..eea8b656e 100644 --- a/include/Nazara/Graphics/ForwardFramePipeline.hpp +++ b/include/Nazara/Graphics/ForwardFramePipeline.hpp @@ -10,8 +10,8 @@ #include #include #include -#include #include +#include #include #include #include diff --git a/include/Nazara/Graphics/PredefinedShaderStructs.hpp b/include/Nazara/Graphics/PredefinedShaderStructs.hpp index 43d4234c6..88780ec71 100644 --- a/include/Nazara/Graphics/PredefinedShaderStructs.hpp +++ b/include/Nazara/Graphics/PredefinedShaderStructs.hpp @@ -48,6 +48,17 @@ namespace Nz static MaterialSettings::SharedUniformBlock GetUniformBlock(UInt32 bindingIndex, nzsl::ShaderStageTypeFlags shaderStages); }; + struct NAZARA_GRAPHICS_API PredefinedSkeletalData + { + std::size_t totalSize; + std::size_t jointMatricesOffset; + + static constexpr std::size_t MaxMatricesCount = 256; + + static PredefinedSkeletalData GetOffsets(); + static MaterialSettings::SharedUniformBlock GetUniformBlock(UInt32 bindingIndex, nzsl::ShaderStageTypeFlags shaderStages); + }; + struct NAZARA_GRAPHICS_API PredefinedViewerData { std::size_t eyePositionOffset; diff --git a/src/Nazara/Graphics/BasicMaterial.cpp b/src/Nazara/Graphics/BasicMaterial.cpp index 4039c79ad..dd3d32fb4 100644 --- a/src/Nazara/Graphics/BasicMaterial.cpp +++ b/src/Nazara/Graphics/BasicMaterial.cpp @@ -151,16 +151,6 @@ namespace Nz options.defaultValues }); - nzsl::FieldOffsets skeletalOffsets(nzsl::StructLayout::Std140); - skeletalOffsets.AddMatrixArray(nzsl::StructFieldType::Float1, 4, 4, true, 100); - - settings.sharedUniformBlocks.push_back({ - 6, - "SkeletalData", - {}, - nzsl::ShaderStageType::Vertex - }); - // Common data settings.textures.push_back({ 3, @@ -169,12 +159,12 @@ namespace Nz }); settings.sharedUniformBlocks.push_back(PredefinedInstanceData::GetUniformBlock(4, nzsl::ShaderStageType::Vertex)); + settings.sharedUniformBlocks.push_back(PredefinedSkeletalData::GetUniformBlock(6, nzsl::ShaderStageType::Vertex)); settings.sharedUniformBlocks.push_back(PredefinedViewerData::GetUniformBlock(5, nzsl::ShaderStageType_All)); - //settings.sharedUniformBlocks.push_back(PredefinedInstanceData::GetUniformBlock(6, nzsl::ShaderStageType::Vertex)); settings.predefinedBindings[UnderlyingCast(PredefinedShaderBinding::InstanceDataUbo)] = 4; settings.predefinedBindings[UnderlyingCast(PredefinedShaderBinding::OverlayTexture)] = 3; - //settings.predefinedBindings[UnderlyingCast(PredefinedShaderBinding::SkeletalDataUbo)] = 6; + settings.predefinedBindings[UnderlyingCast(PredefinedShaderBinding::SkeletalDataUbo)] = 6; settings.predefinedBindings[UnderlyingCast(PredefinedShaderBinding::ViewerDataUbo)] = 5; settings.shaders = options.shaders; diff --git a/src/Nazara/Graphics/PredefinedShaderStructs.cpp b/src/Nazara/Graphics/PredefinedShaderStructs.cpp index 7518670e5..a513e39bb 100644 --- a/src/Nazara/Graphics/PredefinedShaderStructs.cpp +++ b/src/Nazara/Graphics/PredefinedShaderStructs.cpp @@ -8,6 +8,7 @@ namespace Nz { + // PredefinedLightData PredefinedLightData PredefinedLightData::GetOffsets() { PredefinedLightData lightData; @@ -51,6 +52,7 @@ namespace Nz return uniformBlock; } + // PredefinedInstanceData PredefinedInstanceData PredefinedInstanceData::GetOffsets() { nzsl::FieldOffsets viewerStruct(nzsl::StructLayout::Std140); @@ -85,6 +87,40 @@ namespace Nz return uniformBlock; } + // PredefinedSkeletalData + PredefinedSkeletalData PredefinedSkeletalData::GetOffsets() + { + nzsl::FieldOffsets skeletalStruct(nzsl::StructLayout::Std140); + + PredefinedSkeletalData skeletalData; + skeletalData.jointMatricesOffset = skeletalStruct.AddMatrixArray(nzsl::StructFieldType::Float1, 4, 4, true, 100); + + skeletalData.totalSize = skeletalStruct.GetAlignedSize(); + + return skeletalData; + } + + MaterialSettings::SharedUniformBlock PredefinedSkeletalData::GetUniformBlock(UInt32 bindingIndex, nzsl::ShaderStageTypeFlags shaderStages) + { + PredefinedSkeletalData skeletalData = GetOffsets(); + + std::vector variables = { + { + { "JointMatrices", skeletalData.jointMatricesOffset } + } + }; + + MaterialSettings::SharedUniformBlock uniformBlock = { + bindingIndex, + "SkeletalData", + std::move(variables), + shaderStages + }; + + return uniformBlock; + } + + // PredefinedViewerData PredefinedViewerData PredefinedViewerData::GetOffsets() { nzsl::FieldOffsets viewerStruct(nzsl::StructLayout::Std140); @@ -132,5 +168,4 @@ namespace Nz return uniformBlock; } - } diff --git a/src/Nazara/Graphics/Resources/Shaders/Modules/Engine/SkeletalData.nzsl b/src/Nazara/Graphics/Resources/Shaders/Modules/Engine/SkeletalData.nzsl index a76741087..84c9d9c95 100644 --- a/src/Nazara/Graphics/Resources/Shaders/Modules/Engine/SkeletalData.nzsl +++ b/src/Nazara/Graphics/Resources/Shaders/Modules/Engine/SkeletalData.nzsl @@ -1,7 +1,9 @@ [nzsl_version("1.0")] module Engine.SkeletalData; -const MaxJointCount: u32 = u32(200); //< FIXME: Fix integral value types +// The minimum guaranteed UBO size by OpenGL and Vulkan is 16384, which is enough to store 256 4x4 matrices +// We could store a bit more using mat3x4 matrices (341) but 256 bones is already a quite high limit for now +const MaxJointCount: u32 = u32(256); //< FIXME: Fix integral value types [export] [layout(std140)]