Graphics: Add PredefinedSkeletalData

This commit is contained in:
SirLynix 2022-08-23 18:13:18 +02:00 committed by Jérôme Leclercq
parent 987c23c3ef
commit 7ada266917
6 changed files with 54 additions and 16 deletions

View File

@ -147,7 +147,7 @@ int main()
std::shared_ptr<Nz::Material> bobMat = std::make_shared<Nz::Material>();
std::shared_ptr<Nz::MaterialPass> bobMatPass = std::make_shared<Nz::MaterialPass>(Nz::BasicMaterial::GetSettings());
bobMatPass->SetSharedUniformBuffer(0, renderBuffer);
bobMatPass->SetSharedUniformBuffer(1, renderBuffer);
bobMatPass->EnableDepthBuffer(true);
{

View File

@ -10,8 +10,8 @@
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Graphics/BakedFrameGraph.hpp>
#include <Nazara/Graphics/Config.hpp>
#include <Nazara/Graphics/DepthPipelinePass.hpp>
#include <Nazara/Graphics/DebugDrawPipelinePass.hpp>
#include <Nazara/Graphics/DepthPipelinePass.hpp>
#include <Nazara/Graphics/ElementRenderer.hpp>
#include <Nazara/Graphics/ForwardPipelinePass.hpp>
#include <Nazara/Graphics/FramePipeline.hpp>

View File

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

View File

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

View File

@ -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<MaterialSettings::UniformVariable> 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;
}
}

View File

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