Unravel Engine C++ Reference
Loading...
Searching...
No Matches
assao_pass.h
Go to the documentation of this file.
1#pragma once
2
6
7namespace unravel
8{
9
11{
12public:
13
14 struct settings
15 {
16 // clang-format off
17
22 float radius{1.2f};
23
28 float shadow_multiplier{1.0f};
29
34 float shadow_power{1.0f};
35
40 float shadow_clamp{0.98f};
41
48
53 float fade_out_from{50.0f};
54
59 float fade_out_to{200.0f};
60
71 int32_t quality_level{3};
72
78
84 int32_t blur_pass_count{2};
85
93 float sharpness{0.98f};
94
102
109
116
121 bool generate_normals{false};
122
123 // clang-format on
124 };
125
134
135
136 assao_pass() = default;
138 {
139 shutdown();
140 }
141
142 auto init(rtti::context& ctx) -> bool;
143 void run(const camera& camera, gfx::render_view& rview, const run_params& params);
144 auto shutdown() -> int32_t;
146
147private:
148 struct dimensions
149 {
150 int32_t size[2]{};
151 int32_t halfSize[2]{};
152 int32_t quarterSize[2]{};
153 int32_t fullResOutScissorRect[4]{};
154 int32_t halfResOutScissorRect[4]{};
155 };
156 void create_or_update_frame_buffers(gfx::render_view& rview, const dimensions& dims);
157 void update_uniforms(int32_t _pass, const float* view, const float* proj, const dimensions& dims);
158
159 struct uniforms
160 {
161 enum
162 {
163 NumVec4 = 19
164 };
165
166 void init()
167 {
168 u_params = bgfx::createUniform("u_params", bgfx::UniformType::Vec4, NumVec4);
169 }
170
171 void submit()
172 {
173 bgfx::setUniform(u_params, m_params, NumVec4);
174 }
175
176 void destroy()
177 {
178 bgfx::destroy(u_params);
179 }
180
181 // clang-format off
182 union
183 {
184 struct
185 {
186 /* 0 */ struct { float m_viewportPixelSize[2]; float m_halfViewportPixelSize[2]; };
187 /* 1 */ struct { float m_depthUnpackConsts[2]; float m_unused0[2]; };
188 /* 2 */ struct { float m_ndcToViewMul[2]; float m_ndcToViewAdd[2]; };
189 /* 3 */ struct { float m_perPassFullResCoordOffset[2]; float m_perPassFullResUVOffset[2]; };
190 /* 4 */ struct { float m_viewport2xPixelSize[2]; float m_viewport2xPixelSize_x_025[2]; };
191 /* 5 */ struct { float m_effectRadius; float m_effectShadowStrength; float m_effectShadowPow; float m_effectShadowClamp; };
192 /* 6 */ struct { float m_effectFadeOutMul; float m_effectFadeOutAdd; float m_effectHorizonAngleThreshold; float m_effectSamplingRadiusNearLimitRec; };
193 /* 7 */ struct { float m_depthPrecisionOffsetMod; float m_negRecEffectRadius; float m_loadCounterAvgDiv; float m_adaptiveSampleCountLimit; };
194 /* 8 */ struct { float m_invSharpness; float m_passIndex; float m_quarterResPixelSize[2]; };
195 /* 9-13 */ struct { float m_patternRotScaleMatrices[5][4]; };
196 /* 14 */ struct { float m_normalsUnpackMul; float m_normalsUnpackAdd; float m_detailAOStrength; float m_layer; };
197 /* 15-18 */ struct { float m_normalsWorldToViewspaceMatrix[16]; };
198 };
199
200 float m_params[NumVec4 * 4];
201 };
202 // clang-format on
203
204 bgfx::UniformHandle u_params{bgfx::kInvalidHandle};
205 };
206
207 // Resource handles
208
209 bgfx::ProgramHandle m_prepareDepthsProgram{bgfx::kInvalidHandle};
210 bgfx::ProgramHandle m_prepareDepthsAndNormalsProgram{bgfx::kInvalidHandle};
211 bgfx::ProgramHandle m_prepareDepthsHalfProgram{bgfx::kInvalidHandle};
212 bgfx::ProgramHandle m_prepareDepthsAndNormalsHalfProgram{bgfx::kInvalidHandle};
213 bgfx::ProgramHandle m_prepareDepthMipProgram{bgfx::kInvalidHandle};
214 bgfx::ProgramHandle m_generateQ0Program{bgfx::kInvalidHandle};
215 bgfx::ProgramHandle m_generateQ1Program{bgfx::kInvalidHandle};
216 bgfx::ProgramHandle m_generateQ2Program{bgfx::kInvalidHandle};
217 bgfx::ProgramHandle m_generateQ3Program{bgfx::kInvalidHandle};
218 bgfx::ProgramHandle m_generateQ3BaseProgram{bgfx::kInvalidHandle};
219
220 bgfx::ProgramHandle m_generateQ0ProgramRgba16f{bgfx::kInvalidHandle};
221 bgfx::ProgramHandle m_generateQ1ProgramRgba16f{bgfx::kInvalidHandle};
222 bgfx::ProgramHandle m_generateQ2ProgramRgba16f{bgfx::kInvalidHandle};
223 bgfx::ProgramHandle m_generateQ3ProgramRgba16f{bgfx::kInvalidHandle};
224 bgfx::ProgramHandle m_generateQ3BaseProgramRgba16f{bgfx::kInvalidHandle};
225
226 bgfx::ProgramHandle m_smartBlurProgram{bgfx::kInvalidHandle};
227 bgfx::ProgramHandle m_smartBlurWideProgram{bgfx::kInvalidHandle};
228 bgfx::ProgramHandle m_nonSmartBlurProgram{bgfx::kInvalidHandle};
229 bgfx::ProgramHandle m_applyProgram{bgfx::kInvalidHandle};
230 bgfx::ProgramHandle m_nonSmartApplyProgram{bgfx::kInvalidHandle};
231 bgfx::ProgramHandle m_nonSmartHalfApplyProgram{bgfx::kInvalidHandle};
232 bgfx::ProgramHandle m_generateImportanceMapProgram{bgfx::kInvalidHandle};
233 bgfx::ProgramHandle m_postprocessImportanceMapAProgram{bgfx::kInvalidHandle};
234 bgfx::ProgramHandle m_postprocessImportanceMapBProgram{bgfx::kInvalidHandle};
235 bgfx::ProgramHandle m_loadCounterClearProgram{bgfx::kInvalidHandle};
236
237 bgfx::ProgramHandle m_updateGBufferProgram{bgfx::kInvalidHandle};
238
239 // Shader uniforms
240 bgfx::UniformHandle u_rect{bgfx::kInvalidHandle};
241
242 // Uniforms to identify texture samples
243 bgfx::UniformHandle s_normal{bgfx::kInvalidHandle};
244 bgfx::UniformHandle s_depth{bgfx::kInvalidHandle};
245 bgfx::UniformHandle s_ao{bgfx::kInvalidHandle};
246 bgfx::UniformHandle s_blurInput{bgfx::kInvalidHandle};
247 bgfx::UniformHandle s_finalSSAO{bgfx::kInvalidHandle};
248 bgfx::UniformHandle s_depthSource{bgfx::kInvalidHandle};
249 bgfx::UniformHandle s_viewspaceDepthSource{bgfx::kInvalidHandle};
250 bgfx::UniformHandle s_viewspaceDepthSourceMirror{bgfx::kInvalidHandle};
251 bgfx::UniformHandle s_importanceMap{bgfx::kInvalidHandle};
252
253 bgfx::DynamicIndexBufferHandle m_loadCounter{bgfx::kInvalidHandle};
254
255 settings m_settings{};
256 uniforms m_uniforms{};
257
258 std::vector<gpu_program::ptr> m_programs;
259};
260} // namespace unravel
auto init(rtti::context &ctx) -> bool
void run(const camera &camera, gfx::render_view &rview, const run_params &params)
void release_resources(gfx::render_view &rview)
auto shutdown() -> int32_t
Class representing a camera. Contains functionality for manipulating and updating a camera....
Definition camera.h:62
uint16_t view