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:
@@ -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
|
||||
Reference in New Issue
Block a user