Files
HelloVulkan/Engine/include/Engine/Core/AssetRef.h
T
atdunbg 1d690067bd feat: IBL 预积分 GPU compute 化 + 环境资产入 Assets 层(动态切换)
CPU 逐像素卷积(venice 4k 阻塞 7.36s)→ 4 个 compute shader 一次性
提交:equirect→cube / irradiance / prefilter×5mip / BRDF LUT。
Cubemap 瘦身为纯资源持有类,生成职责移交 IblGenerator;
环境经 AssetManager 缓存(EnvRef),Renderer::SetEnvironment
动态换绑(RenderPass::OnEnvironmentChanged 广播)。
调试视图 +4:EnvCube / Irradiance / Prefilter / BRDF LUT。

性能前后对比(RTX 5060 Laptop,venice_dawn_1_4k.hdr):
- 改造前 CPU:7.36 s(主线程阻塞)
- 改造后 GPU:HDR decode 127-134ms + 资源 22-35ms + compute 17-19ms
  ≈ 165-190ms(约 40×);Neutral 兜底 ~6ms
- 运行中动态切换环境同量级(ms 级 GPU,decode 占大头)

冒烟:两构建目录 0 警告;运行期 0 validation(含两次环境切换 +
调试视图 9-12 轮播自动化验证)。
2026-09-24 13:23:59 +08:00

48 lines
1.5 KiB
C++

//
// Created by atdunbg on 2026/9/23.
//
// AssetRef:中性资产引用 = (池内索引, 生成号),与 Entity/RG 句柄同一哲学。
//
// 放在 Core 层(不依赖 Assets/Vulkan):ECS 组件、序列化数据只存这个
// 纯值类型。对齐 UE/Unity 的做法——组件持有"资产引用",但不感知资产
// 系统内部:Unity 的 InstanceID、UE 的 FSoftObjectPath 本质都是中性引用
// 值,解析归资产系统(AssetManager)。
// 悬空引用(generation 不匹配)由 AssetCache::Get 显式拒绝。
//
#ifndef HELLOVULKAN_ASSETREF_H
#define HELLOVULKAN_ASSETREF_H
#include <Engine/Core/Types.h>
// 资产类型前向声明(必须放全局层:namespace 内前向声明会创建
// Engine::Assets::Engine::Model 这类错误嵌套命名空间)
namespace Engine {
class Model;
class Cubemap;
class Texture;
class Material;
}
namespace Engine {
inline constexpr u32 kInvalidAssetIndex = 0xFFFFFFFF;
template<typename T>
struct AssetRef {
u32 index = kInvalidAssetIndex;
u32 generation = 0;
bool Valid() const { return index != kInvalidAssetIndex; }
explicit operator bool() const { return Valid(); }
bool operator==(const AssetRef& o) const = default;
};
// 常用别名(新增资产类型时在这里加一行)
using ModelRef = AssetRef<Model>;
using EnvRef = AssetRef<Cubemap>; // 环境(IBL 四件套)
} // namespace Engine
#endif //HELLOVULKAN_ASSETREF_H