Commit Graph
9 Commits
Author SHA1 Message Date
atdunbg 3907868417 fix: 阴影不可见的真正根因——深度重映射矩阵公式错误
诊断方法:日志打印 lightVP/lightProj/lightView 矩阵分解定位。
修复前 lightVP 在原点处 z=-14.70(应 ∈[-1,1])——深度全部越界被裁。

根因:remap 公式把偏移量 0.5 错加进了 z 缩放系数:
  错:M[2][2] = M[2][2]*0.5 + 0.5   (0.5 混入 z 系数)
  对:M[2][2] *= 0.5                (z' = 0.5z + 0.5w,偏移属于 w 列)
      M[3][2] = M[3][2]*0.5 + 0.5
正交投影 w=1,错误的 0.5*z 项使深度随距离线性发散,shadow map
内所有深度越界,采样对比永不成立。透视投影同错(被 w 除法稀释
成近似常数偏移,此前一直"看起来正常")。修复 Camera + lightProj。

同批修复:
- 深度 bias 1.25 → 0.0025/0.003(NDC 空间,1.25 会饱和全部深度)
- 光源位置 lightDir*30 → -lightDir*30(原方向反了:从地下往上照)
- lookAt 垂直光 up 退化(叉积为零 → NaN 矩阵)
- 地面改纯色纹理(Texture::CreateSolidColor,1x1 程序化生成)

矩阵诊断验证:lightVP 原点深度 -14.70 → 0.30,物体(0.30) < 地面(0.32)
遮挡关系正确。validation 零错误零警告。
2026-09-22 15:35:52 +08:00
atdunbg b86ca460de fix: 阴影光源位置计算反向 + lookAt 垂直光退化——影子可见
根因1(致命):光源位置写成 lightDir*30。lightDir 是光的传播方向
(指向场景),乘 30 后光源跑到场景下方——从地面下方向上打光,
地面永远是光线第一个交点,物体永远不可能遮挡地面,影子恒不存在。
修复:光源位置 = -lightDir * 30(逆传播方向退回)。

根因2:垂直光(direction≈(0,-1,0))时 lookAt 的 up=(0,1,0) 与视线
平行,叉积为零 → 矩阵 NaN → shadow map 全垃圾。修复:|dir.y|>0.99
时改用 (0,0,1) 作为 up。

场景:地面 quad(Model::CreatePlane 程序化构造,AssetManager 缓存)
+ 主光调平让影子落在相机视野内。已截图验证影子可见。
2026-09-22 15:08:08 +08:00
atdunbg d55f644b68 feat: Shadow pass——主光方向光阴影(RenderGraph 双 pass 管线首个验证案例)
- RenderGraph 声明 ShadowMap 虚拟资源(D32,2048²固定分辨率,独立于
  swapchain 尺寸),Shadow pass 写深度 → Forward 声明 ShaderRead 采样,
  barrier/layout(DepthAttachment→ShaderReadOnly)全部由图自动预算
- Shadow pass:空 fragment shader + 深度偏移(斜率缩放)抗 shadow acne
- Forward:UBO 增加 lightSpace 矩阵;Set 2 采样阴影图,手动对比 +
  斜率缩放偏差;clamp-to-border 白色边界(光视锥外 = 全亮)
- 光空间矩阵:主光方向反推 30 单位正交盒;深度重映射 [-1,1]→[0,1]
- GetPhysicalView(slot):物理镜像按帧槽位隔离,描述符 Compile 后一次性写入
- 修复 RG 隐蔽 bug:ShaderStage 与 PipelineStage2 位值不同
  (eFragment=0x10 vs eFragmentShader=0x80),位值直转会撞出
  TESSELLATION_CONTROL stage;改为逐位显式映射
- 修复 Camera 投影深度未重映射到 [0,1] 的潜在裁剪问题

validation 零错误零警告(3 passes / 5 barriers / 4 gpu images)
2026-09-22 14:30:50 +08:00
atdunbg 394bfd3d0c refactor: 实体句柄表皮——实体自己管理组件的 API 形态
- 新增 EntityHandle:e.AddComponent<T>() / e.GetComponent<T>() /
  e.Destroy() / e.GetUUID(),转发 entt registry,零存储开销
- Scene::CreateEntity 返回 EntityHandle;Scene 层组件接口保留
  (给渲染器/系统批量遍历用)
- 语义分层:应用层"实体管组件"(句柄表皮),
  数据层组件存储仍集中在 registry(ECS 性能根基)
2026-09-22 13:59:18 +08:00
atdunbg b73e197783 refactor: ECS 迁移到 entt,移除自研 Registry
- Entity = entt::entity(内部自带版本号),Registry = entt::registry
- Scene 对外接口不变(AddComponent/GetComponent/Each/延迟销毁/UUID),
  Renderer 与 App 层零改动完成迁移
- Each 转发 entt view(自动最小池遍历),延迟销毁队列保留
- 删除自研 Registry.h/Entity.h
2026-09-22 13:51:48 +08:00
atdunbg 8afdd9b245 feat: 引入 RenderGraph、Application 框架、ECS 与资产句柄系统
架构分层(自上而下):
  App(SandboxApp) → Application(生命周期+事件) → Scene(ECS) / AssetManager(句柄) → Renderer → RenderGraph → Vulkan 模块

- RenderGraph:声明式帧图。虚拟资源+生成号句柄、死 pass 剔除、
  拓扑排序、资源生命周期、barrier 编译期预算(Synchronization2)、
  物理镜像池按帧槽位隔离(帧间竞争从根上消除)
- 帧同步修复:per-frame-slot 命令缓冲与 UBO ring(原先单份存在
  数据竞争);统一 kMaxFramesInFlight / FrameContext
- Application:生命周期钩子(OnInit/OnUpdate/OnRender/OnShutdown)
  + 事件系统(GLFW 回调 → POD 事件 → 类型化钩子);main 只 new 派生类
- ECS:自研稀疏集 Registry(Entity=(index,generation) 防悬空,
  O(1) 增删查,Each 取最小池遍历);Scene 延迟销毁队列;
  IdComponent{UUID} 稳定外部身份
- Assets:AssetManager + AssetHandle。组件存句柄不存裸指针/Ref
  (单一所有者 + 多使用者),Renderer 删除 LoadModel 改为纯消费
- 修复退出析构:成员析构前 GPU waitIdle(资产层先于 Renderer
  析构导致 VUID-00922 资源销毁时仍在使用)
- 引入 entt 子模块备用

validation 全程零错误零警告(RTX 5060 实测)
2026-09-22 13:46:05 +08:00
atdunbg 7d628f8d8a 添加多模型渲染,添加贴图渲染,添加平行光, 暂时不上传assets 2026-09-21 14:07:20 +08:00
atdunbg 381b7c0aa6 feat: 搭建 Vulkan 1.4 渲染器骨架,绘制旋转 3D 立方体
使用 Vulkan 1.4 现代路径初始化引擎骨架:
- 用 Shader Object (VK_EXT_shader_object) 替代传统 VkPipeline
- 用 Dynamic Rendering 替代 RenderPass/Framebuffer
- 用 Synchronization2 管理 barrier

核心模块:
- Window:GLFW 封装,GLFW_NO_API 模式,兼容 Wayland
- Log:spdlog 封装
- Types:u32/u64/f32 类型别名

Vulkan 后端:
- Device:Instance、PhysicalDevice、LogicalDevice、Queue 及 feature 查询
- Swapchain:Image、ImageView、DepthBuffer、Recreate
- ShaderManager:SPIR-V 加载与 ShaderEXT 创建
- CommandManager:CommandPool 与主 CommandBuffer
- SyncManager:per-frame Fence 与 ImageAvailable semaphore,per-image RenderFinished semaphore,2 frames in flight
- MemoryAllocator:内存子分配器,256MB block,persistent mapping
- Buffer:VertexBuffer、IndexBuffer、UniformBuffer 封装
- UniformBuffer:每帧上传 MVP 矩阵
- DescriptorManager:DescriptorSetLayout、DescriptorPool、DescriptorSet 及更新

Renderer:
- 协调所有子系统
- 绘制每面不同颜色的旋转 3D 立方体
- 启用 depth test,MVP 矩阵由 GLM 计算

构建:
- CMake 组织 Engine 静态库与 App 可执行文件
- glfw、glm、spdlog 通过 add_subdirectory 引入
2026-09-20 23:09:40 +08:00
atdunbg 706ee2301e 第一次提交 2026-09-18 13:39:44 +08:00