添加多模型渲染,添加贴图渲染,添加平行光, 暂时不上传assets

This commit is contained in:
2026-09-21 14:07:20 +08:00
parent 381b7c0aa6
commit 7d628f8d8a
37 changed files with 9817 additions and 189 deletions
+74 -23
View File
@@ -11,17 +11,17 @@ namespace Engine
DescriptorManager::DescriptorManager(Device& device)
: m_Device(device)
{
vk::DescriptorPoolSize poolSize;
poolSize.setType(vk::DescriptorType::eUniformBuffer)
.setDescriptorCount(kMaxSets);
std::array<vk::DescriptorPoolSize, 2> poolSizes = {
vk::DescriptorPoolSize(vk::DescriptorType::eUniformBuffer, kMaxSets),
vk::DescriptorPoolSize(vk::DescriptorType::eCombinedImageSampler, kMaxSets),
};
vk::DescriptorPoolCreateInfo poolInfo;
poolInfo.setMaxSets(kMaxSets)
.setPoolSizes(poolSize)
.setPoolSizes(poolSizes)
.setFlags(vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet);
m_Pool = m_Device.GetDevice().createDescriptorPool(poolInfo);
ENGINE_INFO("DescriptorManager created");
}
@@ -30,28 +30,25 @@ namespace Engine
m_Device.GetDevice().destroyDescriptorPool(m_Pool);
}
vk::DescriptorSetLayout DescriptorManager::CreateUniformBufferLayout(u32 binding)
vk::DescriptorSetLayout DescriptorManager::CreateLayout(const std::vector<DescriptorBinding>& bindings)
{
vk::DescriptorSetLayoutBinding layoutBinding;
layoutBinding.setBinding(binding)
.setDescriptorType(vk::DescriptorType::eUniformBuffer)
.setDescriptorCount(1)
.setStageFlags(vk::ShaderStageFlagBits::eVertex |
vk::ShaderStageFlagBits::eFragment);
std::vector<vk::DescriptorSetLayoutBinding> vkBindings;
for (auto& b : bindings)
{
vk::DescriptorSetLayoutBinding vkb;
vkb.setBinding(b.Binding)
.setDescriptorType(b.Type)
.setDescriptorCount(1)
.setStageFlags(b.Stages);
vkBindings.push_back(vkb);
}
vk::DescriptorSetLayoutCreateInfo layoutInfo;
layoutInfo.setBindings(layoutBinding);
layoutInfo.setBindings(vkBindings);
return m_Device.GetDevice().createDescriptorSetLayout(layoutInfo);
}
vk::PipelineLayout DescriptorManager::CreatePipelineLayout(vk::DescriptorSetLayout layout)
{
vk::PipelineLayoutCreateInfo info;
info.setSetLayouts(layout);
return m_Device.GetDevice().createPipelineLayout(info);
}
vk::DescriptorSet DescriptorManager::AllocateDescriptorSet(vk::DescriptorSetLayout layout)
{
vk::DescriptorSetAllocateInfo allocInfo;
@@ -66,9 +63,7 @@ namespace Engine
vk::Buffer buffer, u64 size)
{
vk::DescriptorBufferInfo bufferInfo;
bufferInfo.setBuffer(buffer)
.setOffset(0)
.setRange(size);
bufferInfo.setBuffer(buffer).setOffset(0).setRange(size);
vk::WriteDescriptorSet write;
write.setDstSet(set)
@@ -80,4 +75,60 @@ namespace Engine
m_Device.GetDevice().updateDescriptorSets(write, {});
}
void DescriptorManager::UpdateTexture(vk::DescriptorSet set, u32 binding,
vk::Sampler sampler, vk::ImageView view)
{
vk::DescriptorImageInfo imageInfo;
imageInfo.setSampler(sampler)
.setImageView(view)
.setImageLayout(vk::ImageLayout::eShaderReadOnlyOptimal);
vk::WriteDescriptorSet write;
write.setDstSet(set)
.setDstBinding(binding)
.setDstArrayElement(0)
.setDescriptorType(vk::DescriptorType::eCombinedImageSampler)
.setDescriptorCount(1)
.setImageInfo(imageInfo);
m_Device.GetDevice().updateDescriptorSets(write, {});
}
vk::PipelineLayout DescriptorManager::CreatePipelineLayout(vk::DescriptorSetLayout layout,
const u32 pushConstantSize)
{
vk::PipelineLayoutCreateInfo info;
info.setSetLayouts(layout);
// 关键:数组声明在 if 外面,生命周期覆盖到 createPipelineLayout
std::array<vk::PushConstantRange, 1> pushRanges;
if (pushConstantSize > 0)
{
pushRanges[0].setStageFlags(vk::ShaderStageFlagBits::eVertex)
.setOffset(0)
.setSize(pushConstantSize);
info.setPushConstantRanges(pushRanges);
}
return m_Device.GetDevice().createPipelineLayout(info);
}
vk::PipelineLayout DescriptorManager::CreatePipelineLayout(const std::vector<vk::DescriptorSetLayout>& layouts,u32 pushConstantSize)
{
vk::PipelineLayoutCreateInfo info;
info.setSetLayouts(layouts);
std::array<vk::PushConstantRange, 1> pushRanges;
if (pushConstantSize > 0) {
pushRanges[0].setStageFlags(vk::ShaderStageFlagBits::eVertex)
.setOffset(0)
.setSize(pushConstantSize);
info.setPushConstantRanges(pushRanges);
}
return m_Device.GetDevice().createPipelineLayout(info);
}
} // namespace Engine