mirror of
https://github.com/harfang3d/harfang3d.git
synced 2024-07-16 15:02:19 +00:00
83 lines
3.4 KiB
C++
83 lines
3.4 KiB
C++
// HARFANG(R) Copyright (C) 2021 Emmanuel Julien, NWNC HARFANG. Released under GPL/LGPL/Commercial Licence, see licence.txt for details.
|
|
|
|
#include "engine/taa.h"
|
|
|
|
#include "foundation/file_rw_interface.h"
|
|
#include "foundation/format.h"
|
|
#include "foundation/projection.h"
|
|
|
|
#include "engine/assets_rw_interface.h"
|
|
|
|
namespace hg {
|
|
|
|
bool IsValid(const TAA &taa) { return bgfx::isValid(taa.u_color) && bgfx::isValid(taa.u_prv_color) && bgfx::isValid(taa.u_attr0) && bgfx::isValid(taa.u_attr1); }
|
|
|
|
static TAA _CreateTAA(const Reader &ir, const ReadProvider &ip, const char *path) {
|
|
TAA taa;
|
|
|
|
taa.prg_taa = hg::LoadProgram(ir, ip, hg::format("%1/shader/taa").arg(path));
|
|
taa.u_color = bgfx::createUniform("u_color", bgfx::UniformType::Sampler);
|
|
taa.u_prv_color = bgfx::createUniform("u_prv_color", bgfx::UniformType::Sampler);
|
|
taa.u_attr0 = bgfx::createUniform("u_attr0", bgfx::UniformType::Sampler);
|
|
taa.u_attr1 = bgfx::createUniform("u_attr1", bgfx::UniformType::Sampler);
|
|
|
|
if (!IsValid(taa)) {
|
|
DestroyTAA(taa);
|
|
}
|
|
return taa;
|
|
}
|
|
|
|
TAA CreateTAAFromFile(const char *path) { return _CreateTAA(g_file_reader, g_file_read_provider, path); }
|
|
TAA CreateTAAFromAssets(const char *path) { return _CreateTAA(g_assets_reader, g_assets_read_provider, path); }
|
|
|
|
void DestroyTAA(TAA &taa) {
|
|
bgfx_Destroy(taa.prg_taa);
|
|
bgfx_Destroy(taa.u_color);
|
|
bgfx_Destroy(taa.u_prv_color);
|
|
bgfx_Destroy(taa.u_attr0);
|
|
bgfx_Destroy(taa.u_attr1);
|
|
}
|
|
|
|
void ApplyTAA(bgfx::ViewId &view_id, const iRect &rect, const Texture &color, const Texture &prv_color, const Texture &attr0, const Texture &attr1,
|
|
bgfx::FrameBufferHandle output, const TAA &taa) {
|
|
__ASSERT__(IsValid(taa));
|
|
|
|
bgfx::TransientIndexBuffer idx;
|
|
bgfx::TransientVertexBuffer vtx;
|
|
CreateFullscreenQuad(idx, vtx);
|
|
|
|
float ortho[16];
|
|
memcpy(ortho, hg::to_bgfx(hg::Compute2DProjectionMatrix(0.f, 100.f, 1.f, 1.f, false)).data(), sizeof(float[16]));
|
|
|
|
bgfx::setViewName(view_id, "TAA");
|
|
bgfx::setViewRect(view_id, rect.sx, rect.sy, GetWidth(rect), GetHeight(rect));
|
|
bgfx::setViewFrameBuffer(view_id, output);
|
|
bgfx::setViewTransform(view_id, NULL, ortho);
|
|
bgfx::setViewClear(view_id, BGFX_CLEAR_NONE, 0, 1.f, UINT8_MAX);
|
|
bgfx::setTexture(0, taa.u_color, color.handle, uint32_t(color.flags));
|
|
bgfx::setTexture(1, taa.u_prv_color, prv_color.handle, uint32_t(prv_color.flags));
|
|
bgfx::setTexture(2, taa.u_attr0, attr0.handle, uint32_t(attr0.flags));
|
|
bgfx::setTexture(3, taa.u_attr1, attr1.handle, uint32_t(attr1.flags));
|
|
|
|
bgfx::setState(BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_DEPTH_TEST_ALWAYS);
|
|
bgfx::setIndexBuffer(&idx);
|
|
bgfx::setVertexBuffer(0, &vtx);
|
|
bgfx::submit(view_id, taa.prg_taa);
|
|
view_id++;
|
|
}
|
|
|
|
Vec2 TAAProjectionJitter8(int frame) {
|
|
static const Vec2 grid[8] = {Vec2(-7.f, 1.f) / 8.f, Vec2(-5.f, -5.f) / 8.f, Vec2(-1.f, -3.f) / 8.f, Vec2(3.f, -7.f) / 8.f, Vec2(5.f, -1.f) / 8.f,
|
|
Vec2(7.f, 7.f) / 8.f, Vec2(1.f, 3.f) / 8.f, Vec2(-3.f, 5.f) / 8.f};
|
|
return grid[frame & 7];
|
|
}
|
|
|
|
Vec2 TAAProjectionJitter16(int frame) {
|
|
static const Vec2 grid[16] = {Vec2(-8.f, 0.f) / 8.f, Vec2(-6.f, -4.f) / 8.f, Vec2(-3.f, -2.f) / 8.f, Vec2(-2.f, -6.f) / 8.f, Vec2(1.f, -1.f) / 8.f,
|
|
Vec2(2.f, -5.f) / 8.f, Vec2(6.f, -7.f) / 8.f, Vec2(5.f, -3.f) / 8.f, Vec2(4.f, 1.f) / 8.f, Vec2(7.f, 4.f) / 8.f, Vec2(3.f, 5.f) / 8.f,
|
|
Vec2(0.f, 7.f) / 8.f, Vec2(-1.f, 3.f) / 8.f, Vec2(-4.f, 6.f) / 8.f, Vec2(-7.f, 8.f) / 8.f, Vec2(-5.f, 2.f) / 8.f};
|
|
return grid[frame & 15];
|
|
}
|
|
|
|
} // namespace hg
|