mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-09-29 10:18:00 +03:00
Redid Render Texture
This commit is contained in:
+25
-26
@@ -1528,7 +1528,7 @@ void snow_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam)
|
||||
snow_particle_batch_ubo.WriteMemory(rend_data_ctx.state, snow_batch);
|
||||
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, tex->glid);
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->render.rend_texture[0].GetDepthTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->render.rend_texture[0].get_depth_texture_glid());
|
||||
rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao);
|
||||
|
||||
rend_data_ctx.shader_flags.arr[U_SNOW_PARTICLE] = 0;
|
||||
@@ -2436,16 +2436,16 @@ void EffectFogRing::draw(render_data_context& rend_data_ctx, const cam_data& cam
|
||||
|
||||
rctx->draw_state->set_fog_height(true);
|
||||
RenderTexture& rt = rctx->render_manager->get_render_texture(8);
|
||||
rt.Bind(rend_data_ctx.state);
|
||||
rt.begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.set_viewport(0, 0,
|
||||
rt.color_texture->get_width_align_mip_level(),
|
||||
rt.color_texture->get_height_align_mip_level());
|
||||
rt.get_texture()->get_width_align_mip_level(),
|
||||
rt.get_texture()->get_height_align_mip_level());
|
||||
rend_data_ctx.state.clear_color(density_offset, density_offset, density_offset, 1.0f);
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_USER))
|
||||
rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_USER, cam);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
rctx->render_manager->set_effect_texture(rt.color_texture);
|
||||
rt.end_render(rend_data_ctx.state);
|
||||
rctx->render_manager->set_effect_texture(rt.get_texture());
|
||||
gl_get_error_print();
|
||||
}
|
||||
|
||||
@@ -3226,10 +3226,10 @@ void EffectRipple::clear_tex() {
|
||||
v5 = 0.5f;
|
||||
}
|
||||
|
||||
rt->Bind(gl_state);
|
||||
rt->begin_render(gl_state);
|
||||
glClearColor(0.0f, 0.0f, 0.0f, v5);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
gl_state.bind_framebuffer(0);
|
||||
rt->end_render(gl_state);
|
||||
}
|
||||
|
||||
glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
|
||||
@@ -3244,11 +3244,10 @@ void EffectRipple::copy_to_ripple_tex(render_data_context& rend_data_ctx, Render
|
||||
if (!ripple_tex)
|
||||
return;
|
||||
|
||||
ripple_texture.SetColorDepthTextures(ripple_tex->glid);
|
||||
ripple_texture.Bind(rend_data_ctx.state);
|
||||
|
||||
image_filter_scale(rend_data_ctx, &ripple_texture, rt->color_texture);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
ripple_texture.attach_texture(ripple_tex->glid);
|
||||
ripple_texture.begin_render(rend_data_ctx.state);
|
||||
image_filter_scale(rend_data_ctx, &ripple_texture, rt->get_texture());
|
||||
ripple_texture.end_render(rend_data_ctx.state);
|
||||
}
|
||||
|
||||
void EffectRipple::ctrl() {
|
||||
@@ -3305,24 +3304,24 @@ void EffectRipple::draw(render_data_context& rend_data_ctx, const cam_data& cam)
|
||||
if (counter >= 3)
|
||||
counter = 0;
|
||||
|
||||
rt[(counter + 1) % 3]->Bind(rend_data_ctx.state);
|
||||
rt[(counter + 1) % 3]->begin_render(rend_data_ctx.state);
|
||||
|
||||
gl_rend_state_rect viewport_rect = rend_data_ctx.state.get_viewport();
|
||||
|
||||
int32_t width = rt[0]->GetWidth();
|
||||
int32_t height = rt[0]->GetHeight();
|
||||
int32_t width = rt[0]->get_width();
|
||||
int32_t height = rt[0]->get_height();
|
||||
|
||||
rend_data_ctx.state.set_viewport(1, 1, width - 2, height - 2);
|
||||
|
||||
rend_data_ctx.set_batch_scene_camera(cam);
|
||||
rend_data_ctx.state.clear(GL_DEPTH_BUFFER_BIT);
|
||||
if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_USER)) {
|
||||
rend_data_ctx.state.active_bind_texture_2d(7, rt[counter % 3]->GetColorTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(7, rt[counter % 3]->get_texture_glid());
|
||||
rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_USER, cam);
|
||||
rend_data_ctx.state.active_bind_texture_2d(7, 0);
|
||||
}
|
||||
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
rt[(counter + 1) % 3]->end_render(rend_data_ctx.state);
|
||||
|
||||
params.field_8 = 0.0005f;
|
||||
params.field_C = 0.97f;
|
||||
@@ -3345,7 +3344,7 @@ void EffectRipple::draw(render_data_context& rend_data_ctx, const cam_data& cam)
|
||||
v11 += 3;
|
||||
|
||||
rctx->render_manager->set_effect_texture(
|
||||
rctx->render_manager->get_render_texture(v11).color_texture);
|
||||
rctx->render_manager->get_render_texture(v11).get_texture());
|
||||
|
||||
update = false;
|
||||
|
||||
@@ -5806,8 +5805,8 @@ static void draw_ripple_particles(render_data_context& rend_data_ctx,
|
||||
|
||||
RenderTexture& rt = rctx_ptr->render_manager->get_render_texture(
|
||||
effect_ripple->use_float_ripplemap ? 2 : 5);
|
||||
int32_t width = rt.GetWidth();
|
||||
int32_t height = rt.GetHeight();
|
||||
int32_t width = rt.get_width();
|
||||
int32_t height = rt.get_height();
|
||||
|
||||
ripple_emit_scene_shader_data shader_data = {};
|
||||
shader_data.g_size_in_projection = {
|
||||
@@ -6776,14 +6775,14 @@ static void water_particle_free() {
|
||||
// 0x1403B6ED0
|
||||
static void ripple_propagate(render_data_context& rend_data_ctx,
|
||||
RenderTexture* dst, RenderTexture* curr, RenderTexture* prev, const EffectRipple::Params& params) {
|
||||
dst->Bind(rend_data_ctx.state);
|
||||
if (dst->color_texture->internal_format == GL_RGBA32F
|
||||
|| dst->color_texture->internal_format == GL_RGBA16F)
|
||||
dst->begin_render(rend_data_ctx.state);
|
||||
if (dst->get_texture()->internal_format == GL_RGBA32F
|
||||
|| dst->get_texture()->internal_format == GL_RGBA16F)
|
||||
rend_data_ctx.shader_flags.arr[U_RIPPLE] = 1;
|
||||
else
|
||||
rend_data_ctx.shader_flags.arr[U_RIPPLE] = 0;
|
||||
ripple_propagate_sub(rend_data_ctx, dst->color_texture, curr->color_texture, prev->color_texture, params);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
ripple_propagate_sub(rend_data_ctx, dst->get_texture(), curr->get_texture(), prev->get_texture(), params);
|
||||
dst->end_render(rend_data_ctx.state);
|
||||
}
|
||||
|
||||
// 0x1403B6F60
|
||||
|
||||
+88
-84
@@ -158,7 +158,7 @@ namespace rndr {
|
||||
if (!render_textures_data[i])
|
||||
continue;
|
||||
|
||||
render_textures[i].Bind(rend_data_ctx.state);
|
||||
render_textures[i].begin_render(rend_data_ctx.state);
|
||||
|
||||
texture* t = render_textures_data[i];
|
||||
if (render_width[0] > t->width * 2 || render_height[0] > t->height * 2)
|
||||
@@ -175,7 +175,7 @@ namespace rndr {
|
||||
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
|
||||
copy_to_frame_texture(rend_data_ctx, rend_texture[0].GetColorTex(),
|
||||
copy_to_frame_texture(rend_data_ctx, rend_texture[0].get_texture_glid(),
|
||||
render_width[0], render_height[0], taa_tex[taa_texture_selector]->glid);
|
||||
|
||||
if (taa) {
|
||||
@@ -201,13 +201,13 @@ namespace rndr {
|
||||
}
|
||||
|
||||
taa_texture = 2;
|
||||
taa_buffer[2].Bind(rend_data_ctx.state);
|
||||
taa_buffer[2].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[taa_texture_selector]->glid);
|
||||
rend_data_ctx.state.bind_sampler(0, sampler);
|
||||
|
||||
if (blur) {
|
||||
rend_data_ctx.state.active_bind_texture_2d(2, rend_texture[0].depth_texture->glid);
|
||||
rend_data_ctx.state.active_bind_texture_2d(2, rend_texture[0].get_depth_texture()->glid);
|
||||
rend_data_ctx.state.bind_sampler(2, sampler);
|
||||
|
||||
mat4 mat;
|
||||
@@ -247,7 +247,7 @@ namespace rndr {
|
||||
this->taa_texture_selector = taa_texture_selector;
|
||||
}
|
||||
|
||||
rctx->screen_buffer.Bind(rend_data_ctx.state);
|
||||
rctx->screen_buffer.begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.set_viewport(0, 0, rctx->sprite_width, rctx->sprite_height);
|
||||
if (ssaa) {
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[taa_texture]->glid);
|
||||
@@ -298,13 +298,13 @@ namespace rndr {
|
||||
rend_data_ctx.state.bind_sampler(i, 0);
|
||||
}
|
||||
|
||||
void Render::bind_render_texture(p_gl_rend_state& p_gl_rend_st, bool composite_back) {
|
||||
void Render::begin_render(p_gl_rend_state& p_gl_rend_st, bool composite_back) {
|
||||
if (composite_back) {
|
||||
composite_back_texture.Bind(p_gl_rend_st);
|
||||
composite_back_texture.begin_render(p_gl_rend_st);
|
||||
this->composite_back = 1;
|
||||
}
|
||||
else
|
||||
rend_texture[0].Bind(p_gl_rend_st);
|
||||
rend_texture[0].begin_render(p_gl_rend_st);
|
||||
p_gl_rend_st.set_viewport(0, 0, render_width[0], render_height[0]);
|
||||
}
|
||||
|
||||
@@ -599,26 +599,26 @@ namespace rndr {
|
||||
render_context* rctx = rctx_ptr;
|
||||
|
||||
if (reflect_draw)
|
||||
rctx->reflect_buffer.Bind(rend_data_ctx.state);
|
||||
rctx->reflect_buffer.begin_render(rend_data_ctx.state);
|
||||
else
|
||||
sss_contour_texture->Bind(rend_data_ctx.state);
|
||||
sss_contour_texture->begin_render(rend_data_ctx.state);
|
||||
|
||||
rend_data_ctx.state.enable_depth_test();
|
||||
rend_data_ctx.state.set_depth_func(GL_ALWAYS);
|
||||
rend_data_ctx.state.set_depth_mask(GL_TRUE);
|
||||
if (reflect_draw) {
|
||||
RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0);
|
||||
rend_data_ctx.state.set_viewport(0, 0, refl_tex.GetWidth(), refl_tex.GetHeight());
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, refl_tex.GetColorTex());
|
||||
rend_data_ctx.state.set_viewport(0, 0, refl_tex.get_width(), refl_tex.get_height());
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, refl_tex.get_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]);
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, refl_tex.GetDepthTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, refl_tex.get_depth_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[1]);
|
||||
}
|
||||
else {
|
||||
rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[0].GetColorTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[0].get_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]);
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, rend_texture[0].GetDepthTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, rend_texture[0].get_depth_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[1]);
|
||||
}
|
||||
rend_data_ctx.state.active_texture(0);
|
||||
@@ -651,7 +651,7 @@ namespace rndr {
|
||||
|
||||
if (reflect_draw) {
|
||||
RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0);
|
||||
draw_quad(rend_data_ctx, refl_tex.GetWidth(), refl_tex.GetHeight(),
|
||||
draw_quad(rend_data_ctx, refl_tex.get_width(), refl_tex.get_height(),
|
||||
1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
else
|
||||
@@ -661,6 +661,10 @@ namespace rndr {
|
||||
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
|
||||
void Render::end_render(p_gl_rend_state& p_gl_rend_st) {
|
||||
rend_texture->end_render(p_gl_rend_st);
|
||||
}
|
||||
|
||||
bool Render::frame_texture_cont_capture_set(bool value) {
|
||||
frame_texture[0].capture = value;
|
||||
return true;
|
||||
@@ -670,7 +674,7 @@ namespace rndr {
|
||||
for (Render::FrameTexture& i : frame_texture) {
|
||||
for (Render::FrameTextureData& j : i.data) {
|
||||
j.texture = 0;
|
||||
j.render_texture.Free();
|
||||
j.render_texture.destroy();
|
||||
j.type = FRAME_TEXTURE_MAX;
|
||||
}
|
||||
|
||||
@@ -684,7 +688,7 @@ namespace rndr {
|
||||
|
||||
for (Render::FrameTextureData& i : frame_texture[slot].data)
|
||||
if (!i.texture) {
|
||||
i.render_texture.SetColorDepthTextures(tex->glid);
|
||||
i.render_texture.attach_texture(tex->glid);
|
||||
i.texture = tex;
|
||||
i.type = type;
|
||||
return (int32_t)(&i - frame_texture[slot].data);
|
||||
@@ -717,7 +721,7 @@ namespace rndr {
|
||||
|
||||
for (Render::FrameTextureData& i : frame_texture[slot].data)
|
||||
if (i.texture == tex) {
|
||||
i.render_texture.Free();
|
||||
i.render_texture.destroy();
|
||||
i.texture = 0;
|
||||
i.type = FRAME_TEXTURE_MAX;
|
||||
return true;
|
||||
@@ -747,10 +751,10 @@ namespace rndr {
|
||||
return;
|
||||
|
||||
for (int32_t i = 0; i < downsample_max_count; i++)
|
||||
rend_texture[i].Free();
|
||||
rend_texture[i].destroy();
|
||||
|
||||
for (int32_t i = 0; i < 3; i++) {
|
||||
taa_buffer[i].Free();
|
||||
taa_buffer[i].destroy();
|
||||
|
||||
if (taa_tex[i]) {
|
||||
texture_release(taa_tex[i]);
|
||||
@@ -759,7 +763,7 @@ namespace rndr {
|
||||
}
|
||||
}
|
||||
|
||||
composite_back_texture.Free();
|
||||
composite_back_texture.destroy();
|
||||
|
||||
if (composite_back_tex) {
|
||||
texture_release(composite_back_tex);
|
||||
@@ -767,16 +771,16 @@ namespace rndr {
|
||||
texture_counter--;
|
||||
}
|
||||
|
||||
mlaa_buffer.Free();
|
||||
temp_buffer.Free();
|
||||
mlaa_buffer.destroy();
|
||||
temp_buffer.destroy();
|
||||
|
||||
sss_contour_texture = 0;
|
||||
|
||||
downsample_texture.Free();
|
||||
field_3E8.Free();
|
||||
downsample_texture.destroy();
|
||||
field_3E8.destroy();
|
||||
|
||||
for (int32_t i = 0; i < 5; i++)
|
||||
reduce_texture->Free();
|
||||
reduce_texture->destroy();
|
||||
|
||||
for (int32_t i = 0; i < 5; i++)
|
||||
if (reduce_tex[i]) {
|
||||
@@ -791,7 +795,7 @@ namespace rndr {
|
||||
texture_counter--;
|
||||
}
|
||||
|
||||
exposure_texture.Free();
|
||||
exposure_texture.destroy();
|
||||
|
||||
if (exposure_tex) {
|
||||
glDeleteTextures(1, &exposure_tex);
|
||||
@@ -988,12 +992,12 @@ namespace rndr {
|
||||
|
||||
update_res(true, 1);
|
||||
|
||||
rend_texture[0].Init(render_post_width[0], render_post_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24);
|
||||
rend_texture[0].create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24);
|
||||
|
||||
gl_state.bind_texture_2d(rend_texture[0].GetColorTex());
|
||||
gl_state.bind_texture_2d(rend_texture[0].get_texture_glid());
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
|
||||
gl_state.bind_texture_2d(rend_texture[0].GetDepthTex());
|
||||
gl_state.bind_texture_2d(rend_texture[0].get_depth_texture_glid());
|
||||
GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE };
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
|
||||
gl_state.bind_texture_2d(0);
|
||||
@@ -1001,39 +1005,39 @@ namespace rndr {
|
||||
for (int32_t i = 0; i < 3; i++) {
|
||||
taa_tex[i] = texture_load_tex_2d(texture_id(0x25, texture_counter++),
|
||||
GL_RGBA8, render_post_width[0], render_post_height[0], 0, 0, 0);
|
||||
taa_buffer[i].SetColorDepthTextures(taa_tex[i]->glid, 0, rend_texture[0].GetDepthTex());
|
||||
taa_buffer[i].attach_texture(taa_tex[i]->glid, 0, rend_texture[0].get_depth_texture_glid());
|
||||
}
|
||||
|
||||
composite_back_tex = texture_load_tex_2d(texture_id(0x25, texture_counter++),
|
||||
GL_RGBA8, render_post_width[0], render_post_height[0], 0, 0, 0);
|
||||
composite_back_texture.SetColorDepthTextures(composite_back_tex->glid, 0, rend_texture[0].GetDepthTex());
|
||||
composite_back_texture.attach_texture(composite_back_tex->glid, 0, rend_texture[0].get_depth_texture_glid());
|
||||
|
||||
mlaa_buffer.Init(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_DEPTH_COMPONENT24);
|
||||
temp_buffer.Init(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_ZERO);
|
||||
mlaa_buffer.create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_DEPTH_COMPONENT24);
|
||||
temp_buffer.create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_ZERO);
|
||||
sss_contour_texture = &mlaa_buffer;
|
||||
|
||||
gl_state.bind_texture_2d(mlaa_buffer.GetDepthTex());
|
||||
gl_state.bind_texture_2d(mlaa_buffer.get_depth_texture_glid());
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
|
||||
gl_state.bind_texture_2d(0);
|
||||
|
||||
for (int32_t i = 1; i < downsample_count; i++) {
|
||||
rend_texture[i].Init(render_post_width[i], render_post_height[i], 0, GL_RGBA16F, GL_ZERO);
|
||||
rend_texture[i].create_texture(render_post_width[i], render_post_height[i], 0, GL_RGBA16F, GL_ZERO);
|
||||
|
||||
gl_state.bind_texture_2d(rend_texture[i].GetColorTex());
|
||||
gl_state.bind_texture_2d(rend_texture[i].get_texture_glid());
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
gl_state.bind_texture_2d(0);
|
||||
}
|
||||
|
||||
downsample_texture.Init(reduce_width[0], reduce_height[0], 0, GL_RGBA16F, GL_ZERO);
|
||||
downsample_texture.create_texture(reduce_width[0], reduce_height[0], 0, GL_RGBA16F, GL_ZERO);
|
||||
|
||||
gl_state.bind_texture_2d(downsample_texture.GetColorTex());
|
||||
gl_state.bind_texture_2d(downsample_texture.get_texture_glid());
|
||||
const vec4 border_color = 0.0f;
|
||||
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
|
||||
gl_state.bind_texture_2d(0);
|
||||
|
||||
field_3E8.Init(512, 256, 0, GL_RGBA8, GL_ZERO);
|
||||
field_3E8.create_texture(512, 256, 0, GL_RGBA8, GL_ZERO);
|
||||
|
||||
dof = new renderer::DOF3(render_post_width[0], render_post_height[0]);
|
||||
|
||||
@@ -1042,7 +1046,7 @@ namespace rndr {
|
||||
GL_RGBA16F, render_post_width[0], render_post_height[0], 0, 0, 0);
|
||||
|
||||
transparency = new renderer::Transparency(transparency_tex[0]->glid,
|
||||
rend_texture[0].GetDepthTex(), render_post_width[0], render_post_height[0]);
|
||||
rend_texture[0].get_depth_texture_glid(), render_post_width[0], render_post_height[0]);
|
||||
}
|
||||
|
||||
void Render::init_post_process_buffers() {
|
||||
@@ -1058,7 +1062,7 @@ namespace rndr {
|
||||
}
|
||||
gl_state.bind_texture_2d(0);
|
||||
|
||||
reduce_texture[0].SetColorDepthTextures(reduce_tex[0]->glid);
|
||||
reduce_texture[0].attach_texture(reduce_tex[0]->glid);
|
||||
|
||||
exposure_history = texture_load_tex_2d(texture_id(0x25, texture_counter++),
|
||||
GL_RGBA16F, 32, 2, 0, 0, 0);
|
||||
@@ -1072,7 +1076,7 @@ namespace rndr {
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
gl_state.bind_texture_2d(0);
|
||||
|
||||
exposure_texture.SetColorDepthTextures(exposure_tex);
|
||||
exposure_texture.attach_texture(exposure_tex);
|
||||
|
||||
glGenTextures(1, &tonemap_lut_texture);
|
||||
gl_state.bind_texture_2d(tonemap_lut_texture);
|
||||
@@ -1113,7 +1117,7 @@ namespace rndr {
|
||||
return -1;
|
||||
|
||||
movie_textures_data[index] = movie_texture;
|
||||
movie_textures[index].SetColorDepthTextures(movie_texture->glid);
|
||||
movie_textures[index].attach_texture(movie_texture->glid);
|
||||
return index;
|
||||
}
|
||||
|
||||
@@ -1127,7 +1131,7 @@ namespace rndr {
|
||||
return;
|
||||
|
||||
movie_textures_data[index] = 0;
|
||||
movie_textures[index].Free();
|
||||
movie_textures[index].destroy();
|
||||
}
|
||||
|
||||
void Render::post_proc() {
|
||||
@@ -1172,7 +1176,7 @@ namespace rndr {
|
||||
extern texture* task_movie_get_texture(int32_t index = 0);
|
||||
texture* tex = task_movie_get_texture();
|
||||
if (tex) {
|
||||
movie_textures[0].Bind(rend_data_ctx.state);
|
||||
movie_textures[0].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, tex->glid);
|
||||
rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]);
|
||||
rend_data_ctx.state.set_viewport(0, 0, movie_textures_data[0]->width, movie_textures_data[0]->height);
|
||||
@@ -1180,7 +1184,7 @@ namespace rndr {
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE);
|
||||
draw_quad(rend_data_ctx, tex->width, tex->height,
|
||||
1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
movie_textures[0].end_render(rend_data_ctx.state);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1204,7 +1208,7 @@ namespace rndr {
|
||||
return -1;
|
||||
|
||||
render_textures_data[index] = render_texture;
|
||||
render_textures[index].SetColorDepthTextures(render_texture->glid);
|
||||
render_textures[index].attach_texture(render_texture->glid);
|
||||
return index;
|
||||
}
|
||||
|
||||
@@ -1221,7 +1225,7 @@ namespace rndr {
|
||||
return;
|
||||
|
||||
render_textures_data[index] = 0;
|
||||
render_textures[index].Free();
|
||||
render_textures[index].destroy();
|
||||
}
|
||||
|
||||
void Render::reset_saturate_coeff(int32_t index, bool lock) {
|
||||
@@ -1273,12 +1277,12 @@ namespace rndr {
|
||||
|
||||
update_res(true, 1);
|
||||
|
||||
rend_texture[0].Init(render_post_width[0], render_post_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24);
|
||||
rend_texture[0].create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24);
|
||||
|
||||
gl_state.bind_texture_2d(rend_texture[0].GetColorTex());
|
||||
gl_state.bind_texture_2d(rend_texture[0].get_texture_glid());
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
|
||||
gl_state.bind_texture_2d(rend_texture[0].GetDepthTex());
|
||||
gl_state.bind_texture_2d(rend_texture[0].get_depth_texture_glid());
|
||||
GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE };
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
|
||||
|
||||
@@ -1287,26 +1291,26 @@ namespace rndr {
|
||||
texture_release(taa_tex[i]);
|
||||
taa_tex[i] = texture_load_tex_2d(id, GL_RGBA8,
|
||||
render_post_width[0], render_post_height[0], 0, 0, 0);
|
||||
taa_buffer[i].SetColorDepthTextures(taa_tex[i]->glid, 0, rend_texture[0].GetDepthTex());
|
||||
taa_buffer[i].attach_texture(taa_tex[i]->glid, 0, rend_texture[0].get_depth_texture_glid());
|
||||
}
|
||||
|
||||
texture_id composite_back_tex_id = composite_back_tex->id;
|
||||
texture_release(composite_back_tex);
|
||||
composite_back_tex = texture_load_tex_2d(composite_back_tex_id, GL_RGBA8,
|
||||
render_post_width[0], render_post_height[0], 0, 0, 0);
|
||||
composite_back_texture.SetColorDepthTextures(composite_back_tex->glid, 0, rend_texture[0].GetDepthTex());
|
||||
composite_back_texture.attach_texture(composite_back_tex->glid, 0, rend_texture[0].get_depth_texture_glid());
|
||||
|
||||
mlaa_buffer.Init(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_DEPTH_COMPONENT24);
|
||||
temp_buffer.Init(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_ZERO);
|
||||
mlaa_buffer.create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_DEPTH_COMPONENT24);
|
||||
temp_buffer.create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_ZERO);
|
||||
sss_contour_texture = &mlaa_buffer;
|
||||
|
||||
gl_state.bind_texture_2d(mlaa_buffer.GetDepthTex());
|
||||
gl_state.bind_texture_2d(mlaa_buffer.get_depth_texture_glid());
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
|
||||
|
||||
for (int32_t i = 1; i < downsample_count; i++) {
|
||||
rend_texture[i].Init(render_post_width[i], render_post_height[i], 0, GL_RGBA16F, GL_ZERO);
|
||||
rend_texture[i].create_texture(render_post_width[i], render_post_height[i], 0, GL_RGBA16F, GL_ZERO);
|
||||
|
||||
gl_state.bind_texture_2d(rend_texture[i].GetColorTex());
|
||||
gl_state.bind_texture_2d(rend_texture[i].get_texture_glid());
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
}
|
||||
|
||||
@@ -1319,7 +1323,7 @@ namespace rndr {
|
||||
render_post_width[0], render_post_height[0], 0, 0, 0);
|
||||
}
|
||||
|
||||
transparency->resize(transparency_tex[0]->glid, rend_texture[0].GetDepthTex(),
|
||||
transparency->resize(transparency_tex[0]->glid, rend_texture[0].get_depth_texture_glid(),
|
||||
render_post_width[0], render_post_height[0]);
|
||||
}
|
||||
|
||||
@@ -1503,8 +1507,8 @@ namespace rndr {
|
||||
rend_data_ctx.shader_flags.arr[U_REDUCE] = 1;
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE);
|
||||
for (int32_t i = 1; i < downsample_count - 1; i++) {
|
||||
rend_texture[i].Bind(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[i - 1].GetColorTex());
|
||||
rend_texture[i].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[i - 1].get_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]);
|
||||
rend_data_ctx.state.set_viewport(0, 0, render_width[i], render_height[i]);
|
||||
draw_quad(rend_data_ctx,
|
||||
@@ -1518,15 +1522,15 @@ namespace rndr {
|
||||
|
||||
int32_t downsample = max_def(downsample_count - 2, 0);
|
||||
rend_data_ctx.state.set_viewport(0, 0, reduce_width[0], reduce_height[0]);
|
||||
reduce_texture[0].Bind(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[downsample].GetColorTex());
|
||||
reduce_texture[0].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[downsample].get_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]);
|
||||
draw_quad(rend_data_ctx,
|
||||
render_post_width[downsample], render_post_height[downsample],
|
||||
render_post_width_scale, render_post_height_scale,
|
||||
0.0f, 0.0f, 1.0f, 1.1f, 1.1f, 1.1f, 0.0f);
|
||||
|
||||
downsample_texture.Bind(rend_data_ctx.state);
|
||||
downsample_texture.begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[0]->glid);
|
||||
rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]);
|
||||
for (int32_t i = 1; i < 5; i++) {
|
||||
@@ -1558,7 +1562,7 @@ namespace rndr {
|
||||
}
|
||||
|
||||
void Render::transparency_copy(render_data_context& rend_data_ctx, RenderTexture* rt) {
|
||||
transparency->copy(rend_data_ctx, rt->GetColorTex());
|
||||
transparency->copy(rend_data_ctx, rt->get_texture_glid());
|
||||
}
|
||||
|
||||
void Render::update_res(bool set, int32_t base_downsample) {
|
||||
@@ -1638,7 +1642,7 @@ namespace rndr {
|
||||
int32_t destination, int32_t source, int32_t ss_alpha_mask) {
|
||||
rend_data_ctx.state.begin_event("PostProcess::mlaa");
|
||||
if (mlaa) {
|
||||
mlaa_buffer.Bind(rend_data_ctx.state);
|
||||
mlaa_buffer.begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[source]->glid);
|
||||
rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]);
|
||||
rend_data_ctx.shader_flags.arr[U_MLAA] = 0;
|
||||
@@ -1647,8 +1651,8 @@ namespace rndr {
|
||||
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(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, mlaa_buffer.GetColorTex());
|
||||
temp_buffer.begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, mlaa_buffer.get_texture_glid());
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, mlaa_area_texture);
|
||||
rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]);
|
||||
rend_data_ctx.state.bind_sampler(1, rctx_ptr->render_samplers[3]);
|
||||
@@ -1659,9 +1663,9 @@ namespace rndr {
|
||||
render_post_width_scale, render_post_height_scale,
|
||||
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
|
||||
taa_buffer[destination].Bind(rend_data_ctx.state);
|
||||
taa_buffer[destination].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[source]->glid);
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, temp_buffer.GetColorTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, temp_buffer.get_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]);
|
||||
rend_data_ctx.state.bind_sampler(1, rctx_ptr->render_samplers[1]);
|
||||
rend_data_ctx.shader_flags.arr[U_MLAA] = 2;
|
||||
@@ -1675,7 +1679,7 @@ namespace rndr {
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, 0);
|
||||
}
|
||||
else {
|
||||
taa_buffer[destination].Bind(rend_data_ctx.state);
|
||||
taa_buffer[destination].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[source]->glid);
|
||||
rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]);
|
||||
rend_data_ctx.shader_flags.arr[U_REDUCE] = 0;
|
||||
@@ -1726,11 +1730,11 @@ namespace rndr {
|
||||
vec2 lens_flare_pos = *(vec2*)&this->lens_flare_pos;
|
||||
|
||||
apply_tone_map(rend_data_ctx, 0, 0, render_width[0], render_height[0],
|
||||
rend_texture[0].GetColorTex(), reduce_tex_draw, composite_back_tex, litproj_tex, litproj_quality,
|
||||
rend_texture[0].get_texture_glid(), reduce_tex_draw, composite_back_tex, litproj_tex, litproj_quality,
|
||||
inner_width, inner_height, render_post_width_scale, render_post_height_scale,
|
||||
exposure, tone_trans_scale[tone_trans_index], tone_trans_offset[tone_trans_index], fade_func, fade_color,
|
||||
tone_map, gamma, lens_flare_pos, lens_shaft_scale, lens_flare_coef, lens_shaft_coef,
|
||||
sss_contour_texture->GetColorTex(), sss_contour_texture->GetDepthTex(), rend_texture[0].GetDepthTex(),
|
||||
sss_contour_texture->get_texture_glid(), sss_contour_texture->get_depth_texture_glid(), rend_texture[0].get_depth_texture_glid(),
|
||||
npr_param == 1, false, rctx->render_manager->npr_mask);
|
||||
rend_data_ctx.state.end_event();
|
||||
}
|
||||
@@ -1874,7 +1878,7 @@ namespace rndr {
|
||||
rctx->tone_map_ubo.WriteMemory(rend_data_ctx.state, shader_data);
|
||||
|
||||
rend_data_ctx.state.set_viewport(0, 0, render_width, render_height);
|
||||
taa_buffer[2].Bind(rend_data_ctx.state);
|
||||
taa_buffer[2].begin_render(rend_data_ctx.state);
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_TONEMAP);
|
||||
rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->tone_map_ubo);
|
||||
rend_data_ctx.state.bind_vertex_array(rctx->common_vao);
|
||||
@@ -1990,7 +1994,7 @@ namespace rndr {
|
||||
rctx->exposure_measure_ubo.WriteMemory(rend_data_ctx.state, exposure_measure);
|
||||
|
||||
rend_data_ctx.state.set_viewport(0, 0, 32, 1);
|
||||
downsample_texture.Bind(rend_data_ctx.state);
|
||||
downsample_texture.begin_render(rend_data_ctx.state);
|
||||
|
||||
rend_data_ctx.shader_flags.arr[U_EXPOSURE] = 1;
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_EXPOSURE);
|
||||
@@ -2011,7 +2015,7 @@ namespace rndr {
|
||||
}
|
||||
|
||||
rend_data_ctx.state.set_viewport(0, 0, 1, 1);
|
||||
exposure_texture.Bind(rend_data_ctx.state);
|
||||
exposure_texture.begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.shader_flags.arr[U_EXPOSURE] = 2;
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_EXPOSURE);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, exposure_history->glid);
|
||||
@@ -2086,7 +2090,7 @@ namespace rndr {
|
||||
continue;
|
||||
|
||||
for (auto& j : i.data) {
|
||||
if (!j.texture || j.render_texture.Bind(rend_data_ctx.state) < 0)
|
||||
if (!j.texture || j.render_texture.begin_render(rend_data_ctx.state) < 0)
|
||||
continue;
|
||||
|
||||
texture* dst_tex = j.texture;
|
||||
@@ -2098,7 +2102,7 @@ namespace rndr {
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE);
|
||||
draw_quad(rend_data_ctx, dst_tex->width, dst_tex->height,
|
||||
1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
j.render_texture.end_render(rend_data_ctx.state);
|
||||
}
|
||||
|
||||
if (&i - frame_texture)
|
||||
@@ -2199,7 +2203,7 @@ namespace rndr {
|
||||
rctx_ptr->lens_ghost_vbo.UnmapMemory(rend_data_ctx.state);
|
||||
|
||||
rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]);
|
||||
rend_texture[0].Bind(rend_data_ctx.state);
|
||||
rend_texture[0].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.enable_blend();
|
||||
rend_data_ctx.state.set_blend_func(GL_ONE, GL_ONE);
|
||||
|
||||
@@ -2241,7 +2245,7 @@ namespace rndr {
|
||||
calc_gaussian_blur(rend_data_ctx, 1.0f, 1.0f, 7, 0.8f, 1.0f);
|
||||
rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->gaussian_coef_ubo);
|
||||
|
||||
downsample_texture.Bind(rend_data_ctx.state);
|
||||
downsample_texture.begin_render(rend_data_ctx.state);
|
||||
for (int32_t i = 1; i < 4; i++) {
|
||||
rend_data_ctx.state.set_viewport(0, 0, reduce_width[i], reduce_height[i]);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[i]->glid);
|
||||
@@ -2276,8 +2280,8 @@ namespace rndr {
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE);
|
||||
|
||||
rend_data_ctx.state.set_viewport(0, 0, reduce_width[0], reduce_height[0]);
|
||||
reduce_texture[0].Bind(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, downsample_texture.GetColorTex());
|
||||
reduce_texture[0].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, downsample_texture.get_texture_glid());
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, reduce_tex[1]->glid);
|
||||
rend_data_ctx.state.active_bind_texture_2d(2, reduce_tex[2]->glid);
|
||||
rend_data_ctx.state.active_bind_texture_2d(3, reduce_tex[3]->glid);
|
||||
|
||||
+2
-1
@@ -185,13 +185,14 @@ namespace rndr {
|
||||
|
||||
void apply_post_process(render_data_context& rend_data_ctx,
|
||||
const cam_data& cam, texture* light_proj_tex, int32_t npr_param);
|
||||
void bind_render_texture(p_gl_rend_state& p_gl_rend_st, bool composite_back = false);
|
||||
void begin_render(p_gl_rend_state& p_gl_rend_st, bool composite_back = false);
|
||||
void calc_exposure_chara_data(render_data_context& rend_data_ctx, const cam_data& cam);
|
||||
void draw_lens_flare(render_data_context& rend_data_ctx, const cam_data& cam);
|
||||
void draw_quad(render_data_context& rend_data_ctx,
|
||||
int32_t width, int32_t height, float_t s0, float_t t0, float_t s1, float_t t1,
|
||||
float_t scale, float_t param_x, float_t param_y, float_t param_z, float_t param_w);
|
||||
void draw_sss_contour(render_data_context& rend_data_ctx, const cam_data& cam);
|
||||
void end_render(p_gl_rend_state& p_gl_rend_st);
|
||||
bool frame_texture_cont_capture_set(bool value);
|
||||
void frame_texture_free();
|
||||
int32_t frame_texture_load(int32_t slot, FrameTextureType type, texture* tex);
|
||||
|
||||
+16
-17
@@ -99,9 +99,9 @@ void draw_state::set_use_global_material(bool value) {
|
||||
}
|
||||
|
||||
light_proj::light_proj(int32_t width, int32_t height) : enable(), texture_id() {
|
||||
shadow_texture[0].Init(2048, 512, 0, GL_R32F, GL_DEPTH_COMPONENT32F);
|
||||
shadow_texture[1].Init(2048, 512, 0, GL_R32F, GL_ZERO);
|
||||
draw_texture.Init(width, height, 0, GL_RGBA8, GL_DEPTH_COMPONENT32F);
|
||||
shadow_texture[0].create_texture(2048, 512, 0, GL_R32F, GL_DEPTH_COMPONENT32F);
|
||||
shadow_texture[1].create_texture(2048, 512, 0, GL_R32F, GL_ZERO);
|
||||
draw_texture.create_texture(width, height, 0, GL_RGBA8, GL_DEPTH_COMPONENT32F);
|
||||
}
|
||||
|
||||
light_proj::~light_proj() {
|
||||
@@ -112,7 +112,7 @@ void light_proj::resize(int32_t width, int32_t height) {
|
||||
if (!this)
|
||||
return;
|
||||
|
||||
draw_texture.Init(width, height, 0, GL_RGBA8, GL_DEPTH_COMPONENT32F);
|
||||
draw_texture.create_texture(width, height, 0, GL_RGBA8, GL_DEPTH_COMPONENT32F);
|
||||
}
|
||||
|
||||
bool light_proj::set(render_data_context& rend_data_ctx, cam_data& cam) {
|
||||
@@ -122,7 +122,7 @@ bool light_proj::set(render_data_context& rend_data_ctx, cam_data& cam) {
|
||||
static const vec4 color_clear = 0.0f;
|
||||
static const GLfloat depth_clear = 1.0f;
|
||||
|
||||
shadow_texture[0].Bind(rend_data_ctx.state);
|
||||
shadow_texture[0].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.set_viewport(0, 0, 2048, 512);
|
||||
rend_data_ctx.state.enable_depth_test();
|
||||
rend_data_ctx.state.set_depth_mask(GL_TRUE);
|
||||
@@ -135,8 +135,8 @@ bool light_proj::set(render_data_context& rend_data_ctx, cam_data& cam) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
draw_texture.Bind(rend_data_ctx.state);
|
||||
draw_texture.SetViewport(rend_data_ctx.state);
|
||||
draw_texture.begin_render(rend_data_ctx.state);
|
||||
draw_texture.set_viewport(rend_data_ctx.state);
|
||||
rend_data_ctx.state.enable_depth_test();
|
||||
rend_data_ctx.state.set_depth_mask(GL_TRUE);
|
||||
rend_data_ctx.state.clear_buffer(GL_COLOR, 0, (float_t*)&color_clear);
|
||||
@@ -1401,11 +1401,11 @@ void render_context::disp() {
|
||||
}
|
||||
|
||||
void render_context::free() {
|
||||
shadow_buffer.Free();
|
||||
screen_overlay_buffer.Free();
|
||||
screen_buffer.Free();
|
||||
render_buffer.Free();
|
||||
reflect_buffer.Free();
|
||||
shadow_buffer.destroy();
|
||||
screen_overlay_buffer.destroy();
|
||||
screen_buffer.destroy();
|
||||
render_buffer.destroy();
|
||||
reflect_buffer.destroy();
|
||||
|
||||
texture_release(empty_texture_cube_map);
|
||||
texture_release(empty_texture_2d);
|
||||
@@ -1436,9 +1436,8 @@ void render_context::init() {
|
||||
GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 4, 4, 0, empty_texture_cube_map_array);
|
||||
|
||||
auto init_copy_buffer = [&](RenderTexture& src, RenderTexture& dst) {
|
||||
dst.Init(src.GetWidth(),
|
||||
src.GetHeight(), 0, src.color_texture->internal_format,
|
||||
src.depth_texture ? src.depth_texture->internal_format : GL_ZERO);
|
||||
dst.create_texture(src.get_width(), src.get_height(), 0, src.get_texture()->internal_format,
|
||||
src.get_depth_texture() ? src.get_depth_texture()->internal_format : GL_ZERO);
|
||||
};
|
||||
|
||||
RenderTexture& render_buffer = render.rend_texture[0];
|
||||
@@ -1448,8 +1447,8 @@ void render_context::init() {
|
||||
init_copy_buffer(render_buffer, this->render_buffer);
|
||||
init_copy_buffer(shadow_buffer, this->shadow_buffer);
|
||||
|
||||
screen_buffer.Init(sprite_width, sprite_height, 0, GL_RGBA8, 0);
|
||||
screen_overlay_buffer.Init(sprite_width, sprite_height, 0, GL_RGBA8, 0);
|
||||
screen_buffer.create_texture(sprite_width, sprite_height, 0, GL_RGBA8, 0);
|
||||
screen_overlay_buffer.create_texture(sprite_width, sprite_height, 0, GL_RGBA8, 0);
|
||||
}
|
||||
|
||||
void render_context::resize(int32_t render_width, int32_t render_height,
|
||||
|
||||
+98
-85
@@ -467,7 +467,7 @@ namespace rndr {
|
||||
rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_TRANSLUCENT, cam);
|
||||
rend_data_ctx.state.disable_blend();
|
||||
rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1;
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
rctx->litproj->draw_texture.end_render(rend_data_ctx.state);
|
||||
}
|
||||
}
|
||||
rend_data_ctx.state.end_event();
|
||||
@@ -563,8 +563,8 @@ namespace rndr {
|
||||
rend->draw_sss_contour(rend_data_ctx, reflect_cam);
|
||||
}
|
||||
else if (npr) {
|
||||
refl_tex.Bind(rend_data_ctx.state);
|
||||
refl_tex.SetViewport(rend_data_ctx.state);
|
||||
refl_tex.begin_render(rend_data_ctx.state);
|
||||
refl_tex.set_viewport(rend_data_ctx.state);
|
||||
rend_data_ctx.state.clear(GL_DEPTH_BUFFER_BIT);
|
||||
rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SSS_SKIN;
|
||||
rend_data_ctx.state.enable_depth_test();
|
||||
@@ -572,7 +572,7 @@ namespace rndr {
|
||||
rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SSS, reflect_cam);
|
||||
rend_data_ctx.state.disable_depth_test();
|
||||
rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1;
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
refl_tex.end_render(rend_data_ctx.state);
|
||||
rend_data_ctx.shader_flags.arr[U_NPR] = 1;
|
||||
rend->draw_sss_contour(rend_data_ctx, reflect_cam);
|
||||
}
|
||||
@@ -614,8 +614,8 @@ namespace rndr {
|
||||
rend->draw_sss_contour(rend_data_ctx, cam);
|
||||
}
|
||||
else if (npr) {
|
||||
rend->rend_texture[0].Bind(rend_data_ctx.state);
|
||||
rend->rend_texture[0].SetViewport(rend_data_ctx.state);
|
||||
rend->rend_texture[0].begin_render(rend_data_ctx.state);
|
||||
rend->rend_texture[0].set_viewport(rend_data_ctx.state);
|
||||
rend_data_ctx.state.clear(GL_DEPTH_BUFFER_BIT);
|
||||
rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SSS_SKIN;
|
||||
rend_data_ctx.state.enable_depth_test();
|
||||
@@ -623,7 +623,7 @@ namespace rndr {
|
||||
rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SSS, cam);
|
||||
rend_data_ctx.state.disable_depth_test();
|
||||
rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1;
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
rend->rend_texture[0].end_render(rend_data_ctx.state);
|
||||
rend_data_ctx.shader_flags.arr[U_NPR] = 1;
|
||||
rend->draw_sss_contour(rend_data_ctx, cam);
|
||||
}
|
||||
@@ -648,14 +648,14 @@ namespace rndr {
|
||||
rend_data_ctx.state.begin_event("pass_reflect");
|
||||
RenderTexture& refl_tex = get_render_texture(0);
|
||||
RenderTexture& refl_buf_tex = rctx->reflect_buffer;
|
||||
refl_tex.Bind(rend_data_ctx.state);
|
||||
if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_OPAQUE)
|
||||
|| rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSPARENT)
|
||||
|| rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSLUCENT)
|
||||
|| rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_CHARA_OPAQUE)
|
||||
|| rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_CHARA_TRANSPARENT)
|
||||
|| rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_CHARA_TRANSLUCENT)) {
|
||||
refl_tex.SetViewport(rend_data_ctx.state);
|
||||
refl_tex.begin_render(rend_data_ctx.state);
|
||||
refl_tex.set_viewport(rend_data_ctx.state);
|
||||
rend_data_ctx.set_batch_scene_camera(cam);
|
||||
|
||||
for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++)
|
||||
@@ -755,18 +755,21 @@ namespace rndr {
|
||||
for (int32_t i = reflect_blur_num, j = 0; i > 0; i--, j++) {
|
||||
apply_blur_filter_sub(rend_data_ctx, &refl_buf_tex, &refl_tex,
|
||||
reflect_blur_filter, 1.0f, 1.0f, 0.0f);
|
||||
image_filter_scale(rend_data_ctx, &refl_tex, refl_buf_tex.color_texture);
|
||||
image_filter_scale(rend_data_ctx, &refl_tex, refl_buf_tex.get_texture());
|
||||
}
|
||||
|
||||
shader::unbind(rend_data_ctx.state);
|
||||
refl_tex.end_render(rend_data_ctx.state);
|
||||
}
|
||||
else {
|
||||
refl_tex.begin_render(rend_data_ctx.state);
|
||||
vec4 clear_color;
|
||||
rend_data_ctx.state.get_clear_color(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
|
||||
rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT);
|
||||
rend_data_ctx.state.clear_color(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
|
||||
refl_tex.end_render(rend_data_ctx.state);
|
||||
}
|
||||
shader::unbind(rend_data_ctx.state);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
rend_data_ctx.state.end_event();
|
||||
}
|
||||
|
||||
@@ -774,11 +777,11 @@ namespace rndr {
|
||||
render_context* rctx = rctx_ptr;
|
||||
rend_data_ctx.state.begin_event("pass_refract");
|
||||
RenderTexture& refract_texture = get_render_texture(1);
|
||||
refract_texture.Bind(rend_data_ctx.state);
|
||||
if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_OPAQUE)
|
||||
|| rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_TRANSPARENT)
|
||||
|| rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_TRANSLUCENT)) {
|
||||
refract_texture.SetViewport(rend_data_ctx.state);
|
||||
refract_texture.begin_render(rend_data_ctx.state);
|
||||
refract_texture.set_viewport(rend_data_ctx.state);
|
||||
rend_data_ctx.set_batch_scene_camera(cam);
|
||||
|
||||
for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++)
|
||||
@@ -800,17 +803,20 @@ namespace rndr {
|
||||
rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFRACT_TRANSPARENT, cam);
|
||||
rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFRACT_TRANSLUCENT, cam);
|
||||
rend_data_ctx.state.disable_depth_test();
|
||||
|
||||
rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1;
|
||||
shader::unbind(rend_data_ctx.state);
|
||||
refract_texture.end_render(rend_data_ctx.state);
|
||||
}
|
||||
else {
|
||||
refract_texture.begin_render(rend_data_ctx.state);
|
||||
vec4 clear_color;
|
||||
rend_data_ctx.state.get_clear_color(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
|
||||
rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT);
|
||||
rend_data_ctx.state.clear_color(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
|
||||
refract_texture.end_render(rend_data_ctx.state);
|
||||
}
|
||||
shader::unbind(rend_data_ctx.state);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
rend_data_ctx.state.end_event();
|
||||
}
|
||||
|
||||
@@ -828,21 +834,20 @@ namespace rndr {
|
||||
render_context* rctx = rctx_ptr;
|
||||
rend_data_ctx.state.begin_event("pass_clear");
|
||||
if (clear) {
|
||||
rctx->screen_buffer.Bind(rend_data_ctx.state);
|
||||
rctx->screen_buffer.begin_render(rend_data_ctx.state);
|
||||
clear_color_set_gl(rend_data_ctx.state);
|
||||
//rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
rctx->screen_buffer.end_render(rend_data_ctx.state);
|
||||
}
|
||||
|
||||
rndr::Render* rend = render;
|
||||
if (!rctx->sss_data->enable || !rctx->sss_data->downsample) {
|
||||
rend->bind_render_texture(rend_data_ctx.state);
|
||||
rend->begin_render(rend_data_ctx.state);
|
||||
if (spr::getObjListCount(spr::SPR_TARGET_BACK)) {
|
||||
rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
rend_data_ctx.state.clear_depth(1.0f);
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
}
|
||||
else {
|
||||
clear_color_set_gl(rend_data_ctx.state);
|
||||
@@ -851,21 +856,21 @@ namespace rndr {
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
else
|
||||
rend_data_ctx.state.clear(GL_DEPTH_BUFFER_BIT);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
}
|
||||
rend->end_render(rend_data_ctx.state);
|
||||
}
|
||||
else {
|
||||
if (spr::getObjListCount(spr::SPR_TARGET_BACK)) {
|
||||
rend->bind_render_texture(rend_data_ctx.state);
|
||||
rend->begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
rend->end_render(rend_data_ctx.state);
|
||||
}
|
||||
else if (clear) {
|
||||
rend->bind_render_texture(rend_data_ctx.state);
|
||||
rend->begin_render(rend_data_ctx.state);
|
||||
clear_color_set_gl(rend_data_ctx.state);
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
rend->end_render(rend_data_ctx.state);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -881,7 +886,7 @@ namespace rndr {
|
||||
|
||||
rend_data_ctx.state.begin_event("pass_pre_sprite");
|
||||
rndr::Render* rend = render;
|
||||
rend->bind_render_texture(rend_data_ctx.state, true);
|
||||
rend->begin_render(rend_data_ctx.state, true);
|
||||
rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT);
|
||||
rend_data_ctx.state.set_depth_mask(GL_FALSE);
|
||||
@@ -889,21 +894,21 @@ namespace rndr {
|
||||
rend_data_ctx.state.enable_blend();
|
||||
rend_data_ctx.state.disable_cull_face();
|
||||
spr::flush(rend_data_ctx, spr::SPR_TARGET_BACK, true,
|
||||
rend->temp_buffer.color_texture,
|
||||
rend->temp_buffer.get_texture(),
|
||||
rctx->camera->view_projection_aet_3d);
|
||||
rend_data_ctx.state.enable_cull_face();
|
||||
rend_data_ctx.state.disable_blend();
|
||||
rend_data_ctx.state.enable_depth_test();
|
||||
rend_data_ctx.state.set_depth_mask(GL_TRUE);
|
||||
shader::unbind(rend_data_ctx.state);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
rend->end_render(rend_data_ctx.state);
|
||||
gl_get_error_print();
|
||||
rend_data_ctx.state.end_event();
|
||||
}
|
||||
|
||||
void RenderManager::pass_3d(render_data_context& rend_data_ctx) {
|
||||
render_context* rctx = rctx_ptr;
|
||||
render->bind_render_texture(rend_data_ctx.state);
|
||||
render->begin_render(rend_data_ctx.state);
|
||||
if (!rctx->sss_data->enable || !rctx->sss_data->downsample
|
||||
|| draw_pass_3d_get_translucent_count(rctx)) {
|
||||
rend_data_ctx.state.set_depth_mask(GL_TRUE);
|
||||
@@ -928,9 +933,11 @@ namespace rndr {
|
||||
else
|
||||
rend_data_ctx.state.active_bind_texture_2d(14, rctx->empty_texture_2d->glid);
|
||||
|
||||
RenderTexture* refl_tex = 0;
|
||||
if (pass_sw[RND_PASSID_REFLECT] && reflect) {
|
||||
RenderTexture& refl_tex = get_render_texture(0);
|
||||
rend_data_ctx.state.active_bind_texture_2d(15, refl_tex.GetColorTex());
|
||||
refl_tex = &get_render_texture(0);
|
||||
refl_tex->bind_texture(rend_data_ctx.state, 15);
|
||||
rend_data_ctx.state.active_bind_texture_2d(15, refl_tex->get_texture_glid());
|
||||
rend_data_ctx.shader_flags.arr[U_WATER_REFLECT] = 1;
|
||||
}
|
||||
else {
|
||||
@@ -1092,11 +1099,14 @@ namespace rndr {
|
||||
|
||||
rend_data_ctx.state.disable_depth_test();
|
||||
|
||||
if (refl_tex)
|
||||
refl_tex->unbind_texture(rend_data_ctx.state);
|
||||
|
||||
if (shadow)
|
||||
draw_pass_3d_shadow_reset(rend_data_ctx, rctx);
|
||||
pass_sprite_surf(rend_data_ctx);
|
||||
shader::unbind(rend_data_ctx.state);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
render->end_render(rend_data_ctx.state);
|
||||
}
|
||||
|
||||
void RenderManager::pass_show_vector(render_data_context& rend_data_ctx) {
|
||||
@@ -1118,7 +1128,7 @@ namespace rndr {
|
||||
light_set* set = &rctx->light_set[LIGHT_SET_MAIN];
|
||||
if (set->lights[LIGHT_PROJECTION].get_type() == LIGHT_SPOT
|
||||
&& texture_manager_get_texture(litproj->texture_id))
|
||||
light_proj_tex = litproj->draw_texture.color_texture;
|
||||
light_proj_tex = litproj->draw_texture.get_texture();
|
||||
}
|
||||
|
||||
render->apply_post_process(rend_data_ctx, cam, light_proj_tex, npr_param);
|
||||
@@ -1135,7 +1145,7 @@ namespace rndr {
|
||||
rend_data_ctx.state.set_viewport(0, 0, width, height);
|
||||
|
||||
if (Vulkan::use)
|
||||
rctx->screen_buffer.Bind(rend_data_ctx.state);
|
||||
rctx->screen_buffer.begin_render(rend_data_ctx.state);
|
||||
#ifdef USE_OPENGL
|
||||
else if (multisample && multisample_framebuffer) {
|
||||
rend_data_ctx.state.bind_framebuffer(multisample_framebuffer);
|
||||
@@ -1144,14 +1154,14 @@ namespace rndr {
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT);
|
||||
}
|
||||
else
|
||||
rctx->screen_buffer.Bind(rend_data_ctx.state);
|
||||
rctx->screen_buffer.begin_render(rend_data_ctx.state);
|
||||
#endif
|
||||
|
||||
rend_data_ctx.state.disable_depth_test();
|
||||
rend_data_ctx.state.enable_blend();
|
||||
rend_data_ctx.state.disable_cull_face();
|
||||
spr::flush(rend_data_ctx, spr::SPR_TARGET_FRONT, true,
|
||||
rctx->screen_overlay_buffer.color_texture,
|
||||
rctx->screen_overlay_buffer.get_texture(),
|
||||
rctx->camera->view_projection_aet_2d);
|
||||
rend_data_ctx.state.enable_cull_face();
|
||||
rend_data_ctx.state.disable_blend();
|
||||
@@ -1159,7 +1169,7 @@ namespace rndr {
|
||||
|
||||
#ifdef USE_OPENGL
|
||||
if (!Vulkan::use && multisample && multisample_framebuffer) {
|
||||
rend_data_ctx.state.bind_framebuffer(rctx->screen_buffer.fbos[0]);
|
||||
rend_data_ctx.state.bind_framebuffer(rctx->screen_buffer.get_fb());
|
||||
rend_data_ctx.state.disable_multisample();
|
||||
rend_data_ctx.state.bind_read_framebuffer(multisample_framebuffer);
|
||||
rend_data_ctx.state.blit_framebuffer(0, 0, width, height,
|
||||
@@ -1207,9 +1217,9 @@ namespace rndr {
|
||||
rctx->contour_params_ubo.WriteMemory(rend_data_ctx.state, contour_params_data);
|
||||
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_CONTOUR_NPR);
|
||||
rend_data_ctx.state.active_bind_texture_2d(14, rt->GetDepthTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(16, contour_rt->GetColorTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(17, contour_rt->GetDepthTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(14, rt->get_depth_texture_glid());
|
||||
rend_data_ctx.state.active_bind_texture_2d(16, contour_rt->get_texture_glid());
|
||||
rend_data_ctx.state.active_bind_texture_2d(17, contour_rt->get_depth_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(14, rctx->render_samplers[1]);
|
||||
rend_data_ctx.state.bind_sampler(16, rctx->render_samplers[1]);
|
||||
rend_data_ctx.state.bind_sampler(17, rctx->render_samplers[1]);
|
||||
@@ -1241,22 +1251,22 @@ namespace rndr {
|
||||
rend_data_ctx.state.enable_blend();
|
||||
rend_data_ctx.state.disable_cull_face();
|
||||
spr::flush(rend_data_ctx, spr::SPR_TARGET_FRONT_3D_SURF, true,
|
||||
rend->temp_buffer.color_texture,
|
||||
rend->temp_buffer.get_texture(),
|
||||
rctx->camera->view_projection_aet_2d);
|
||||
}
|
||||
}
|
||||
|
||||
void image_filter_scale(render_data_context& rend_data_ctx,
|
||||
RenderTexture* dst, texture* src, const vec4& scale) {
|
||||
if (!dst || !dst->color_texture->glid || !dst->color_texture || !src || !src->glid)
|
||||
if (!dst || !dst->get_texture() || !dst->get_texture()->glid || !src || !src->glid)
|
||||
return;
|
||||
|
||||
render_context* rctx = rctx_ptr;
|
||||
|
||||
rend_data_ctx.state.begin_event("`anonymous-namespace'::Impl::apply_no_filter_sub");
|
||||
|
||||
dst->Bind(rend_data_ctx.state);
|
||||
dst->SetViewport(rend_data_ctx.state);
|
||||
dst->begin_render(rend_data_ctx.state);
|
||||
dst->set_viewport(rend_data_ctx.state);
|
||||
|
||||
image_filter_scene_shader_data filter_scene = {};
|
||||
filter_scene.g_transform = { 1.0f, 1.0f, 0.0f, 0.0f };
|
||||
@@ -1285,7 +1295,7 @@ void render_manager_init_data(int32_t ssaa, int32_t hd_res, int32_t ss_alpha_mas
|
||||
|
||||
render_manager.reset();
|
||||
render_manager.npr = npr;
|
||||
render_texture_counter_reset();
|
||||
RenderTexture::init();
|
||||
|
||||
ScreenParam& screen_param = get_screen_param();
|
||||
ScreenParam& render_screen_param = get_render_screen_param();
|
||||
@@ -1319,8 +1329,8 @@ void render_manager_free_data() {
|
||||
static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad,
|
||||
render_data_context& rend_data_ctx, cam_data& cam, int32_t index, int32_t a3) {
|
||||
render_context* rctx = rctx_ptr;
|
||||
shad->curr_render_textures[0]->Bind(rend_data_ctx.state);
|
||||
texture* tex = shad->curr_render_textures[0]->color_texture;
|
||||
shad->curr_render_textures[0]->begin_render(rend_data_ctx.state);
|
||||
texture* tex = shad->curr_render_textures[0]->get_texture();
|
||||
rend_data_ctx.state.set_viewport(1, 1, tex->width - 2, tex->width - 2);
|
||||
rend_data_ctx.state.enable_depth_test();
|
||||
rend_data_ctx.state.clear_color(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
@@ -1368,26 +1378,26 @@ static void draw_pass_shadow_end_make_shadowmap(Shadow* shad,
|
||||
RenderTexture& rend_buf_tex = rctx_ptr->shadow_buffer;
|
||||
|
||||
image_filter_scale(rend_data_ctx, rend_tex,
|
||||
shad->curr_render_textures[0]->color_texture);
|
||||
shad->curr_render_textures[0]->get_texture());
|
||||
|
||||
if (shad->blur_filter_enable[index]) {
|
||||
for (int32_t i = shad->near_blur, j = 0; i > 0; i--, j++) {
|
||||
apply_blur_filter_sub(rend_data_ctx, &rend_buf_tex, rend_tex,
|
||||
shad->blur_filter, 1.0f, 1.0f, 0.0f);
|
||||
image_filter_scale(rend_data_ctx, rend_tex, rend_buf_tex.color_texture);
|
||||
image_filter_scale(rend_data_ctx, rend_tex, rend_buf_tex.get_texture());
|
||||
}
|
||||
}
|
||||
else {
|
||||
rend_buf_tex.Bind(rend_data_ctx.state);
|
||||
rend_buf_tex.begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.clear_color(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT);
|
||||
}
|
||||
rend_buf_tex.end_render(rend_data_ctx.state);
|
||||
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
if (GLAD_GL_VERSION_4_5)
|
||||
rend_data_ctx.state.generate_texture_mipmap(rend_tex->GetColorTex());
|
||||
rend_data_ctx.state.generate_texture_mipmap(rend_tex->get_texture_glid());
|
||||
else {
|
||||
rend_data_ctx.state.bind_texture_2d(rend_tex->GetColorTex());
|
||||
rend_data_ctx.state.bind_texture_2d(rend_tex->get_texture_glid());
|
||||
rend_data_ctx.state.generate_mipmap(GL_TEXTURE_2D);
|
||||
rend_data_ctx.state.bind_texture_2d(0);
|
||||
}
|
||||
@@ -1396,11 +1406,11 @@ static void draw_pass_shadow_end_make_shadowmap(Shadow* shad,
|
||||
static void apply_esm_filter(render_data_context& rend_data_ctx,
|
||||
RenderTexture* dst, RenderTexture* buf, RenderTexture* src,
|
||||
float_t sigma, float_t far_texel_offset, bool enable_lit_proj) {
|
||||
texture* dst_tex = dst->color_texture;
|
||||
texture* buf_tex = buf->color_texture;
|
||||
texture* src_tex = dst->color_texture;
|
||||
texture* dst_tex = dst->get_texture();
|
||||
texture* buf_tex = buf->get_texture();
|
||||
texture* src_tex = dst->get_texture();
|
||||
if (src)
|
||||
src_tex = src->depth_texture;
|
||||
src_tex = src->get_depth_texture();
|
||||
|
||||
if (!dst_tex || !buf_tex || !src_tex || dst_tex->width != buf_tex->width || dst_tex->height != buf_tex->height)
|
||||
return;
|
||||
@@ -1426,7 +1436,7 @@ static void apply_esm_filter(render_data_context& rend_data_ctx,
|
||||
|
||||
rend_data_ctx.state.set_viewport(0, 0, dst_tex->width, dst_tex->height);
|
||||
|
||||
buf->Bind(rend_data_ctx.state);
|
||||
buf->begin_render(rend_data_ctx.state);
|
||||
esm_filter_batch.g_params = { 1.0f / (float_t)dst_tex->width, 0.0f, far_texel_offset, far_texel_offset };
|
||||
rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch);
|
||||
|
||||
@@ -1435,7 +1445,7 @@ static void apply_esm_filter(render_data_context& rend_data_ctx,
|
||||
rend_data_ctx.state.bind_vertex_array(rctx->common_vao);
|
||||
rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
|
||||
dst->Bind(rend_data_ctx.state);
|
||||
dst->begin_render(rend_data_ctx.state);
|
||||
esm_filter_batch.g_params = { 0.0f, 1.0f / (float_t)dst_tex->height, far_texel_offset, far_texel_offset };
|
||||
rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch);
|
||||
|
||||
@@ -1449,9 +1459,9 @@ static void apply_esm_filter(render_data_context& rend_data_ctx,
|
||||
|
||||
static void apply_esm_min_filter(render_data_context& rend_data_ctx,
|
||||
RenderTexture* dst, RenderTexture* buf, RenderTexture* src) {
|
||||
texture* dst_tex = dst->color_texture;
|
||||
texture* buf_tex = buf->color_texture;
|
||||
texture* src_tex = src->color_texture;
|
||||
texture* dst_tex = dst->get_texture();
|
||||
texture* buf_tex = buf->get_texture();
|
||||
texture* src_tex = src->get_texture();
|
||||
rend_data_ctx.state.begin_event("`anonymous-namespace'::Impl::apply_esm_min_filter");
|
||||
if (!dst_tex || !dst_tex->glid || !buf_tex || !buf_tex->glid || !src_tex || !src_tex->glid) {
|
||||
rend_data_ctx.state.end_event();
|
||||
@@ -1475,7 +1485,7 @@ static void apply_esm_min_filter(render_data_context& rend_data_ctx,
|
||||
|
||||
rend_data_ctx.state.set_viewport(0, 0, dst_tex->width, dst_tex->height);
|
||||
|
||||
buf->Bind(rend_data_ctx.state);
|
||||
buf->begin_render(rend_data_ctx.state);
|
||||
esm_filter_batch.g_params = { 1.0f / (float_t)src_tex->width,
|
||||
1.0f / (float_t)src_tex->height, 0.0f, 0.0f };
|
||||
rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch);
|
||||
@@ -1489,7 +1499,7 @@ static void apply_esm_min_filter(render_data_context& rend_data_ctx,
|
||||
rend_data_ctx.state.end_event();
|
||||
|
||||
rend_data_ctx.state.begin_event("erosion");
|
||||
dst->Bind(rend_data_ctx.state);
|
||||
dst->begin_render(rend_data_ctx.state);
|
||||
esm_filter_batch.g_params = { 0.75f / (float_t)buf_tex->width,
|
||||
0.75f / (float_t)buf_tex->height, 0.0f, 0.0f };
|
||||
rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch);
|
||||
@@ -1512,15 +1522,15 @@ static bool litproj_clear(render_data_context& rend_data_ctx, light_proj* litpro
|
||||
if (!tex)
|
||||
return false;
|
||||
|
||||
litproj->draw_texture.Bind(rend_data_ctx.state);
|
||||
litproj->draw_texture.SetViewport(rend_data_ctx.state);
|
||||
litproj->draw_texture.begin_render(rend_data_ctx.state);
|
||||
litproj->draw_texture.set_viewport(rend_data_ctx.state);
|
||||
rend_data_ctx.state.enable_depth_test();
|
||||
rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
rend_data_ctx.state.clear_depth(1.0f);
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
if (!light_proj::set_mat(rend_data_ctx, cam, true)) {
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
litproj->draw_texture.end_render(rend_data_ctx.state);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1528,7 +1538,7 @@ static bool litproj_clear(render_data_context& rend_data_ctx, light_proj* litpro
|
||||
rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_LITPROJ;
|
||||
rend_data_ctx.state.active_bind_texture_2d(17, tex->glid);
|
||||
rend_data_ctx.state.bind_sampler(17, rctx->render_samplers[2]);
|
||||
rend_data_ctx.state.active_bind_texture_2d(18, litproj->shadow_texture[0].GetColorTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(18, litproj->shadow_texture[0].get_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(18, rctx->render_samplers[2]);
|
||||
rend_data_ctx.state.active_texture(0);
|
||||
return true;
|
||||
@@ -1558,8 +1568,8 @@ static void draw_pass_3d_shadow_reset(render_data_context& rend_data_ctx, render
|
||||
static void draw_pass_3d_shadow_set(render_data_context& rend_data_ctx, Shadow* shad, render_context* rctx) {
|
||||
float_t esm_param;
|
||||
if (shad->self_shadow && shad->num_shadow > 0) {
|
||||
rend_data_ctx.state.active_bind_texture_2d(19, shad->render_textures[3].GetColorTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(20, shad->render_textures[5].GetColorTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(19, shad->render_textures[3].get_texture_glid());
|
||||
rend_data_ctx.state.active_bind_texture_2d(20, shad->render_textures[5].get_texture_glid());
|
||||
rend_data_ctx.state.active_texture(0);
|
||||
esm_param = (shad->field_2D8 * shad->z_half_range * 2.0f) * 1.442695f;
|
||||
rend_data_ctx.set_self_shadow(true);
|
||||
@@ -1619,7 +1629,7 @@ static void draw_pass_3d_shadow_set(render_data_context& rend_data_ctx, Shadow*
|
||||
int32_t j = 0;
|
||||
for (int32_t i = 0; i < 2; i++)
|
||||
if (shad->shadow_enable[i]) {
|
||||
rend_data_ctx.state.active_bind_texture_2d(6 + j, shad->curr_render_textures[1 + i]->GetColorTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(6 + j, shad->curr_render_textures[1 + i]->get_texture_glid());
|
||||
j++;
|
||||
}
|
||||
|
||||
@@ -1643,7 +1653,7 @@ static void draw_pass_3d_shadow_set(render_data_context& rend_data_ctx, Shadow*
|
||||
rctx->draw_state->rend_data[rend_data_ctx.index].shadow = false;
|
||||
|
||||
for (int32_t i = 0; i < 2; i++)
|
||||
rend_data_ctx.state.active_bind_texture_2d(6 + i, shad->curr_render_textures[1 + i]->GetColorTex());
|
||||
shad->curr_render_textures[1 + i]->bind_texture(rend_data_ctx.state, 6 + i);
|
||||
rend_data_ctx.state.active_texture(0);
|
||||
|
||||
shadow_ambient = 1.0f;
|
||||
@@ -1809,13 +1819,13 @@ static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::Ren
|
||||
rend_data_ctx.state.begin_event("pass_reflect");
|
||||
RenderTexture& refl_tex = render_manager->get_render_texture(0);
|
||||
RenderTexture& refl_buf_tex = rctx->reflect_buffer;
|
||||
refl_tex.Bind(rend_data_ctx.state);
|
||||
extern bool reflect_full;
|
||||
if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_OPAQUE)
|
||||
|| rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSPARENT)
|
||||
|| rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSLUCENT_SORT_BY_RADIUS)
|
||||
|| rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSLUCENT)) {
|
||||
refl_tex.SetViewport(rend_data_ctx.state);
|
||||
refl_tex.begin_render(rend_data_ctx.state);
|
||||
refl_tex.set_viewport(rend_data_ctx.state);
|
||||
|
||||
if (!rctx->sss_data->enable || !rctx->sss_data->downsample
|
||||
|| draw_pass_3d_get_translucent_count(rctx)) {
|
||||
@@ -1947,18 +1957,21 @@ static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::Ren
|
||||
for (int32_t i = render_manager->reflect_blur_num, j = 0; i > 0; i--, j++) {
|
||||
apply_blur_filter_sub(rend_data_ctx, &refl_buf_tex, &refl_tex,
|
||||
render_manager->reflect_blur_filter, 1.0f, 1.0f, 0.0f);
|
||||
image_filter_scale(rend_data_ctx, &refl_tex, refl_buf_tex.color_texture);
|
||||
image_filter_scale(rend_data_ctx, &refl_tex, refl_buf_tex.get_texture());
|
||||
}
|
||||
|
||||
shader::unbind(rend_data_ctx.state);
|
||||
refl_tex.end_render(rend_data_ctx.state);
|
||||
}
|
||||
else {
|
||||
refl_tex.begin_render(rend_data_ctx.state);
|
||||
vec4 clear_color;
|
||||
rend_data_ctx.state.get_clear_color(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
|
||||
rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT);
|
||||
rend_data_ctx.state.clear_color(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
|
||||
refl_tex.end_render(rend_data_ctx.state);
|
||||
}
|
||||
shader::unbind(rend_data_ctx.state);
|
||||
rend_data_ctx.state.bind_framebuffer(0);
|
||||
rend_data_ctx.state.end_event();
|
||||
}
|
||||
|
||||
@@ -1971,12 +1984,12 @@ static void apply_blur_filter_sub(render_data_context& rend_data_ctx, RenderText
|
||||
|
||||
rend_data_ctx.state.begin_event("`anonymous-namespace'::Impl::apply_blur_filter_sub");
|
||||
|
||||
dst->Bind(rend_data_ctx.state);
|
||||
dst->SetViewport(rend_data_ctx.state);
|
||||
dst->begin_render(rend_data_ctx.state);
|
||||
dst->set_viewport(rend_data_ctx.state);
|
||||
|
||||
image_filter_scene_shader_data filter_scene = {};
|
||||
float_t w = res_scale.x / (float_t)src->GetWidth();
|
||||
float_t h = res_scale.y / (float_t)src->GetHeight();
|
||||
float_t w = res_scale.x / (float_t)src->get_width();
|
||||
float_t h = res_scale.y / (float_t)src->get_height();
|
||||
filter_scene.g_transform = { w, h, 0.0f, 0.0f };
|
||||
filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f };
|
||||
rctx->image_filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene);
|
||||
@@ -1995,7 +2008,7 @@ static void apply_blur_filter_sub(render_data_context& rend_data_ctx, RenderText
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_IMGFILT);
|
||||
rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->image_filter_scene_ubo);
|
||||
rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->image_filter_batch_ubo);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, src->GetColorTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, src->get_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]);
|
||||
rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, (GLint)(filter * 4LL), 4);
|
||||
rend_data_ctx.state.end_event();
|
||||
@@ -2019,7 +2032,7 @@ static void render_manager_free_render_textures() {
|
||||
#endif
|
||||
|
||||
for (RenderTexture& i : render_manager.render_textures)
|
||||
i.Free();
|
||||
i.destroy();
|
||||
}
|
||||
|
||||
static void render_manager_init_render_textures(int32_t multisample) {
|
||||
@@ -2056,9 +2069,9 @@ static void render_manager_init_render_textures(int32_t multisample) {
|
||||
continue;
|
||||
|
||||
RenderTexture& rt = render_manager.render_textures[i];
|
||||
rt.Init(tex_data->width, tex_data->height, tex_data->max_level,
|
||||
rt.create_texture(tex_data->width, tex_data->height, tex_data->max_level,
|
||||
tex_data->color_format, tex_data->depth_format);
|
||||
rt.Bind(gl_state);
|
||||
rt.begin_render(gl_state);
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
}
|
||||
|
||||
+226
-179
@@ -9,187 +9,29 @@
|
||||
#include "gl_state.hpp"
|
||||
#include "texture.hpp"
|
||||
|
||||
static uint32_t render_texture_counter;
|
||||
int32_t RenderTexture::m_tex_count;
|
||||
|
||||
static int32_t render_texture_init_framebuffer(RenderTexture* rt, int32_t max_level);
|
||||
static int32_t render_texture_set_framebuffer_texture(RenderTexture* rrt,
|
||||
GLuint color_texture, int32_t level, GLuint depth_texture, bool stencil);
|
||||
|
||||
RenderTexture::RenderTexture() : color_texture(), depth_texture(),
|
||||
binding(), max_level(), fbos(), depth_rbo(), stencil_rbo() {
|
||||
|
||||
}
|
||||
|
||||
RenderTexture::~RenderTexture() {
|
||||
Free();
|
||||
}
|
||||
|
||||
int32_t RenderTexture::Bind(gl_state_struct& gl_st, int32_t index) {
|
||||
if (index < 0 || index > max_level)
|
||||
// 0x140503310
|
||||
int32_t RenderTexture::create_fbo(int32_t level) {
|
||||
int32_t level_count = level + 1;
|
||||
m_fb = prj::MemoryManager::alloc<GLuint>(prj::MemCSystem, level_count, "FBO");
|
||||
if (!m_fb)
|
||||
return -1;
|
||||
|
||||
gl_st.bind_framebuffer(fbos[index]);
|
||||
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||||
glGenFramebuffers(level_count, m_fb);
|
||||
return gl_get_error_print() != GL_ZERO ? -1 : 0;
|
||||
}
|
||||
|
||||
// 0x1405036A0
|
||||
int32_t RenderTexture::set_render_target(GLuint color, int32_t level, GLuint depth, bool stencil) {
|
||||
if (level < 0 || level > m_level)
|
||||
return -1;
|
||||
|
||||
gl_get_error_print();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t RenderTexture::Bind(p_gl_rend_state& p_gl_rend_st, int32_t index) {
|
||||
if (index < 0 || index > max_level)
|
||||
return -1;
|
||||
|
||||
p_gl_rend_st.bind_framebuffer(fbos[index]);
|
||||
if (p_gl_rend_st.check_framebuffer_status(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||||
return -1;
|
||||
|
||||
gl_get_error_print();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void RenderTexture::Free() {
|
||||
if (depth_texture) {
|
||||
texture_release(depth_texture);
|
||||
depth_texture = 0;
|
||||
}
|
||||
|
||||
if (color_texture) {
|
||||
texture_release(color_texture);
|
||||
color_texture = 0;
|
||||
}
|
||||
|
||||
/*if (depth_rbo) {
|
||||
glDeleteRenderbuffers(1, &depth_rbo);
|
||||
depth_rbo = 0;
|
||||
}
|
||||
|
||||
if (stencil_rbo) {
|
||||
glDeleteRenderbuffers(1, &stencil_rbo);
|
||||
stencil_rbo = 0;
|
||||
}*/
|
||||
|
||||
if (fbos) {
|
||||
glDeleteFramebuffers(max_level + 1, fbos);
|
||||
prj::MemoryManager::free(prj::MemCSystem, fbos);
|
||||
fbos = 0;
|
||||
}
|
||||
max_level = 0;
|
||||
}
|
||||
|
||||
int32_t RenderTexture::Init(int32_t width, int32_t height,
|
||||
int32_t max_level, GLenum color_format, GLenum depth_format) {
|
||||
if (max_level < 0)
|
||||
return -1;
|
||||
|
||||
max_level = min_def(max_level, 15);
|
||||
if (max_level < 0)
|
||||
return 0;
|
||||
Free();
|
||||
|
||||
GLuint color_texture;
|
||||
if (color_format) {
|
||||
this->color_texture = texture_load_tex_2d(texture_id(0x23, render_texture_counter),
|
||||
color_format, width, height, max_level, 0, 0);
|
||||
if (!this->color_texture)
|
||||
return -1;
|
||||
|
||||
render_texture_counter++;
|
||||
color_texture = GetColorTex();
|
||||
if (color_format == GL_RGBA32F) {
|
||||
gl_state.bind_texture_2d(color_texture);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
gl_state.bind_texture_2d(0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
this->color_texture = 0;
|
||||
color_texture = 0;
|
||||
}
|
||||
|
||||
GLuint depth_texture;
|
||||
bool stencil;
|
||||
if (depth_format) {
|
||||
this->depth_texture = texture_load_tex_2d(texture_id(0x23, render_texture_counter),
|
||||
depth_format, width, height, 0, 0, 0);
|
||||
if (!this->depth_texture)
|
||||
return -1;
|
||||
|
||||
render_texture_counter++;
|
||||
depth_texture = this->GetDepthTex();
|
||||
stencil = depth_format == GL_DEPTH24_STENCIL8 || depth_format == GL_DEPTH32F_STENCIL8;
|
||||
}
|
||||
else {
|
||||
this->depth_texture = 0;
|
||||
depth_texture = 0;
|
||||
stencil = false;
|
||||
}
|
||||
this->max_level = max_level;
|
||||
|
||||
if (render_texture_init_framebuffer(this, max_level) >= 0)
|
||||
for (int32_t i = 0; i <= max_level; i++)
|
||||
if (render_texture_set_framebuffer_texture(this, color_texture, i, depth_texture, stencil) < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*int32_t RenderTexture::InitDepthRenderbuffer(gl_state_struct& gl_st,
|
||||
GLenum internal_format, int32_t width, int32_t height) {
|
||||
gl_st.bind_framebuffer(fbos[0]);
|
||||
glGenRenderbuffers(1, &depth_rbo);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, depth_rbo);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, internal_format, width, height);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_rbo);
|
||||
gl_st.bind_framebuffer(0);
|
||||
return -(glGetError() != GL_ZERO);
|
||||
}
|
||||
|
||||
int32_t RenderTexture::InitStencilRenderbuffer(gl_state_struct& gl_st,
|
||||
GLenum internal_format, int32_t width, int32_t height) {
|
||||
gl_st.bind_framebuffer(fbos[0]);
|
||||
glGenRenderbuffers(1, &stencil_rbo);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, stencil_rbo);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, internal_format, width, height);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencil_rbo);
|
||||
gl_st.bind_framebuffer(0);
|
||||
return -(glGetError() != GL_ZERO);
|
||||
}*/
|
||||
|
||||
int32_t RenderTexture::SetColorDepthTextures(GLuint color_texture,
|
||||
int32_t max_level, GLuint depth_texture, bool stencil) {
|
||||
int32_t error = 0;
|
||||
this->max_level = max_level;
|
||||
if (!fbos)
|
||||
error = render_texture_init_framebuffer(this, max_level);
|
||||
render_texture_set_framebuffer_texture(this, color_texture, max_level, depth_texture, stencil);
|
||||
return error;
|
||||
}
|
||||
|
||||
void RenderTexture::SetViewport(p_gl_rend_state& p_gl_rend_st) {
|
||||
p_gl_rend_st.set_viewport(0, 0, GetWidth(), GetHeight());
|
||||
}
|
||||
|
||||
void render_texture_counter_reset() {
|
||||
render_texture_counter = 0;
|
||||
}
|
||||
|
||||
static int32_t render_texture_init_framebuffer(RenderTexture* rt, int32_t max_level) {
|
||||
rt->fbos = prj::MemoryManager::alloc<GLuint>(prj::MemCSystem, max_level + 1LL, "FBO");
|
||||
glGenFramebuffers(max_level + 1, rt->fbos);
|
||||
return -(gl_get_error_print() != GL_ZERO);
|
||||
}
|
||||
|
||||
static int32_t render_texture_set_framebuffer_texture(RenderTexture* rt,
|
||||
GLuint color_texture, int32_t level, GLuint depth_texture, bool stencil) {
|
||||
if (level < 0 || level > rt->max_level)
|
||||
return -1;
|
||||
|
||||
gl_state.bind_framebuffer(rt->fbos[level]);
|
||||
gl_state.bind_framebuffer(m_fb[level]);
|
||||
gl_get_error_print();
|
||||
|
||||
if (color_texture) {
|
||||
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, color_texture, level);
|
||||
if (color) {
|
||||
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, color, level);
|
||||
gl_get_error_print();
|
||||
glDrawBuffer(GL_COLOR_ATTACHMENT0);
|
||||
glReadBuffer(GL_COLOR_ATTACHMENT0);
|
||||
@@ -204,11 +46,11 @@ static int32_t render_texture_set_framebuffer_texture(RenderTexture* rt,
|
||||
|
||||
if (!level) {
|
||||
GLenum attechment = stencil ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT;
|
||||
if (depth_texture)
|
||||
glFramebufferTexture(GL_FRAMEBUFFER, attechment, depth_texture, 0);
|
||||
/*else if (rt->depth_rbo) {
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, rt->depth_rbo);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, attechment, GL_RENDERBUFFER, rt->depth_rbo);
|
||||
if (depth)
|
||||
glFramebufferTexture(GL_FRAMEBUFFER, attechment, depth, 0);
|
||||
/*else if (m_rb_depth) {
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, m_rb_depth);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, attechment, GL_RENDERBUFFER, m_rb_depth);
|
||||
}*/
|
||||
else
|
||||
glFramebufferTexture(GL_FRAMEBUFFER, attechment, 0, 0);
|
||||
@@ -222,3 +64,208 @@ static int32_t render_texture_set_framebuffer_texture(RenderTexture* rt,
|
||||
gl_get_error_print();
|
||||
return ret;
|
||||
}
|
||||
|
||||
// 0x140503260
|
||||
/*int32_t RenderTexture::create_depth_buffer(GLenum internal_format, int32_t width, int32_t height) {
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, m_fb[0]);
|
||||
glGenRenderbuffers(1, &m_rb_depth);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, m_rb_depth);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, internal_format, width, height);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rb_depth);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
return gl_get_error_print() != GL_ZERO ? -1 : 0;
|
||||
}*/
|
||||
|
||||
// 0x140503370
|
||||
/*int32_t RenderTexture::create_stencil_buffer(GLenum internal_format, int32_t width, int32_t height) {
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, m_fb[0]);
|
||||
glGenRenderbuffers(1, &m_rb_stencil);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, m_rb_stencil);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, internal_format, width, height);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_rb_stencil);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
return gl_get_error_print() != GL_ZERO ? -1 : 0;
|
||||
}*/
|
||||
|
||||
// 0x140503680
|
||||
void RenderTexture::init() {
|
||||
m_tex_count = 0;
|
||||
}
|
||||
|
||||
// 0x1405030C0
|
||||
RenderTexture::RenderTexture() : m_txhd_color(), m_txhd_depth(),
|
||||
m_tex_unit(), m_level(), m_fb(), m_rb_depth(), m_rb_stencil() {
|
||||
|
||||
}
|
||||
|
||||
// 0x1405030F0
|
||||
RenderTexture::~RenderTexture() {
|
||||
destroy();
|
||||
}
|
||||
|
||||
// 0x140503420
|
||||
int32_t RenderTexture::create_texture(int32_t width, int32_t height, int32_t level, GLenum pixel_format, GLenum depth_format) {
|
||||
if (level < 0)
|
||||
return -1;
|
||||
|
||||
level = min_def(level, 15);
|
||||
if (level < 0)
|
||||
return 0;
|
||||
destroy();
|
||||
|
||||
GLuint color;
|
||||
if (pixel_format) {
|
||||
m_txhd_color = texture_load_tex_2d(texture_id(0x23, m_tex_count),
|
||||
pixel_format, width, height, level, 0, 0);
|
||||
if (!m_txhd_color)
|
||||
return -1;
|
||||
|
||||
m_tex_count++;
|
||||
color = get_texture_glid();
|
||||
if (pixel_format == GL_RGBA32F) {
|
||||
gl_state.bind_texture_2d(color);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
gl_state.bind_texture_2d(0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_txhd_color = 0;
|
||||
color = 0;
|
||||
}
|
||||
|
||||
GLuint depth;
|
||||
bool stencil;
|
||||
if (depth_format) {
|
||||
m_txhd_depth = texture_load_tex_2d(texture_id(0x23, m_tex_count),
|
||||
depth_format, width, height, 0, 0, 0);
|
||||
if (!m_txhd_depth)
|
||||
return -1;
|
||||
|
||||
m_tex_count++;
|
||||
depth = this->get_depth_texture_glid();
|
||||
stencil = depth_format == GL_DEPTH24_STENCIL8 || depth_format == GL_DEPTH32F_STENCIL8;
|
||||
}
|
||||
else {
|
||||
m_txhd_depth = 0;
|
||||
depth = 0;
|
||||
stencil = false;
|
||||
}
|
||||
m_level = level;
|
||||
|
||||
if (create_fbo(level) >= 0)
|
||||
for (int32_t i = 0; i <= level; i++)
|
||||
if (set_render_target(color, i, depth, stencil) < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Missing
|
||||
int32_t RenderTexture::attach_texture(texture* color_tex, int32_t level, texture* depth_tex, bool stencil) {
|
||||
m_level = level;
|
||||
|
||||
int32_t error = 0;
|
||||
if (!m_fb)
|
||||
error = create_fbo(level);
|
||||
|
||||
m_txhd_color = color_tex;
|
||||
m_txhd_depth = depth_tex;
|
||||
set_render_target(color_tex ? color_tex->glid : 0, level, depth_tex ? depth_tex->glid : 0, stencil);
|
||||
return error;
|
||||
}
|
||||
|
||||
// 0x140503130
|
||||
int32_t RenderTexture::attach_texture(GLuint color_tex, int32_t level, GLuint depth_tex, bool stencil) {
|
||||
m_level = level;
|
||||
|
||||
int32_t error = 0;
|
||||
if (!m_fb)
|
||||
error = create_fbo(level);
|
||||
|
||||
set_render_target(color_tex, level, depth_tex, stencil);
|
||||
return error;
|
||||
}
|
||||
|
||||
// 0x1405035C0
|
||||
void RenderTexture::destroy() {
|
||||
if (m_txhd_depth) {
|
||||
texture_release(m_txhd_depth);
|
||||
m_txhd_depth = 0;
|
||||
}
|
||||
|
||||
if (m_txhd_color) {
|
||||
texture_release(m_txhd_color);
|
||||
m_txhd_color = 0;
|
||||
}
|
||||
|
||||
/*if (m_rb_depth) {
|
||||
glDeleteRenderbuffers(1, &m_rb_depth);
|
||||
m_rb_depth = 0;
|
||||
}
|
||||
|
||||
if (m_rb_stencil) {
|
||||
glDeleteRenderbuffers(1, &m_rb_stencil);
|
||||
m_rb_stencil = 0;
|
||||
}*/
|
||||
|
||||
if (m_fb) {
|
||||
glDeleteFramebuffers(m_level + 1, m_fb);
|
||||
prj::MemoryManager::free(prj::MemCSystem, m_fb);
|
||||
m_fb = 0;
|
||||
}
|
||||
m_level = 0;
|
||||
}
|
||||
|
||||
// 0x1405031A0
|
||||
int32_t RenderTexture::begin_render(gl_state_struct& gl_st, int32_t level) {
|
||||
if (level < 0 || level > m_level)
|
||||
return -1;
|
||||
|
||||
gl_st.bind_framebuffer(m_fb[level]);
|
||||
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||||
return -1;
|
||||
|
||||
gl_get_error_print();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 0x1405031A0
|
||||
int32_t RenderTexture::begin_render(p_gl_rend_state& p_gl_rend_st, int32_t level) {
|
||||
if (level < 0 || level > m_level)
|
||||
return -1;
|
||||
|
||||
p_gl_rend_st.bind_framebuffer(m_fb[level]);
|
||||
if (p_gl_rend_st.check_framebuffer_status(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||||
return -1;
|
||||
|
||||
gl_get_error_print();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 0x140503660
|
||||
void RenderTexture::end_render(gl_state_struct& gl_st) {
|
||||
gl_st.bind_framebuffer(0);
|
||||
gl_get_error_print();
|
||||
}
|
||||
|
||||
// 0x140503660
|
||||
void RenderTexture::end_render(p_gl_rend_state& p_gl_rend_st) {
|
||||
p_gl_rend_st.bind_framebuffer(0);
|
||||
gl_get_error_print();
|
||||
}
|
||||
|
||||
// 0x140503200
|
||||
void RenderTexture::bind_texture(p_gl_rend_state& p_gl_rend_st, uint32_t tex_unit) {
|
||||
m_tex_unit = tex_unit;
|
||||
p_gl_rend_st.active_bind_texture_2d(tex_unit, m_txhd_color->glid);
|
||||
}
|
||||
|
||||
// 0x1405037F0
|
||||
void RenderTexture::unbind_texture(p_gl_rend_state& p_gl_rend_st) {
|
||||
p_gl_rend_st.bind_texture_2d(m_tex_unit);
|
||||
}
|
||||
|
||||
// Added
|
||||
void RenderTexture::set_viewport(p_gl_rend_state& p_gl_rend_st) {
|
||||
p_gl_rend_st.set_viewport(0, 0, get_width(), get_height());
|
||||
}
|
||||
|
||||
+65
-31
@@ -8,44 +8,78 @@
|
||||
#include "shared.hpp"
|
||||
#include "texture.hpp"
|
||||
|
||||
struct RenderTexture {
|
||||
texture* color_texture;
|
||||
texture* depth_texture;
|
||||
int32_t binding;
|
||||
int32_t max_level;
|
||||
GLuint* fbos;
|
||||
GLuint depth_rbo;
|
||||
GLuint stencil_rbo;
|
||||
class RenderTexture {
|
||||
private:
|
||||
static int32_t m_tex_count;
|
||||
|
||||
public:
|
||||
texture* m_txhd_color;
|
||||
texture* m_txhd_depth;
|
||||
int32_t m_tex_unit;
|
||||
int32_t m_level;
|
||||
GLuint* m_fb;
|
||||
GLuint m_rb_depth;
|
||||
GLuint m_rb_stencil;
|
||||
|
||||
private:
|
||||
int32_t create_fbo(int32_t level);
|
||||
int32_t set_render_target(GLuint color, int32_t level, GLuint depth, bool stencil);
|
||||
//int32_t create_depth_buffer(GLenum internal_format, int32_t width, int32_t height);
|
||||
//int32_t create_stencil_buffer(GLenum internal_format, int32_t width, int32_t height);
|
||||
|
||||
public:
|
||||
static void init();
|
||||
|
||||
RenderTexture();
|
||||
virtual ~RenderTexture();
|
||||
|
||||
int32_t Bind(struct gl_state_struct& gl_st, int32_t index = 0);
|
||||
int32_t Bind(struct p_gl_rend_state& p_gl_rend_st, int32_t index = 0);
|
||||
void Free();
|
||||
int32_t Init(int32_t width, int32_t height,
|
||||
int32_t max_level, GLenum color_format, GLenum depth_format);
|
||||
/*int32_t InitDepthRenderbuffer(gl_state_struct& gl_st, GLenum internal_format, int32_t width, int32_t height);
|
||||
int32_t InitStencilRenderbuffer(gl_state_struct& gl_st, GLenum internal_format, int32_t width, int32_t height);*/
|
||||
int32_t SetColorDepthTextures(GLuint color_texture,
|
||||
int32_t max_level = 0, GLuint depth_texture = 0, bool stencil = false);
|
||||
void SetViewport(struct p_gl_rend_state& p_gl_rend_st);
|
||||
int32_t create_texture(int32_t width, int32_t height, int32_t level, GLenum pixel_format, GLenum depth_format);
|
||||
int32_t attach_texture(texture* color_tex, int32_t level = 0, texture* depth_tex = 0, bool stencil = false);
|
||||
int32_t attach_texture(GLuint color_tex, int32_t level = 0, GLuint depth_tex = 0, bool stencil = false);
|
||||
void destroy();
|
||||
int32_t begin_render(struct gl_state_struct& gl_st, int32_t level = 0);
|
||||
int32_t begin_render(struct p_gl_rend_state& p_gl_rend_st, int32_t level = 0);
|
||||
void end_render(struct gl_state_struct& gl_st);
|
||||
void end_render(struct p_gl_rend_state& p_gl_rend_st);
|
||||
texture* get_texture();
|
||||
void bind_texture(struct p_gl_rend_state& p_gl_rend_st, uint32_t tex_unit);
|
||||
void unbind_texture(struct p_gl_rend_state& p_gl_rend_st);
|
||||
texture* get_depth_texture();
|
||||
|
||||
inline GLuint GetColorTex() {
|
||||
return color_texture->glid;
|
||||
};
|
||||
void set_viewport(struct p_gl_rend_state& p_gl_rend_st); // Added
|
||||
|
||||
inline GLuint GetDepthTex() {
|
||||
return depth_texture->glid;
|
||||
};
|
||||
// Added
|
||||
inline GLuint get_fb(int32_t level = 0) {
|
||||
return m_fb[level];
|
||||
}
|
||||
|
||||
inline int32_t GetHeight() {
|
||||
return color_texture->height;
|
||||
};
|
||||
// Added
|
||||
inline GLuint get_texture_glid() {
|
||||
return m_txhd_color->glid;
|
||||
}
|
||||
|
||||
inline int32_t GetWidth() {
|
||||
return color_texture->width;
|
||||
};
|
||||
// Added
|
||||
inline GLuint get_depth_texture_glid() {
|
||||
return m_txhd_depth->glid;
|
||||
}
|
||||
|
||||
// Added
|
||||
inline int32_t get_width() {
|
||||
return m_txhd_color->width;
|
||||
}
|
||||
|
||||
// Added
|
||||
inline int32_t get_height() {
|
||||
return m_txhd_color->height;
|
||||
}
|
||||
};
|
||||
|
||||
extern void render_texture_counter_reset();
|
||||
// Inlined
|
||||
inline texture* RenderTexture::get_texture() {
|
||||
return m_txhd_color;
|
||||
}
|
||||
|
||||
// Inlined
|
||||
inline texture* RenderTexture::get_depth_texture() {
|
||||
return m_txhd_depth;
|
||||
}
|
||||
|
||||
@@ -97,13 +97,13 @@ namespace renderer {
|
||||
}
|
||||
|
||||
focus = max_def(focus, (float_t)cam->min_distance);
|
||||
apply_physical(rend_data_ctx, rt, buf_rt, rt->GetColorTex(), rt->GetDepthTex(),
|
||||
apply_physical(rend_data_ctx, rt, buf_rt, rt->get_texture_glid(), rt->get_depth_texture_glid(),
|
||||
cam->min_distance, cam->max_distance, focus,
|
||||
dof_debug_data.focal_length, cam->fov * DEG_TO_RAD_FLOAT, dof_debug_data.f_number);
|
||||
}
|
||||
else {
|
||||
float_t fuzzing_range = max_def(dof_debug_data.f2.fuzzing_range, 0.01f);
|
||||
apply_f2(rend_data_ctx, rt, buf_rt, rt->GetColorTex(), rt->GetDepthTex(),
|
||||
apply_f2(rend_data_ctx, rt, buf_rt, rt->get_texture_glid(), rt->get_depth_texture_glid(),
|
||||
cam->min_distance, cam->max_distance, cam->fov * DEG_TO_RAD_FLOAT,
|
||||
dof_debug_data.f2.focus, dof_debug_data.f2.focus_range,
|
||||
fuzzing_range, dof_debug_data.f2.ratio);
|
||||
@@ -113,7 +113,7 @@ namespace renderer {
|
||||
}
|
||||
else if (dof_pv_data.enable && dof_pv_data.f2.ratio > 0.0f) {
|
||||
float_t fuzzing_range = max_def(dof_pv_data.f2.fuzzing_range, 0.01f);
|
||||
apply_f2(rend_data_ctx, rt, buf_rt, rt->GetColorTex(), rt->GetDepthTex(),
|
||||
apply_f2(rend_data_ctx, rt, buf_rt, rt->get_texture_glid(), rt->get_depth_texture_glid(),
|
||||
cam->min_distance, cam->max_distance, cam->fov * DEG_TO_RAD_FLOAT,
|
||||
dof_pv_data.f2.focus, dof_pv_data.f2.focus_range,
|
||||
fuzzing_range, dof_pv_data.f2.ratio);
|
||||
@@ -303,7 +303,7 @@ namespace renderer {
|
||||
RenderTexture* rt, RenderTexture* buf_rt,
|
||||
GLuint color_texture, GLuint depth_texture, bool f2) {
|
||||
rend_data_ctx.state.begin_event("renderer::DOF3::upsample");
|
||||
buf_rt->Bind(rend_data_ctx.state);
|
||||
buf_rt->begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.set_viewport(0, 0, width, height);
|
||||
rend_data_ctx.shader_flags.arr[U_DOF_STAGE] = 4;
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_DOF);
|
||||
@@ -322,10 +322,10 @@ namespace renderer {
|
||||
|
||||
if (GLAD_GL_VERSION_4_3)
|
||||
rend_data_ctx.state.copy_image_sub_data(
|
||||
buf_rt->GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0,
|
||||
rt->GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1);
|
||||
buf_rt->get_texture_glid(), GL_TEXTURE_2D, 0, 0, 0, 0,
|
||||
rt->get_texture_glid(), GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1);
|
||||
else
|
||||
fbo_blit(rend_data_ctx.state, buf_rt->fbos[0], rt->fbos[0],
|
||||
fbo_blit(rend_data_ctx.state, buf_rt->get_fb(), rt->get_fb(),
|
||||
0, 0, width, height,
|
||||
0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||
rend_data_ctx.state.end_event();
|
||||
|
||||
@@ -46,24 +46,24 @@ namespace renderer {
|
||||
|
||||
rend_data_ctx.state.disable_blend();
|
||||
rend_data_ctx.state.disable_depth_test();
|
||||
rctx_ptr->render_buffer.Bind(rend_data_ctx.state);
|
||||
rctx_ptr->render_buffer.begin_render(rend_data_ctx.state);
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_TRANSPARENCY);
|
||||
rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->transparency_batch_ubo);
|
||||
rend_data_ctx.state.active_bind_texture_2d(0, fbo.textures[0]);
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, rt->GetColorTex());
|
||||
rend_data_ctx.state.active_bind_texture_2d(1, rt->get_texture_glid());
|
||||
rend_data_ctx.state.bind_vertex_array(vao);
|
||||
rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
rend_data_ctx.state.enable_depth_test();
|
||||
|
||||
if (GLAD_GL_VERSION_4_3)
|
||||
rend_data_ctx.state.copy_image_sub_data(
|
||||
rctx_ptr->render_buffer.GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0,
|
||||
rt->GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, fbo.width, fbo.height, 1);
|
||||
rctx_ptr->render_buffer.get_texture_glid(), GL_TEXTURE_2D, 0, 0, 0, 0,
|
||||
rt->get_texture_glid(), GL_TEXTURE_2D, 0, 0, 0, 0, fbo.width, fbo.height, 1);
|
||||
else
|
||||
fbo_blit(rend_data_ctx.state, rctx_ptr->render_buffer.fbos[0], rt->fbos[0],
|
||||
fbo_blit(rend_data_ctx.state, rctx_ptr->render_buffer.get_fb(), rt->get_fb(),
|
||||
0, 0, fbo.width, fbo.height,
|
||||
0, 0, fbo.width, fbo.height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||
rt->Bind(rend_data_ctx.state);
|
||||
rt->begin_render(rend_data_ctx.state);
|
||||
}
|
||||
|
||||
void Transparency::copy(render_data_context& rend_data_ctx, GLuint texture) {
|
||||
|
||||
+5
-5
@@ -58,7 +58,7 @@ void Shadow::calc_proj_view_mat(cam_data& cam, const vec3& view_point,
|
||||
void Shadow::clear_textures(p_gl_rend_state& p_gl_rend_st) {
|
||||
for (int32_t i = 1; i < 3; i++)
|
||||
for (int32_t j = 0; j < 4; j++) {
|
||||
curr_render_textures[i]->Bind(p_gl_rend_st, j);
|
||||
curr_render_textures[i]->begin_render(p_gl_rend_st, j);
|
||||
p_gl_rend_st.clear_color(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
p_gl_rend_st.clear(GL_COLOR_BUFFER_BIT);
|
||||
}
|
||||
@@ -93,7 +93,7 @@ void Shadow::ctrl() {
|
||||
|
||||
void Shadow::free() {
|
||||
for (RenderTexture& i : render_textures)
|
||||
i.Free();
|
||||
i.destroy();
|
||||
|
||||
reset();
|
||||
}
|
||||
@@ -121,12 +121,12 @@ int32_t Shadow::init() {
|
||||
|
||||
shadow_texture_init_params* init_param = init_params;
|
||||
for (int32_t i = 0; i < 7; i++, init_param++)
|
||||
if (render_textures[i].Init(init_param->width, init_param->height,
|
||||
if (render_textures[i].create_texture(init_param->width, init_param->height,
|
||||
init_param->max_level, init_param->color_format, init_param->depth_format) < 0)
|
||||
return -1;
|
||||
|
||||
for (int32_t i = 0; i < 3; i++) {
|
||||
gl_state.bind_texture_2d(render_textures[i].GetColorTex());
|
||||
gl_state.bind_texture_2d(render_textures[i].get_texture_glid());
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
|
||||
@@ -134,7 +134,7 @@ int32_t Shadow::init() {
|
||||
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color);
|
||||
}
|
||||
|
||||
gl_state.bind_texture_2d(render_textures[0].GetDepthTex());
|
||||
gl_state.bind_texture_2d(render_textures[0].get_depth_texture_glid());
|
||||
GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE };
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
|
||||
gl_state.bind_texture_2d(0);
|
||||
|
||||
+21
-21
@@ -45,7 +45,7 @@ void sss_data::apply_filter(struct render_data_context& rend_data_ctx) {
|
||||
|
||||
rend_data_ctx.state.active_texture(0);
|
||||
if (downsample) {
|
||||
textures[0].Bind(rend_data_ctx.state);
|
||||
textures[0].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.set_viewport(0, 0, 640, 360);
|
||||
rndr::Render* rend = &rctx->render;
|
||||
rend_data_ctx.shader_flags.arr[U_REDUCE] = 0;
|
||||
@@ -53,19 +53,19 @@ void sss_data::apply_filter(struct render_data_context& rend_data_ctx) {
|
||||
RenderTexture& rt = reflect_draw
|
||||
? rctx->render_manager->get_render_texture(0)
|
||||
: rend->rend_texture[0];
|
||||
rend_data_ctx.state.bind_texture_2d(rt.GetColorTex());
|
||||
rend_data_ctx.state.bind_texture_2d(rt.get_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]);
|
||||
sss_draw_quad(rend_data_ctx, rt.GetWidth(), rt.GetHeight(),
|
||||
sss_draw_quad(rend_data_ctx, rt.get_width(), rt.get_height(),
|
||||
1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f);
|
||||
}
|
||||
|
||||
textures[2].Bind(rend_data_ctx.state);
|
||||
textures[2].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.set_viewport(0, 0, 320, 180);
|
||||
rend_data_ctx.shader_flags.arr[U_SSS_FILTER] = 0;
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SSS_FILT);
|
||||
rend_data_ctx.state.bind_texture_2d(textures[0].GetColorTex());
|
||||
rend_data_ctx.state.bind_texture_2d(textures[0].get_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]);
|
||||
sss_draw_quad(rend_data_ctx, textures[0].GetWidth(), textures[0].GetHeight(),
|
||||
sss_draw_quad(rend_data_ctx, textures[0].get_width(), textures[0].get_height(),
|
||||
1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f);
|
||||
|
||||
sss_filter_gaussian_coef_shader_data shader_data = {};
|
||||
@@ -79,14 +79,14 @@ void sss_data::apply_filter(struct render_data_context& rend_data_ctx) {
|
||||
3, weights, r_radius, g_radius, b_radius, shader_data.g_coef);
|
||||
|
||||
rctx->sss_filter_gaussian_coef_ubo.WriteMemory(rend_data_ctx.state, shader_data);
|
||||
textures[reflect_draw ? 3 : 1].Bind(rend_data_ctx.state);
|
||||
textures[reflect_draw ? 3 : 1].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.set_viewport(0, 0, 320, 180);
|
||||
rend_data_ctx.shader_flags.arr[U_SSS_FILTER] = 3;
|
||||
shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SSS_FILT);
|
||||
rend_data_ctx.state.bind_texture_2d(textures[2].GetColorTex());
|
||||
rend_data_ctx.state.bind_texture_2d(textures[2].get_texture_glid());
|
||||
rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]);
|
||||
rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->sss_filter_gaussian_coef_ubo);
|
||||
sss_draw_quad(rend_data_ctx, textures[2].GetWidth(), textures[2].GetHeight(),
|
||||
sss_draw_quad(rend_data_ctx, textures[2].get_width(), textures[2].get_height(),
|
||||
1.0f, 1.0f, 1.0f, 0.96f, 1.0f, 0.0f);
|
||||
rend_data_ctx.state.bind_texture_2d(0);
|
||||
}
|
||||
@@ -95,7 +95,7 @@ void sss_data::apply_filter(struct render_data_context& rend_data_ctx) {
|
||||
void sss_data::free() {
|
||||
if (init_data)
|
||||
for (RenderTexture& i : textures)
|
||||
i.Free();
|
||||
i.destroy();
|
||||
}
|
||||
|
||||
// 0x140641890
|
||||
@@ -103,10 +103,10 @@ void sss_data::init() {
|
||||
if (init_data)
|
||||
return;
|
||||
|
||||
textures[0].Init(640, 360, 0, GL_RGBA16F, GL_ZERO /*GL_DEPTH_COMPONENT32F*/);
|
||||
textures[1].Init(320, 180, 0, GL_RGBA16F, GL_ZERO);
|
||||
textures[2].Init(320, 180, 0, GL_RGBA16F, GL_ZERO);
|
||||
textures[3].Init(320, 180, 0, GL_RGBA16F, GL_ZERO);
|
||||
textures[0].create_texture(640, 360, 0, GL_RGBA16F, GL_ZERO /*GL_DEPTH_COMPONENT32F*/);
|
||||
textures[1].create_texture(320, 180, 0, GL_RGBA16F, GL_ZERO);
|
||||
textures[2].create_texture(320, 180, 0, GL_RGBA16F, GL_ZERO);
|
||||
textures[3].create_texture(320, 180, 0, GL_RGBA16F, GL_ZERO);
|
||||
|
||||
param = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||
init_data = true;
|
||||
@@ -191,11 +191,11 @@ bool sss_data::set(struct render_data_context& rend_data_ctx) {
|
||||
downsample = true; // Added
|
||||
|
||||
if (downsample) {
|
||||
rend->rend_texture[0].Bind(rend_data_ctx.state);
|
||||
rend->rend_texture[0].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.set_viewport(0, 0, (int32_t)render_width, (int32_t)render_height);
|
||||
}
|
||||
else {
|
||||
textures[0].Bind(rend_data_ctx.state);
|
||||
textures[0].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.set_viewport(0, 0, 640, 360);
|
||||
}
|
||||
|
||||
@@ -213,19 +213,19 @@ bool sss_data::set(struct render_data_context& rend_data_ctx, RenderTexture& rt)
|
||||
return false;
|
||||
}
|
||||
|
||||
float_t render_width = (float_t)rt.GetWidth();
|
||||
float_t render_height = (float_t)rt.GetHeight();
|
||||
float_t render_width = (float_t)rt.get_width();
|
||||
float_t render_height = (float_t)rt.get_height();
|
||||
|
||||
if (render_width > 1280.0f)
|
||||
downsample = false;
|
||||
downsample = true; // Added
|
||||
|
||||
if (downsample) {
|
||||
rt.Bind(rend_data_ctx.state);
|
||||
rt.begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.set_viewport(0, 0, (int32_t)render_width, (int32_t)render_height);
|
||||
}
|
||||
else {
|
||||
textures[0].Bind(rend_data_ctx.state);
|
||||
textures[0].begin_render(rend_data_ctx.state);
|
||||
rend_data_ctx.state.set_viewport(0, 0, 640, 360);
|
||||
}
|
||||
|
||||
@@ -236,7 +236,7 @@ bool sss_data::set(struct render_data_context& rend_data_ctx, RenderTexture& rt)
|
||||
|
||||
// 0x140641190
|
||||
void sss_data::set_texture(p_gl_rend_state& p_gl_rend_st, int32_t texture_index) {
|
||||
p_gl_rend_st.active_bind_texture_2d(16, textures[texture_index].GetColorTex());
|
||||
p_gl_rend_st.active_bind_texture_2d(16, textures[texture_index].get_texture_glid());
|
||||
p_gl_rend_st.active_texture(0);
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -1267,7 +1267,7 @@ static void render_context_disp(render_context* rctx) {
|
||||
#endif
|
||||
|
||||
post_rend_data_ctx.state.bind_framebuffer(0);
|
||||
post_rend_data_ctx.state.active_bind_texture_2d(0, rctx->screen_buffer.GetColorTex());
|
||||
post_rend_data_ctx.state.active_bind_texture_2d(0, rctx->screen_buffer.get_texture_glid());
|
||||
post_rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0;
|
||||
post_rend_data_ctx.shader_flags.arr[U_REDUCE] = 0;
|
||||
shaders_ft.set(post_rend_data_ctx.state, post_rend_data_ctx.shader_flags, SHADER_FT_REDUCE);
|
||||
@@ -1277,11 +1277,11 @@ static void render_context_disp(render_context* rctx) {
|
||||
#ifdef USE_OPENGL
|
||||
else {
|
||||
#if BAKE_PNG || BAKE_VIDEO
|
||||
fbo_blit(post_rend_data_ctx.state, rctx->screen_buffer.fbos[0], 0,
|
||||
fbo_blit(post_rend_data_ctx.state, rctx->screen_buffer.get_fb(), 0,
|
||||
0, 0, rctx->sprite_width, rctx->sprite_height,
|
||||
0, 0, rctx->screen_width, rctx->screen_height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||
#else
|
||||
fbo_blit(post_rend_data_ctx.state, rctx->screen_buffer.fbos[0], 0,
|
||||
fbo_blit(post_rend_data_ctx.state, rctx->screen_buffer.get_fb(), 0,
|
||||
0, 0, rctx->sprite_width, rctx->sprite_height,
|
||||
rctx->screen_x_offset, rctx->screen_y_offset,
|
||||
rctx->sprite_width, rctx->sprite_height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||
|
||||
Reference in New Issue
Block a user