Redid Render Texture

This commit is contained in:
korenkonder
2026-05-17 16:31:35 +03:00
parent b58700fc52
commit f659bf1fb3
12 changed files with 562 additions and 465 deletions
+25 -26
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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;
}
+7 -7
View File
@@ -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();
+6 -6
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);