Toast Engine
Toggle main menu visibility
Loading...
Searching...
No Matches
environment_pass.hpp
Go to the documentation of this file.
1
6
7
#pragma once
8
9
#include "
../cubemap_target.hpp
"
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>
19
#include <
toast/assets/hdr_image.hpp
>
20
#include <vector>
21
22
namespace
renderer {
23
class
VulkanCore
;
24
25
class
EnvironmentPass :
public
IRenderPass
{
26
public
:
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
84
private
:
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
}
IRenderPass
Definition
render_pass_base.hpp:19
renderer::CubemapTarget
Definition
cubemap_target.hpp:18
renderer::EnvironmentPass::recordPre
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
renderer::ShaderLayout
Definition
shader_layout.hpp:12
renderer::VulkanCore
Definition
vulkan_core.hpp:48
renderer::VulkanPipeline
Definition
vulkan_pipeline.hpp:19
cubemap_target.hpp
hdr_image.hpp
Decoding for high-dynamic-range images, used for imported environment maps.
assets::HdrImage
A decoded floating-point image, always four channels.
Definition
hdr_image.hpp:25
engine
src
toast
renderer
passes
environment_pass.hpp
Generated by
1.17.0