阴影(本修正的核心根因):
- Shadow pass 光源正交写深度(2048 D32),Forward 采样比较;
写入与采样共用同一 lightSpace 矩阵,杜绝姿态/镜像不一致
- 修复:push constant range 64B→128B(原 Shadow pass 推 {lightVP,model}
超出 layout 声明范围 = UB,阴影中模型矩阵读到垃圾导致旋转错乱)
- 修复:ShadowFactor 缺少 NDC→UV 映射(*0.5+0.5),采样区域整体错位
- 修复:RG ShaderRead stage 位值直转(eFragment=0x10 在 PipelineStage2
是 TESSELLATION_CONTROL),改为逐位显式映射
- Camera perspective 深度重映射到 Vulkan [0,1](公式与 ortho 不同:
M22=M22*0.5-0.5, M32*=0.5);光源 ortho remap 用 M32=M32*0.5+0.5
引擎配套:
- TransformComponent 重构为 position/rotation/scale + Compose()
- Texture::CreateSolidColor / Model::CreatePlane 程序化资产
(两段式上传公共路径),AssetManager.CreatePlane 带缓存入口
- RG 新增 GetPhysicalView(h, slot):按帧槽位把 RG 资源绑进外部描述符
(阴影图 per-slot 物理镜像各自绑定)
验证:validation 0 error 0 warning,阴影随实体旋转正确
44 lines
1.6 KiB
C++
44 lines
1.6 KiB
C++
//
|
|
// Created by atdunbg on 2026/9/22.
|
|
//
|
|
|
|
#include <Engine/Assets/AssetManager.h>
|
|
#include <Engine/Vulkan/Device.h>
|
|
#include <Engine/Vulkan/MemoryAllocator.h>
|
|
#include <Engine/Vulkan/DescriptorManager.h>
|
|
#include <Engine/Core/Log.h>
|
|
|
|
namespace Engine::Assets {
|
|
|
|
AssetManager::AssetManager(Device& device, MemoryAllocator& allocator,
|
|
DescriptorManager& descriptors,
|
|
vk::DescriptorSetLayout textureLayout)
|
|
: m_Device(device), m_Allocator(allocator),
|
|
m_Descriptors(descriptors), m_TextureLayout(textureLayout)
|
|
{
|
|
ENGINE_INFO("AssetManager created");
|
|
}
|
|
|
|
ModelHandle AssetManager::LoadModel(const std::string& path)
|
|
{
|
|
return m_Models.Load(path, [this](const std::string& p) -> Scope<Model> {
|
|
// GPU 上传在此发生:资产层调用渲染层接口完成 buffer/image 创建
|
|
return CreateScope<Model>(
|
|
m_Device, m_Allocator, m_Descriptors, m_TextureLayout, p);
|
|
});
|
|
}
|
|
|
|
ModelHandle AssetManager::CreatePlane(f32 halfSize, u8 r, u8 g, u8 b)
|
|
{
|
|
// 程序化资产复用同一缓存:键 = 伪路径 + 参数
|
|
std::string key = "procedural://plane/" + std::to_string(halfSize) +
|
|
"/" + std::to_string(r) + "," + std::to_string(g) +
|
|
"," + std::to_string(b);
|
|
return m_Models.Load(key, [&](const std::string&) -> Scope<Model> {
|
|
return Model::CreatePlane(m_Device, m_Allocator, m_Descriptors,
|
|
m_TextureLayout, halfSize, r, g, b);
|
|
});
|
|
}
|
|
|
|
} // namespace Engine::Assets
|