阴影(本修正的核心根因):
- 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,阴影随实体旋转正确
79 lines
2.3 KiB
C++
79 lines
2.3 KiB
C++
//
|
|
// Created by atdunbg on 2026/9/21.
|
|
//
|
|
|
|
#ifndef HELLOVULKAN_MODEL_H
|
|
#define HELLOVULKAN_MODEL_H
|
|
|
|
#pragma once
|
|
|
|
#include <Engine/Core/Types.h>
|
|
#include <Engine/Renderer/Mesh.h>
|
|
#include <vulkan/vulkan.hpp>
|
|
#include <array>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
struct aiNode;
|
|
struct aiMesh;
|
|
struct aiScene;
|
|
|
|
namespace Engine
|
|
{
|
|
class Device;
|
|
class MemoryAllocator;
|
|
class DescriptorManager;
|
|
class Texture;
|
|
|
|
class Model
|
|
{
|
|
public:
|
|
Model(Device& device, MemoryAllocator& allocator,
|
|
DescriptorManager& descriptorManager,
|
|
vk::DescriptorSetLayout textureLayout,
|
|
const std::string& path);
|
|
|
|
// 程序化模型:单位法线朝上的 XZ 平面(纯色贴图),用于地面等。
|
|
// size 为半边长(平面总边长 = 2*size)。
|
|
struct ProceduralTag {};
|
|
static Scope<Model> CreatePlane(Device& device, MemoryAllocator& allocator,
|
|
DescriptorManager& descriptorManager,
|
|
vk::DescriptorSetLayout textureLayout,
|
|
f32 halfSize, u8 r, u8 g, u8 b);
|
|
|
|
~Model();
|
|
|
|
Model(const Model&) = delete;
|
|
Model& operator=(const Model&) = delete;
|
|
|
|
const std::vector<Scope<Mesh>>& GetMeshes() const { return m_Meshes; }
|
|
|
|
private:
|
|
Model(Device& device, MemoryAllocator& allocator,
|
|
DescriptorManager& descriptorManager,
|
|
vk::DescriptorSetLayout textureLayout,
|
|
ProceduralTag, f32 halfSize, const std::array<u8, 3>& color);
|
|
|
|
void LoadModel(const std::string& path);
|
|
void ProcessNode(aiNode* node, const aiScene* scene);
|
|
Scope<Mesh> ProcessMesh(aiMesh* mesh, const aiScene* scene);
|
|
|
|
Texture* GetOrLoadTexture(const std::string& path);
|
|
|
|
Device& m_Device;
|
|
MemoryAllocator& m_Allocator;
|
|
DescriptorManager& m_DescriptorManager;
|
|
vk::DescriptorSetLayout m_TextureLayout;
|
|
|
|
std::vector<Scope<Mesh>> m_Meshes;
|
|
std::string m_ModelPath;
|
|
|
|
// 纹理缓存:同一路径只加载一次
|
|
std::unordered_map<std::string, Scope<Texture>> m_TextureCache;
|
|
Scope<Texture> m_DefaultTexture;
|
|
};
|
|
} // namespace Engine
|
|
|
|
#endif //HELLOVULKAN_MODEL_H
|