mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-06 13:48:01 +03:00
TAA
This commit is contained in:
+140
-56
@@ -149,8 +149,7 @@ namespace rndr {
|
||||
calc_exposure(cam);
|
||||
apply_tone_map(light_proj_tex, npr_param);
|
||||
|
||||
if (mlaa)
|
||||
apply_mlaa(ss_alpha_mask);
|
||||
apply_mlaa(taa_texture_selector, 2, ss_alpha_mask);
|
||||
|
||||
for (int32_t i = 0; i < 16; i++) {
|
||||
if (!render_textures_data[i])
|
||||
@@ -165,7 +164,7 @@ namespace rndr {
|
||||
uniform_value[U_REDUCE] = 0;
|
||||
|
||||
gl_state_set_viewport(0, 0, t->width, t->height);
|
||||
gl_state_active_bind_texture_2d(0, taa_tex[2]->glid);
|
||||
gl_state_active_bind_texture_2d(0, taa_tex[taa_texture_selector]->glid);
|
||||
gl_state_bind_sampler(0, rctx->render_samplers[0]);
|
||||
shaders_ft.set(SHADER_FT_REDUCE);
|
||||
draw_quad(render_post_width[0], render_post_height[0],
|
||||
@@ -174,14 +173,80 @@ namespace rndr {
|
||||
}
|
||||
|
||||
copy_to_frame_texture(rend_texture[0].GetColorTex(),
|
||||
render_width[0], render_height[0], taa_tex[2]->glid);
|
||||
render_width[0], render_height[0], taa_tex[taa_texture_selector]->glid);
|
||||
|
||||
frame_texture_reset_capture();
|
||||
if (taa) {
|
||||
if (taa_blend >= 0.0f)
|
||||
calc_taa_blend();
|
||||
else
|
||||
taa_blend = 1.0f;
|
||||
}
|
||||
|
||||
if (taa_blend < 0.0f || taa_blend >= 1.0f)
|
||||
taa_texture = taa_texture_selector;
|
||||
else {
|
||||
bool blur;
|
||||
GLuint sampler;
|
||||
if (taa_blend > 0.99f) {
|
||||
blur = true;
|
||||
sampler = rctx->render_samplers[0];
|
||||
}
|
||||
else {
|
||||
blur = false;
|
||||
sampler = rctx->render_samplers[1];
|
||||
}
|
||||
|
||||
taa_texture = 2;
|
||||
taa_buffer[2].Bind();
|
||||
glViewport(0, 0, render_width[0], render_height[0]);
|
||||
gl_state_active_bind_texture_2d(0, taa_tex[taa_texture_selector]->glid);
|
||||
gl_state_bind_sampler(0, sampler);
|
||||
|
||||
if (blur) {
|
||||
gl_state_active_bind_texture_2d(2, rend_texture[0].depth_texture->glid);
|
||||
gl_state_bind_sampler(2, sampler);
|
||||
|
||||
mat4 mat;
|
||||
mat4_invert(&cam_view_projection, &mat);
|
||||
mat4_mul(&cam_view_projection_prev, &mat, &mat);
|
||||
mat4_transpose(&mat, &mat);
|
||||
uniform_value[U_REDUCE] = 6;
|
||||
|
||||
camera_blur_shader_data shader_data = {};
|
||||
shader_data.g_transform[0] = mat.row0;
|
||||
shader_data.g_transform[1] = mat.row1;
|
||||
shader_data.g_transform[2] = mat.row2;
|
||||
shader_data.g_transform[3] = mat.row3;
|
||||
rctx->camera_blur_ubo.WriteMemory(shader_data);
|
||||
rctx->camera_blur_ubo.Bind(1);
|
||||
}
|
||||
else {
|
||||
int32_t taa_texture_selector = this->taa_texture_selector + 1;
|
||||
if (taa_texture_selector > taa)
|
||||
taa_texture_selector = 0;
|
||||
gl_state_active_bind_texture_2d(1, taa_tex[taa_texture_selector]->glid);
|
||||
gl_state_bind_sampler(1, sampler);
|
||||
uniform_value[U_REDUCE] = 5;
|
||||
}
|
||||
|
||||
shaders_ft.set(SHADER_FT_REDUCE);
|
||||
|
||||
draw_quad(render_post_width[0], render_post_height[0],
|
||||
render_post_width_scale, render_post_height_scale,
|
||||
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, taa_blend);
|
||||
}
|
||||
|
||||
if (taa) {
|
||||
int32_t taa_texture_selector = this->taa_texture_selector + 1;
|
||||
if (taa_texture_selector > taa)
|
||||
taa_texture_selector = 0;
|
||||
this->taa_texture_selector = taa_texture_selector;
|
||||
}
|
||||
|
||||
rctx->screen_buffer.Bind();
|
||||
gl_state_set_viewport(0, 0, rctx->sprite_width, rctx->sprite_height);
|
||||
if (ssaa) {
|
||||
gl_state_active_bind_texture_2d(0, taa_tex[2]->glid);
|
||||
gl_state_active_bind_texture_2d(0, taa_tex[taa_texture]->glid);
|
||||
gl_state_bind_sampler(0, rctx->render_samplers[0]);
|
||||
uniform_value[U_ALPHA_MASK] = ss_alpha_mask ? 1 : 0;
|
||||
uniform_value[U_REDUCE] = 0;
|
||||
@@ -192,7 +257,7 @@ namespace rndr {
|
||||
uniform_value[U_ALPHA_MASK] = 0;
|
||||
}
|
||||
else {
|
||||
gl_state_active_bind_texture_2d(0, taa_tex[2]->glid);
|
||||
gl_state_active_bind_texture_2d(0, taa_tex[taa_texture]->glid);
|
||||
if (mag_filter == MAG_FILTER_NEAREST)
|
||||
gl_state_bind_sampler(0, rctx->render_samplers[1]);
|
||||
else
|
||||
@@ -337,6 +402,9 @@ namespace rndr {
|
||||
else
|
||||
stage_index = task_stage_get_current_stage_index();
|
||||
|
||||
cam_view_projection_prev = cam_view_projection;
|
||||
cam_view_projection = cam->view_projection;
|
||||
|
||||
reset_exposure = cam->fast_change_hist1 && !cam->fast_change_hist0;
|
||||
if (reset_exposure) {
|
||||
float_t view_point_dist = vec3::distance(view_point, view_point_prev);
|
||||
@@ -1449,51 +1517,56 @@ namespace rndr {
|
||||
taa_blend = -1.0f;
|
||||
}
|
||||
|
||||
void Render::apply_mlaa(int32_t ss_alpha_mask) {
|
||||
render_context* rctx = rctx_ptr;
|
||||
void Render::apply_mlaa(int32_t destination, int32_t source, int32_t ss_alpha_mask) {
|
||||
if (mlaa) {
|
||||
gl_state_begin_event("PostProcess::mlaa");
|
||||
mlaa_buffer.Bind();
|
||||
gl_state_active_bind_texture_2d(0, taa_tex[source]->glid);
|
||||
gl_state_bind_sampler(0, rctx_ptr->render_samplers[1]);
|
||||
uniform_value[U_MLAA] = 0;
|
||||
shaders_ft.set(SHADER_FT_MLAA);
|
||||
draw_quad(render_post_width[0], render_post_height[0],
|
||||
render_post_width_scale, render_post_height_scale,
|
||||
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
|
||||
gl_state_begin_event("PostProcess::mlaa");
|
||||
mlaa_buffer.Bind();
|
||||
gl_state_active_bind_texture_2d(0, taa_tex[2]->glid);
|
||||
gl_state_bind_sampler(0, rctx->render_samplers[1]);
|
||||
uniform_value[U_MLAA] = 0;
|
||||
shaders_ft.set(SHADER_FT_MLAA);
|
||||
draw_quad(render_post_width[0], render_post_height[0],
|
||||
render_post_width_scale, render_post_height_scale,
|
||||
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
temp_buffer.Bind();
|
||||
gl_state_active_bind_texture_2d(0, mlaa_buffer.GetColorTex());
|
||||
gl_state_active_bind_texture_2d(1, mlaa_area_texture);
|
||||
gl_state_bind_sampler(0, rctx_ptr->render_samplers[0]);
|
||||
gl_state_bind_sampler(1, rctx_ptr->render_samplers[3]);
|
||||
uniform_value[U_MLAA] = 1;
|
||||
uniform_value[U_MLAA_SEARCH] = 2;
|
||||
shaders_ft.set(SHADER_FT_MLAA);
|
||||
draw_quad(render_post_width[0], render_post_height[0],
|
||||
render_post_width_scale, render_post_height_scale,
|
||||
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
|
||||
temp_buffer.Bind();
|
||||
gl_state_active_bind_texture_2d(0, mlaa_buffer.GetColorTex());
|
||||
gl_state_active_bind_texture_2d(1, mlaa_area_texture);
|
||||
gl_state_bind_sampler(0, rctx->render_samplers[0]);
|
||||
gl_state_bind_sampler(1, rctx->render_samplers[3]);
|
||||
uniform_value[U_MLAA] = 1;
|
||||
uniform_value[U_MLAA_SEARCH] = 2;
|
||||
shaders_ft.set(SHADER_FT_MLAA);
|
||||
draw_quad(render_post_width[0], render_post_height[0],
|
||||
render_post_width_scale, render_post_height_scale,
|
||||
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
|
||||
RenderTexture& buf_texture = rctx->render_buffer;
|
||||
buf_texture.Bind();
|
||||
gl_state_active_bind_texture_2d(0, taa_tex[2]->glid);
|
||||
gl_state_active_bind_texture_2d(1, temp_buffer.GetColorTex());
|
||||
gl_state_bind_sampler(0, rctx->render_samplers[1]);
|
||||
gl_state_bind_sampler(1, rctx->render_samplers[1]);
|
||||
uniform_value[U_MLAA] = 2;
|
||||
uniform_value[U_ALPHA_MASK] = ss_alpha_mask ? 1 : 0;
|
||||
shaders_ft.set(SHADER_FT_MLAA);
|
||||
draw_quad(render_post_width[0], render_post_height[0],
|
||||
render_post_width_scale, render_post_height_scale,
|
||||
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
uniform_value[U_ALPHA_MASK] = 0;
|
||||
gl_state_active_bind_texture_2d(0, 0);
|
||||
gl_state_active_bind_texture_2d(1, 0);
|
||||
|
||||
fbo_blit(buf_texture.fbos[0], taa_buffer[2].fbos[0],
|
||||
0, 0, buf_texture.GetWidth(), buf_texture.GetHeight(),
|
||||
0, 0, taa_tex[2]->width, taa_tex[2]->height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||
gl_state_end_event();
|
||||
taa_buffer[destination].Bind();
|
||||
gl_state_active_bind_texture_2d(0, taa_tex[source]->glid);
|
||||
gl_state_active_bind_texture_2d(1, temp_buffer.GetColorTex());
|
||||
gl_state_bind_sampler(0, rctx_ptr->render_samplers[1]);
|
||||
gl_state_bind_sampler(1, rctx_ptr->render_samplers[1]);
|
||||
uniform_value[U_MLAA] = 2;
|
||||
uniform_value[U_ALPHA_MASK] = ss_alpha_mask ? 1 : 0;
|
||||
shaders_ft.set(SHADER_FT_MLAA);
|
||||
draw_quad(render_post_width[0], render_post_height[0],
|
||||
render_post_width_scale, render_post_height_scale,
|
||||
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
uniform_value[U_ALPHA_MASK] = 0;
|
||||
gl_state_active_bind_texture_2d(0, 0);
|
||||
gl_state_active_bind_texture_2d(1, 0);
|
||||
gl_state_end_event();
|
||||
}
|
||||
else {
|
||||
taa_buffer[destination].Bind();
|
||||
gl_state_active_bind_texture_2d(0, taa_tex[source]->glid);
|
||||
gl_state_bind_sampler(0, rctx_ptr->render_samplers[1]);
|
||||
uniform_value[U_REDUCE] = 0;
|
||||
shaders_ft.set(SHADER_FT_REDUCE);
|
||||
draw_quad(render_post_width[0], render_post_height[0],
|
||||
render_post_width_scale, render_post_height_scale,
|
||||
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
}
|
||||
|
||||
void Render::apply_tone_map(texture* light_proj_tex, int32_t npr_param) {
|
||||
@@ -1816,6 +1889,23 @@ namespace rndr {
|
||||
rctx_ptr->gaussian_coef_ubo.WriteMemory(gaussian_coef);
|
||||
}
|
||||
|
||||
void Render::calc_taa_blend() {
|
||||
float_t view_point_dist = vec3::distance(view_point, view_point_prev);
|
||||
float_t interest_dist = vec3::distance(interest, interest_prev);
|
||||
float_t dist = max_def(view_point_dist, interest_dist);
|
||||
|
||||
if (!reset_exposure) {
|
||||
if (dist < 0.0001f)
|
||||
taa_blend = 0.5f;
|
||||
else if (dist < 0.005f)
|
||||
taa_blend = 0.75f;
|
||||
else if (dist < 0.03f)
|
||||
taa_blend = 0.875f;
|
||||
else if (dist <= 0.05f && cam_blur)
|
||||
taa_blend = 0.999f;
|
||||
}
|
||||
}
|
||||
|
||||
void Render::copy_to_frame_texture(GLuint pre_pp_tex, int32_t wight, int32_t height, GLuint post_pp_tex) {
|
||||
for (Render::FrameTexture& i : frame_texture) {
|
||||
if (!i.capture)
|
||||
@@ -1950,12 +2040,6 @@ namespace rndr {
|
||||
gl_state_set_blend_func(GL_ONE, GL_ZERO);
|
||||
}
|
||||
|
||||
void Render::frame_texture_reset_capture() {
|
||||
for (Render::FrameTexture& i : frame_texture)
|
||||
if (&i - frame_texture)
|
||||
i.capture = false;
|
||||
}
|
||||
|
||||
void Render::generate_mlaa_area_texture() {
|
||||
uint8_t* data = force_malloc<uint8_t>(MLAA_SIDE_LEN * MLAA_SIDE_LEN * 2);
|
||||
if (!data)
|
||||
|
||||
Reference in New Issue
Block a user