Unravel Engine C++ Reference
Loading...
Searching...
No Matches
tonemapping_pass.cpp
Go to the documentation of this file.
1#include "tonemapping_pass.h"
5#include <graphics/texture.h>
6
7namespace unravel
8{
9
11{
12 auto& am = ctx.get_cached<asset_manager>();
13
14 auto vs_clip_quad_ex = am.get_asset<gfx::shader>("engine:/data/shaders/vs_clip_quad.sc");
15 auto fs_atmospherics = am.get_asset<gfx::shader>("engine:/data/shaders/tonemapping/fs_tonemapping.sc");
16
17 tonemapping_program_.program = std::make_unique<gpu_program>(vs_clip_quad_ex, fs_atmospherics);
18 tonemapping_program_.cache_uniforms();
19
20 return true;
21}
22
23auto tonemapping_pass::create_or_update_output_fb(gfx::render_view& rview,
26{
27 if(output)
28 {
29 return output;
30 }
31 auto input_sz = input->get_size();
32 // This is presumably your engine’s method to get the bgfx::TextureFormat.
33 // If your engine uses something else, adapt accordingly.
34
35 auto& output_tex = rview.tex_get_or_emplace("TONEMAPPING_OUTPUT");
36 if(gfx::needs_recreate(output_tex, input_sz))
37 {
38 output_tex.reset();
39 output_tex = std::make_shared<gfx::texture>(input_sz.width,
40 input_sz.height,
41 false,
42 1,
43 gfx::texture_format::RGBA8,
44 BGFX_TEXTURE_RT);
45 }
46 auto& output_fbo = rview.fbo_get_or_emplace("TONEMAPPING_OUTPUT");
47 if(gfx::needs_recreate(output_fbo, input_sz))
48 {
49 output_fbo.reset();
50 output_fbo = std::make_shared<gfx::frame_buffer>();
51 output_fbo->populate({output_tex});
52 }
53 return output_fbo;
54}
55
57{
58 // {
59 // {
60 // // Calculate luminance.
61 // setOffsets2x2Lum(u_offset, 128, 128);
62 // bgfx::setTexture(0, s_texColor, m_fbtextures[0]);
63 // bgfx::setState(BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A);
64 // screenSpaceQuad(m_caps->originBottomLeft);
65 // bgfx::submit(hdrLuminance, m_lumProgram);
66
67 // // Downscale luminance 0.
68 // setOffsets4x4Lum(u_offset, 128, 128);
69 // bgfx::setTexture(0, s_texColor, bgfx::getTexture(m_lum[0]) );
70 // bgfx::setState(BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A);
71 // screenSpaceQuad(m_caps->originBottomLeft);
72 // bgfx::submit(hdrLumScale0, m_lumAvgProgram);
73
74 // // Downscale luminance 1.
75 // setOffsets4x4Lum(u_offset, 64, 64);
76 // bgfx::setTexture(0, s_texColor, bgfx::getTexture(m_lum[1]) );
77 // bgfx::setState(BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A);
78 // screenSpaceQuad(m_caps->originBottomLeft);
79 // bgfx::submit(hdrLumScale1, m_lumAvgProgram);
80
81 // // Downscale luminance 2.
82 // setOffsets4x4Lum(u_offset, 16, 16);
83 // bgfx::setTexture(0, s_texColor, bgfx::getTexture(m_lum[2]) );
84 // bgfx::setState(BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A);
85 // screenSpaceQuad(m_caps->originBottomLeft);
86 // bgfx::submit(hdrLumScale2, m_lumAvgProgram);
87
88 // // Downscale luminance 3.
89 // setOffsets4x4Lum(u_offset, 4, 4);
90 // bgfx::setTexture(0, s_texColor, bgfx::getTexture(m_lum[3]) );
91 // bgfx::setState(BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A);
92 // screenSpaceQuad(m_caps->originBottomLeft);
93 // bgfx::submit(hdrLumScale3, m_lumAvgProgram);
94
95 // // m_bright pass m_threshold is tonemap[3].
96 // setOffsets4x4Lum(u_offset, m_width/2, m_height/2);
97 // bgfx::setTexture(0, s_texColor, m_fbtextures[0]);
98 // bgfx::setTexture(1, s_texLum, bgfx::getTexture(m_lum[4]) );
99 // bgfx::setState(BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A);
100 // bgfx::setUniform(u_tonemap, tonemap);
101 // screenSpaceQuad(m_caps->originBottomLeft);
102 // bgfx::submit(hdrBrightness, m_brightProgram);
103
104 // // m_blur m_bright pass vertically.
105 // bgfx::setTexture(0, s_texColor, bgfx::getTexture(m_bright) );
106 // bgfx::setState(BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A);
107 // bgfx::setUniform(u_tonemap, tonemap);
108 // screenSpaceQuad(m_caps->originBottomLeft);
109 // bgfx::submit(hdrVBlur, m_blurProgram);
110 // }
111 // }
112 const auto& input = params.input;
113 auto output = create_or_update_output_fb(rview, params.input, params.output);
114
115 gfx::render_pass pass("Tonemapping/Pass");
116 pass.bind(output.get());
117
118 const auto output_size = output->get_size();
119
120 tonemapping_program_.program->begin();
121
122 float tonemap[4] = {params.config.exposure, static_cast<float>(params.config.method), 0.0, 0.0f};
123 gfx::set_uniform(tonemapping_program_.u_tonemapping, tonemap);
124
125 gfx::set_texture(tonemapping_program_.s_input, 0, input->get_texture());
126 gfx::set_texture(tonemapping_program_.s_exposure, 1, params.exposure_texture ? params.exposure_texture : default_textures::get().white_texture());
127
128 irect32_t rect(0, 0, irect32_t::value_type(output_size.width), irect32_t::value_type(output_size.height));
130 auto topology = gfx::clip_quad(1.0f);
131 gfx::set_state(topology | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A);
132 gfx::submit(pass.id, tonemapping_program_.program->native_handle());
133 gfx::set_state(BGFX_STATE_DEFAULT);
134 tonemapping_program_.program->end();
135
136 gfx::discard();
137
138 return output;
139}
140
142{
143 rview.fbo_remove("TONEMAPPING_OUTPUT");
144 rview.tex_remove("TONEMAPPING_OUTPUT");
145}
146
147} // namespace unravel
void tex_remove(const hpp::string_view &id)
void fbo_remove(const hpp::string_view &id)
Manages assets, including loading, unloading, and storage.
auto get_asset(const std::string &key, load_flags flags=load_flags::standard, load_mode mode=load_mode::immediate) -> asset_handle< T >
Gets an asset by its key.
static auto get() -> default_textures &
void release_resources(gfx::render_view &rview)
auto run(gfx::render_view &rview, const run_params &params) -> gfx::frame_buffer::ptr
auto init(rtti::context &ctx) -> bool
void submit(view_id _id, program_handle _handle, int32_t _depth, bool _preserveState)
uint16_t set_scissor(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
Definition graphics.cpp:952
void set_state(uint64_t _state, uint32_t _rgba)
Definition graphics.cpp:937
auto needs_recreate(const gfx::frame_buffer::ptr &fbo, const usize32_t &size) -> bool
void discard(uint8_t _flags)
void set_uniform(uniform_handle _handle, const void *_value, uint16_t _num)
Definition graphics.cpp:977
auto clip_quad(float depth, float width, float height) -> uint64_t
void set_texture(uint8_t _stage, uniform_handle _sampler, texture_handle _handle, uint32_t _flags)
gfx::view_id id
void bind(const frame_buffer *fb=nullptr) const
T width() const
std::int32_t value_type
T height() const