feat: 环境背景管线(IBL 阶段①)——HDR 等距柱状转 cube + Skybox pass

- Cubemap:stbi_loadf 加载 .hdr,CPU 双线性重采样 6 面(GL 规范方向表),
  f32→fp16 转换后整块上传 eCubeCompatible image(R16G16B16A16Sfloat)
- SkyboxPass:HDRColor 的 first writer,承担清屏职责;无环境贴图自动
  退化为纯清屏(Forward 不受影响)
- frag 逐像素 NDC 反投影取世界方向(invVP push,投影变换不可线性插值)
- Forward color 附件 Clear→Load:几何合成在天空之上
- SceneRenderer 产出 skyInvVP = inverse(proj × mat4(mat3(view)))
This commit is contained in:
2026-09-23 18:37:01 +08:00
parent 89bf4256e8
commit 4b5990e6c8
11 changed files with 662 additions and 1 deletions
@@ -0,0 +1,61 @@
//
// Created by atdunbg on 2026/9/23.
//
// SkyboxPass:环境背景(IBL 阶段①)。
//
// HDRColor 的 first writer:承担清屏职责(loadOp Clear),有环境贴图时
// 再画天空——Forward 随之改为 loadOp Load,几何在天空之上合成。
// 职责收口对齐 UE:sky pass 是场景渲染的第一步,无深度附件,
// 深度测试关(几何完全覆盖由 Forward 的深度决定)。
//
// 环境贴图生命周期:Renderer 持有 Cubemap(声明序先于 pass),
// 本 pass 只引用。描述符绑定一次(cube view 全程稳定,不随 RG 重编译)。
//
#ifndef HELLOVULKAN_SKYBOXPASS_H
#define HELLOVULKAN_SKYBOXPASS_H
#include <Engine/Core/FrameContext.h>
#include <Engine/Renderer/Passes/RenderPass.h>
#include <Engine/Renderer/SceneTypes.h>
#include <vulkan/vulkan.hpp>
namespace Engine {
class Device;
class DescriptorManager;
class ShaderManager;
class Cubemap;
namespace Passes {
class SkyboxPass final : public RenderPass {
public:
// env 可为空(HDR 资产缺失):仅承担清屏,天空保持清屏色
SkyboxPass(Device& device, ShaderManager& shaders,
DescriptorManager& descriptors, FrameSceneData& frame,
RG::TextureHandle hdrColor, const Cubemap* env);
~SkyboxPass();
SkyboxPass(const SkyboxPass&) = delete;
SkyboxPass& operator=(const SkyboxPass&) = delete;
void Register(RG::RenderGraph& rg) override;
private:
Device& m_Device;
DescriptorManager& m_Descriptors;
FrameSceneData& m_Frame;
RG::TextureHandle m_HDRColor;
const Cubemap* m_Env; // 可空
vk::DescriptorSetLayout m_SetLayout; // Set0 = {samplerCube}
vk::PipelineLayout m_Layout; // push = invVP 64B
vk::ShaderEXT m_Vert{}, m_Frag{};
std::array<vk::DescriptorSet, kMaxFramesInFlight> m_Sets{};
};
} // namespace Passes
} // namespace Engine
#endif //HELLOVULKAN_SKYBOXPASS_H