Toast Engine
Loading...
Searching...
No Matches
environment_pass.hpp
Go to the documentation of this file.
1
6
7#pragma once
8
10#include "../render_pass_base.hpp"
11#include "../shader_layout.hpp"
12#include "../vulkan_common.hpp"
13#include "../vulkan_pipeline.hpp"
14
15#include <glm/glm.hpp>
16#include <optional>
17#include <string>
18#include <string_view>
20#include <vector>
21
22namespace renderer {
23class VulkanCore;
24
25class EnvironmentPass : public IRenderPass {
26public:
27 EnvironmentPass(const VulkanCore& core, vk::Format hdr_format, vk::Format depth_format);
28
29 [[nodiscard]]
30 auto name() const -> std::string_view override {
31 return "Environment";
32 }
33
34 void recordPre(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index) override;
35
36 void record(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index) override;
37
38 [[nodiscard]]
39 auto stage() const -> RenderStage override {
40 return RenderStage::world;
41 }
42
43 [[nodiscard]]
44 auto getIrradianceView() const -> vk::ImageView;
45
46 [[nodiscard]]
47 auto getPrefilteredView() const -> vk::ImageView;
48
49 [[nodiscard]]
50 auto getSampler() const -> vk::Sampler {
51 return *m_sampler;
52 }
53
54 [[nodiscard]]
55 auto getPrefilteredMipCount() const noexcept -> uint32_t {
56 return m_prefiltered_mips;
57 }
58
59 [[nodiscard]]
60 auto isReady() const noexcept -> bool {
61 return m_has_data;
62 }
63
64 [[nodiscard]]
65 auto getSkyIntensity() const noexcept -> float {
66 return m_intensity;
67 }
68
69 void setSkyIntensity(float intensity) noexcept {
70 if (intensity == m_intensity) {
71 return;
72 }
73 m_intensity = intensity;
74 m_precompute_pending = true;
75 }
76
77 auto setEnvironmentMap(std::string_view uri) -> bool;
78
79 [[nodiscard]]
80 auto getEnvironmentMapUri() const -> const std::string& {
81 return m_environment_uri;
82 }
83
84private:
86 struct Params {
87 glm::vec4 face_right {0.0f};
88 glm::vec4 face_up {0.0f};
89 glm::vec4 face_forward {0.0f};
90 float roughness = 0.0f;
91 float intensity = 1.0f;
92 glm::vec2 pad0 {0.0f};
93 };
94
95 void createPipelines(const VulkanCore& core);
96 void createDescriptors(const VulkanCore& core);
97
98 void renderFace(
99 vk::CommandBuffer cmd, const VulkanPipeline& pipeline, vk::DescriptorSet set, const CubemapTarget& target, uint32_t mip,
100 uint32_t face, const Params& params
101 );
102
103 const VulkanCore* m_core = nullptr;
104 vk::Format m_format = vk::Format::eUndefined;
105
106 ShaderLayout m_shader_layout;
107 VulkanPipeline m_sky_pipeline;
108 VulkanPipeline m_equirect_pipeline;
109 VulkanPipeline m_irradiance_pipeline;
110 VulkanPipeline m_prefilter_pipeline;
111 VulkanPipeline m_skybox_pipeline;
112 vk::Format m_depth_format = vk::Format::eUndefined;
113
114 vk::raii::Sampler m_sampler = nullptr;
115
116 CubemapTarget m_sky;
117 CubemapTarget m_irradiance;
118 CubemapTarget m_prefiltered;
119
120 vk::raii::DescriptorSet m_sky_source_set = nullptr;
121
122 std::optional<vma::raii::Image> m_equirect_image;
123 std::optional<vk::raii::ImageView> m_equirect_view;
124 vk::raii::Sampler m_equirect_sampler = nullptr;
125
127 vk::raii::DescriptorSet m_equirect_set = nullptr;
128 std::string m_environment_uri;
129 bool m_has_equirect = false;
130
131 void createEquirectPlaceholder(const VulkanCore& core);
132 void writeEquirectSet(const VulkanCore& core);
133 auto uploadEquirect(const assets::HdrImage& image) -> bool;
134
135 uint32_t m_prefiltered_mips = 1;
136 bool m_precompute_pending = true;
137 bool m_has_data = false;
138
139 float m_intensity = 3.0f;
140};
141
142}
Definition render_pass_base.hpp:19
Definition cubemap_target.hpp:18
void recordPre(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index) override
Records outside any rendering scope before the main scope opens.
Definition environment_pass.cpp:351
Definition shader_layout.hpp:12
Definition vulkan_core.hpp:48
Definition vulkan_pipeline.hpp:19
Decoding for high-dynamic-range images, used for imported environment maps.
A decoded floating-point image, always four channels.
Definition hdr_image.hpp:25