diff --git a/res/ft_shaders.farc b/res/ft_shaders.farc index c046b4e..95e4fc9 100644 Binary files a/res/ft_shaders.farc and b/res/ft_shaders.farc differ diff --git a/src/DivaGL/DivaGL.vcxproj b/src/DivaGL/DivaGL.vcxproj index 5a33078..1864e27 100644 --- a/src/DivaGL/DivaGL.vcxproj +++ b/src/DivaGL/DivaGL.vcxproj @@ -171,7 +171,6 @@ del "$(SolutionDir)bin\$(TargetName).lib" - @@ -229,7 +228,6 @@ del "$(SolutionDir)bin\$(TargetName).lib" - diff --git a/src/DivaGL/effect.cpp b/src/DivaGL/effect.cpp index ce2cfb4..52be7a8 100644 --- a/src/DivaGL/effect.cpp +++ b/src/DivaGL/effect.cpp @@ -894,11 +894,22 @@ HOOK(void, FASTCALL, leaf_particle_init, 0x000000014034C530, bool change_stage) for (; i < leaf_ptcl_count; i++, data++) data->type = 0; - if (!leaf_ptcl_vao) - glGenVertexArrays(1, &leaf_ptcl_vao); + size_t ebo_count = leaf_ptcl_vtx_count / 4 * 6; + uint32_t* ebo_data = force_malloc(ebo_count); + for (size_t i = 0, j = 0; i < ebo_count; i += 6, j += 4) { + ebo_data[i + 0] = (uint32_t)(j + 0); + ebo_data[i + 1] = (uint32_t)(j + 1); + ebo_data[i + 2] = (uint32_t)(j + 2); + ebo_data[i + 3] = (uint32_t)(j + 0); + ebo_data[i + 4] = (uint32_t)(j + 2); + ebo_data[i + 5] = (uint32_t)(j + 3); + } static const GLsizei buffer_size = sizeof(leaf_particle_vertex_data); + if (!leaf_ptcl_vao) + glGenVertexArrays(1, &leaf_ptcl_vao); + leaf_ptcl_vbo.Create(buffer_size * leaf_ptcl_vtx_count); leaf_ptcl_vbo.Bind(); @@ -913,24 +924,13 @@ HOOK(void, FASTCALL, leaf_particle_init, 0x000000014034C530, bool change_stage) glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, buffer_size, (void*)offsetof(leaf_particle_vertex_data, normal)); - size_t ebo_count = leaf_ptcl_vtx_count / 4 * 6; - uint32_t* ebo_data = force_malloc(ebo_count); - for (size_t i = 0, j = 0; i < ebo_count; i += 6, j += 4) { - ebo_data[i + 0] = (uint32_t)(j + 0); - ebo_data[i + 1] = (uint32_t)(j + 1); - ebo_data[i + 2] = (uint32_t)(j + 2); - ebo_data[i + 3] = (uint32_t)(j + 0); - ebo_data[i + 4] = (uint32_t)(j + 2); - ebo_data[i + 5] = (uint32_t)(j + 3); - } - leaf_ptcl_ebo.Create(sizeof(uint32_t) * ebo_count, ebo_data); leaf_ptcl_ebo.Bind(); - free_def(ebo_data); gl_state_bind_vertex_array(0); gl_state_bind_array_buffer(0); gl_state_bind_element_array_buffer(0); + free_def(ebo_data); leaf_particle_scene_ubo.Create(sizeof(leaf_particle_scene_shader_data)); } @@ -1029,11 +1029,11 @@ HOOK(void, FASTCALL, particle_init, 0x0000000140351C50, vec3* offset) { else particle_wind = 0.0f; + static const GLsizei buffer_size = sizeof(particle_vertex_data); + if (!ptcl_vao) glGenVertexArrays(1, &ptcl_vao); - static const GLsizei buffer_size = sizeof(particle_vertex_data); - ptcl_vbo.Create(buffer_size * ptcl_vtx_count); ptcl_vbo.Bind(); @@ -1406,7 +1406,7 @@ void EffectFogRing::draw() { draw_state.set_fog_height(true); RenderTexture& rt = render_manager->get_render_texture(8); rt.Bind(); - glViewportDLL(0, 0, + gl_state_set_viewport(0, 0, rt.color_texture->get_width_align_mip_level(), rt.color_texture->get_height_align_mip_level()); glClearColorDLL(density_offset, density_offset, density_offset, 1.0f); @@ -1425,9 +1425,8 @@ static void sub_1403B6F60(texture* a1, texture* a2, texture* a3, EffectRipple::P int32_t width = a2->width; int32_t height = a2->height; - GLint v43[4]; - glGetIntegervDLL(GL_VIEWPORT, v43); - glViewportDLL(1, 1, width - 2, height - 2); + gl_state_rect viewport_rect = gl_state_get_viewport(); + gl_state_set_viewport(1, 1, width - 2, height - 2); ripple_scene_shader_data ripple_scene = {}; ripple_scene.g_transform = { @@ -1452,7 +1451,7 @@ static void sub_1403B6F60(texture* a1, texture* a2, texture* a3, EffectRipple::P gl_state_active_bind_texture_2d(0, 0); gl_state_bind_vertex_array(0); - glViewportDLL(v43[0], v43[1], v43[2], v43[3]); + gl_state_set_viewport(viewport_rect); } static void sub_1403B6ED0(RenderTexture* a1, RenderTexture* a2, RenderTexture* a3, EffectRipple::Params& params) { @@ -1484,13 +1483,12 @@ void EffectRipple::draw() { rt[(counter + 1) % 3]->Bind(); - GLint v43[4]; - glGetIntegervDLL(GL_VIEWPORT, v43); + gl_state_rect viewport_rect = gl_state_get_viewport(); int32_t width = rt[0]->GetWidth(); int32_t height = rt[0]->GetHeight(); - glViewportDLL(1, 1, width - 2, height - 2); + gl_state_set_viewport(1, 1, width - 2, height - 2); draw_pass_set_camera(); glClearDLL(GL_DEPTH_BUFFER_BIT); @@ -1511,7 +1509,7 @@ void EffectRipple::draw() { sub_1403B6ED0(rt[(counter + 2) % 3], rt[(counter + 1) % 3], rt[counter % 3], params); - glViewportDLL(v43[0], v43[1], v43[2], v43[3]); + gl_state_set_viewport(viewport_rect); sub_1403584A0(rt[(counter + 2) % 3]); @@ -1595,23 +1593,6 @@ void star_catalog_milky_way::create_buffers(int32_t subdivs, float_t uv_rec_scal vtx_data[vtx].texcoord.x = 1.0f; vtx_data[vtx].texcoord.y = (latitude_offset_degs_10 - (1.0f / uv_rec_scale_v) * 90.0f) * rec_latitude_degs_10; - if (!vao) - glGenVertexArrays(1, &vao); - - vbo.Create(sizeof(star_catalog_vertex) * vtx_count, vtx_data); - vbo.Bind(); - free_def(vtx_data); - - static const GLsizei buffer_size = sizeof(star_catalog_vertex); - - gl_state_bind_vertex_array(vao); - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, buffer_size, - (void*)offsetof(star_catalog_vertex, position)); - glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, buffer_size, - (void*)offsetof(star_catalog_vertex, texcoord)); - const uint16_t first_vertex = 0; const uint16_t last_vertex = (uint16_t)(vtx_count - 1); uint16_t restart_index = this->restart_index; @@ -1643,8 +1624,29 @@ void star_catalog_milky_way::create_buffers(int32_t subdivs, float_t uv_rec_scal ebo_data[idx + 3] = restart_index; } + static const GLsizei buffer_size = sizeof(star_catalog_vertex); + + if (!vao) + glGenVertexArrays(1, &vao); + + vbo.Create((size_t)buffer_size * vtx_count, vtx_data); + vbo.Bind(); + + gl_state_bind_vertex_array(vao); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, buffer_size, + (void*)offsetof(star_catalog_vertex, position)); + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, buffer_size, + (void*)offsetof(star_catalog_vertex, texcoord)); + ebo.Create(sizeof(uint16_t) * ebo_count, ebo_data); ebo.Bind(); + + gl_state_bind_vertex_array(0); + gl_state_bind_array_buffer(0); + gl_state_bind_element_array_buffer(0); + free_def(vtx_data); free_def(ebo_data); if (!star_sampler) @@ -1653,10 +1655,6 @@ void star_catalog_milky_way::create_buffers(int32_t subdivs, float_t uv_rec_scal glSamplerParameteri(star_sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glSamplerParameteri(star_sampler, GL_TEXTURE_WRAP_S, GL_REPEAT); glSamplerParameteri(star_sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - gl_state_bind_vertex_array(0); - gl_state_bind_array_buffer(0); - gl_state_bind_element_array_buffer(0); } void star_catalog_milky_way::create_default_sphere() { diff --git a/src/DivaGL/gl_state.cpp b/src/DivaGL/gl_state.cpp index a4b101c..6cb73c4 100644 --- a/src/DivaGL/gl_state.cpp +++ b/src/DivaGL/gl_state.cpp @@ -336,9 +336,11 @@ void gl_state_get() { glGetBooleanvDLL(GL_MULTISAMPLE, &gl_state.multisample); glGetBooleanvDLL(GL_PRIMITIVE_RESTART, &gl_state.primitive_restart); glGetIntegervDLL(GL_PRIMITIVE_RESTART_INDEX, (GLint*)&gl_state.primitive_restart_index); + glGetIntegervDLL(GL_SCISSOR_BOX, (GLint*)&gl_state.scissor_box); glGetBooleanvDLL(GL_SCISSOR_TEST, &gl_state.scissor_test); glGetBooleanvDLL(GL_STENCIL_TEST, &gl_state.stencil_test); glGetIntegervDLL(GL_STENCIL_WRITEMASK, (GLint*)&gl_state.stencil_mask); + glGetIntegervDLL(GL_VIEWPORT, (GLint*)&gl_state.viewport); glPolygonModeDLL(GL_FRONT_AND_BACK, GL_FILL); gl_state.polygon_front_face_mode = GL_FILL; @@ -362,6 +364,28 @@ GLuint gl_state_get_program() { return gl_state.program; } +gl_state_rect gl_state_get_scissor() { + return gl_state.scissor_box; +} + +void gl_state_get_scissor(GLint& x, GLint& y, GLsizei& width, GLsizei& height) { + x = gl_state.scissor_box.x; + y = gl_state.scissor_box.y; + width = gl_state.scissor_box.width; + height = gl_state.scissor_box.height; +} + +gl_state_rect gl_state_get_viewport() { + return gl_state.viewport; +} + +void gl_state_get_viewport(GLint& x, GLint& y, GLsizei& width, GLsizei& height) { + x = gl_state.viewport.x; + y = gl_state.viewport.y; + width = gl_state.viewport.width; + height = gl_state.viewport.height; +} + void gl_state_set_blend_func(GLenum src, GLenum dst, bool force) { if (force || gl_state.blend_src_rgb != src || gl_state.blend_dst_rgb != dst || gl_state.blend_src_alpha != GL_ONE || gl_state.blend_dst_alpha != GL_ONE_MINUS_SRC_ALPHA) { @@ -474,6 +498,25 @@ void gl_state_set_primitive_restart_index(GLuint index, bool force) { } } +void gl_state_set_scissor(const gl_state_rect& rect, bool force) { + if (force || gl_state.scissor_box.x != rect.x || gl_state.scissor_box.y != rect.y + || gl_state.scissor_box.width != rect.width || gl_state.scissor_box.height != rect.height) { + glScissorDLL(rect.x, rect.y, rect.width, rect.height); + gl_state.scissor_box = rect; + } +} + +void gl_state_set_scissor(GLint x, GLint y, GLsizei width, GLsizei height, bool force) { + if (force || gl_state.scissor_box.x != x || gl_state.scissor_box.y != y + || gl_state.scissor_box.width != width || gl_state.scissor_box.height != height) { + glScissorDLL(x, y, width, height); + gl_state.scissor_box.x = x; + gl_state.scissor_box.y = y; + gl_state.scissor_box.width = width; + gl_state.scissor_box.height = height; + } +} + void gl_state_set_stencil_mask(GLuint mask, bool force) { if (force || gl_state.stencil_mask != mask) { glStencilMask(mask); @@ -481,6 +524,25 @@ void gl_state_set_stencil_mask(GLuint mask, bool force) { } } +void gl_state_set_viewport(const gl_state_rect& rect, bool force) { + if (force || gl_state.viewport.x != rect.x || gl_state.viewport.y != rect.y + || gl_state.viewport.width != rect.width || gl_state.viewport.height != rect.height) { + glViewportDLL(rect.x, rect.y, rect.width, rect.height); + gl_state.viewport = rect; + } +} + +void gl_state_set_viewport(GLint x, GLint y, GLsizei width, GLsizei height, bool force) { + if (force || gl_state.viewport.x != x || gl_state.viewport.y != y + || gl_state.viewport.width != width || gl_state.viewport.height != height) { + glViewportDLL(x, y, width, height); + gl_state.viewport.x = x; + gl_state.viewport.y = y; + gl_state.viewport.width = width; + gl_state.viewport.height = height; + } +} + void gl_state_use_program(GLuint program, bool force) { if (force || gl_state.program != program) { glUseProgram(program); diff --git a/src/DivaGL/gl_state.hpp b/src/DivaGL/gl_state.hpp index 949b8e2..eeafef7 100644 --- a/src/DivaGL/gl_state.hpp +++ b/src/DivaGL/gl_state.hpp @@ -8,6 +8,13 @@ #include "../KKdLib/default.hpp" #include "wrap.hpp" +struct gl_state_rect { + GLint x; + GLint y; + GLsizei width; + GLsizei height; +}; + struct gl_state_struct { GLint program; GLenum active_texture; @@ -46,9 +53,11 @@ struct gl_state_struct { GLboolean multisample; GLboolean primitive_restart; GLuint primitive_restart_index; + gl_state_rect scissor_box; GLboolean scissor_test; GLboolean stencil_test; GLuint stencil_mask; + gl_state_rect viewport; }; extern gl_state_struct gl_state; @@ -98,6 +107,10 @@ extern void gl_state_get(); extern void gl_state_get_all_gl_errors(); extern GLenum gl_state_get_error(); extern GLuint gl_state_get_program(); +extern gl_state_rect gl_state_get_scissor(); +extern void gl_state_get_scissor(GLint& x, GLint& y, GLsizei& width, GLsizei& height); +extern gl_state_rect gl_state_get_viewport(); +extern void gl_state_get_viewport(GLint& x, GLint& y, GLsizei& width, GLsizei& height); extern void gl_state_set_blend_func(GLenum src, GLenum dst, bool force = false); extern void gl_state_set_blend_func_separate(GLenum src_rgb, GLenum dst_rgb, GLenum src_alpha, GLenum dst_alpha, bool force = false); @@ -111,7 +124,11 @@ extern void gl_state_set_depth_func(GLenum func, bool force = false); extern void gl_state_set_depth_mask(GLboolean flag, bool force = false); extern void gl_state_set_polygon_mode(GLenum face, GLenum mode, bool force = false); extern void gl_state_set_primitive_restart_index(GLuint index, bool force = false); +extern void gl_state_set_scissor(const gl_state_rect& rect, bool force = false); +extern void gl_state_set_scissor(GLint x, GLint y, GLsizei width, GLsizei height, bool force = false); extern void gl_state_set_stencil_mask(GLuint mask, bool force = false); +extern void gl_state_set_viewport(const gl_state_rect& rect, bool force = false); +extern void gl_state_set_viewport(GLint x, GLint y, GLsizei width, GLsizei height, bool force = false); extern void gl_state_use_program(GLuint program, bool force = false); template diff --git a/src/DivaGL/mdl/draw_object.cpp b/src/DivaGL/mdl/draw_object.cpp index 0dee376..28999da 100644 --- a/src/DivaGL/mdl/draw_object.cpp +++ b/src/DivaGL/mdl/draw_object.cpp @@ -609,6 +609,7 @@ static bool draw_object_blend_set_check_use_default_blend(int32_t index) { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, + false, false, }; if (index >= 0 && index < SHADER_FT_MAX) diff --git a/src/DivaGL/render.cpp b/src/DivaGL/render.cpp index c716e47..02eed31 100644 --- a/src/DivaGL/render.cpp +++ b/src/DivaGL/render.cpp @@ -67,7 +67,7 @@ namespace rndr { else uniform->arr[U_REDUCE] = 0; - glViewportDLL(0, 0, t->width, t->height); + gl_state_set_viewport(0, 0, t->width, t->height); gl_state_active_bind_texture_2d(0, taa_tex[taa_texture_selector]->glid); gl_state_bind_sampler(0, rctx->render_samplers[0]); shaders_ft.set(SHADER_FT_REDUCE); @@ -102,7 +102,7 @@ namespace rndr { taa_texture = 2; taa_buffer[2].Bind(); - glViewportDLL(0, 0, render_width[0], render_height[0]); + gl_state_set_viewport(0, 0, render_width[0], render_height[0]); gl_state_active_bind_texture_2d(0, taa_tex[taa_texture_selector]->glid); gl_state_bind_sampler(0, sampler); @@ -147,7 +147,7 @@ namespace rndr { } rctx->screen_buffer.Bind(); - glViewportDLL(0, 0, rctx->screen_width, rctx->screen_height); + gl_state_set_viewport(0, 0, rctx->screen_width, rctx->screen_height); if (ssaa) { gl_state_active_bind_texture_2d(0, taa_tex[taa_texture]->glid); gl_state_bind_sampler(0, rctx->render_samplers[0]); @@ -210,7 +210,7 @@ namespace rndr { } else rend_texture[0].Bind(); - glViewportDLL(0, 0, render_width[0], render_height[0]); + gl_state_set_viewport(0, 0, render_width[0], render_height[0]); } void Render::calc_exposure_chara_data() { @@ -347,7 +347,7 @@ namespace rndr { texture* movie_texture = sub_14041ED80(task_movie); if (movie_texture) { movie_textures[0].Bind(); - glViewportDLL(0, 0, movie_textures_data[0]->width, movie_textures_data[0]->height); + gl_state_set_viewport(0, 0, movie_textures_data[0]->width, movie_textures_data[0]->height); gl_state_active_bind_texture_2d(0, movie_texture->glid); uniform->arr[U_REDUCE] = 0; shaders_ft.set(SHADER_FT_REDUCE); @@ -971,7 +971,7 @@ namespace rndr { rend_texture[i].Bind(); gl_state_active_bind_texture_2d(0, rend_texture[i - 1].GetColorTex()); gl_state_bind_sampler(0, rctx->render_samplers[0]); - glViewportDLL(0, 0, render_width[i], render_height[i]); + gl_state_set_viewport(0, 0, render_width[i], render_height[i]); draw_quad( render_post_width[i - 1], render_post_height[i - 1], render_post_width_scale, render_post_height_scale, @@ -982,7 +982,7 @@ namespace rndr { shaders_ft.set(SHADER_FT_REDUCE); int32_t downsample = max_def(downsample_count - 2, 0); - glViewportDLL(0, 0, reduce_width[0], reduce_height[0]); + gl_state_set_viewport(0, 0, reduce_width[0], reduce_height[0]); reduce_texture[0].Bind(); gl_state_active_bind_texture_2d(0, rend_texture[downsample].GetColorTex()); gl_state_bind_sampler(0, rctx->render_samplers[0]); @@ -1008,7 +1008,7 @@ namespace rndr { shaders_ft.set(SHADER_FT_REDUCE); } - glViewportDLL(0, 0, reduce_width[i], reduce_height[i]); + gl_state_set_viewport(0, 0, reduce_width[i], reduce_height[i]); draw_quad(reduce_width[i - 1], reduce_height[i - 1], 1.0f, 1.0f, 0.0f, 0.0f, scale, 1.0f, 1.0f, 1.0f, 1.0f); gl_state_active_bind_texture_2d(0, reduce_tex[i]->glid); @@ -1045,7 +1045,7 @@ namespace rndr { texture* rend_tex = render_textures_data[index]; uniform->arr[U_REDUCE] = 0; - glViewportDLL(0, 0, rend_tex->width, rend_tex->height); + gl_state_set_viewport(0, 0, rend_tex->width, rend_tex->height); gl_state_active_bind_texture_2d(0, rctx->screen_buffer.GetColorTex()); gl_state_bind_sampler(0, rctx->render_samplers[0]); shaders_ft.set(SHADER_FT_REDUCE); @@ -1318,7 +1318,7 @@ namespace rndr { rctx->tone_map_ubo.WriteMemory(shader_data); - glViewportDLL(0, 0, render_width[0], render_height[0]); + gl_state_set_viewport(0, 0, render_width[0], render_height[0]); taa_buffer[2].Bind(); shaders_ft.set(SHADER_FT_TONEMAP); rctx->tone_map_ubo.Bind(1); @@ -1440,7 +1440,7 @@ namespace rndr { exposure_measure.g_spot_coefficients[i * 8 + j] = chara_data->spot_coefficients[j]; rctx->exposure_measure_ubo.WriteMemory(exposure_measure); - glViewportDLL(0, 0, 32, 1); + gl_state_set_viewport(0, 0, 32, 1); downsample_texture.Bind(); uniform->arr[U_EXPOSURE] = 1; @@ -1462,7 +1462,7 @@ namespace rndr { exposure_history_counter = (exposure_history_counter + 1) % 32; } - glViewportDLL(0, 0, 1, 1); + gl_state_set_viewport(0, 0, 1, 1); exposure_texture.Bind(); uniform->arr[U_EXPOSURE] = 2; shaders_ft.set(SHADER_FT_EXPOSURE); @@ -1572,7 +1572,7 @@ namespace rndr { gl_state_active_bind_texture_2d(0, j.type == FRAME_TEXTURE_PRE_PP ? pre_pp_tex : post_pp_tex); gl_state_bind_sampler(0, rctx->render_samplers[0]); - glViewportDLL(0, 0, dst_tex->width, dst_tex->height); + gl_state_set_viewport(0, 0, dst_tex->width, dst_tex->height); uniform->arr[U_REDUCE] = 0; shaders_ft.set(SHADER_FT_REDUCE); draw_quad(dst_tex->width, dst_tex->height, @@ -1646,7 +1646,7 @@ namespace rndr { rctx->lens_ghost_vbo.UnmapMemory(); - glViewportDLL(0, 0, render_width[0], render_height[0]); + gl_state_set_viewport(0, 0, render_width[0], render_height[0]); rend_texture[0].Bind(); gl_state_enable_blend(); gl_state_set_blend_func(GL_ONE, GL_ONE); @@ -1689,7 +1689,7 @@ namespace rndr { downsample_texture.Bind(); for (int32_t i = 1; i < 4; i++) { - glViewportDLL(0, 0, reduce_width[i], reduce_height[i]); + gl_state_set_viewport(0, 0, reduce_width[i], reduce_height[i]); gl_state_active_bind_texture_2d(0, reduce_tex[i]->glid); gl_state_bind_sampler(0, rctx->render_samplers[2]); draw_quad(reduce_width[i], reduce_height[i], @@ -1698,7 +1698,7 @@ namespace rndr { } for (int32_t i = 1; i < 4; i++) { - glViewportDLL(0, 0, reduce_width[i], reduce_height[i]); + gl_state_set_viewport(0, 0, reduce_width[i], reduce_height[i]); gl_state_active_bind_texture_2d(0, reduce_tex[i]->glid); gl_state_bind_sampler(0, rctx->render_samplers[2]); draw_quad(reduce_width[i], reduce_height[i], @@ -1709,7 +1709,7 @@ namespace rndr { uniform->arr[U_GAUSS] = 1; shaders_ft.set(SHADER_FT_GAUSS); - glViewportDLL(0, 0, reduce_width[0], reduce_height[0]); + gl_state_set_viewport(0, 0, reduce_width[0], reduce_height[0]); gl_state_active_bind_texture_2d(0, reduce_tex[0]->glid); gl_state_bind_sampler(0, rctx->render_samplers[2]); draw_quad(reduce_width[0], reduce_height[0], @@ -1719,7 +1719,7 @@ namespace rndr { uniform->arr[U_REDUCE] = 7; shaders_ft.set(SHADER_FT_REDUCE); - glViewportDLL(0, 0, reduce_width[0], reduce_height[0]); + gl_state_set_viewport(0, 0, reduce_width[0], reduce_height[0]); reduce_texture[0].Bind(); gl_state_active_bind_texture_2d(0, downsample_texture.GetColorTex()); gl_state_active_bind_texture_2d(1, reduce_tex[1]->glid); diff --git a/src/DivaGL/render_context.cpp b/src/DivaGL/render_context.cpp index 9fc6353..0d8b134 100644 --- a/src/DivaGL/render_context.cpp +++ b/src/DivaGL/render_context.cpp @@ -123,8 +123,6 @@ void obj_shader_shader_data::set_shader_flags(int32_t* shader_flags) { g_shader_flags.w.m.specular = shader_flags[U_SPECULAR]; g_shader_flags.w.m.tone_map = shader_flags[U_TONE_MAP]; g_shader_flags.w.m.u45 = shader_flags[U45]; - g_shader_flags.w.m.dof = 0; //shader_flags[U_DOF]; // Added - g_shader_flags.w.m.dof_stage = 0; //shader_flags[U_DOF_STAGE]; // Added } void obj_scene_shader_data::set_g_irradiance_r_transforms(const mat4& mat) { @@ -342,6 +340,7 @@ samplers(), render_samplers(), sprite_samplers(), screen_width(), screen_height( sss_filter_gaussian_coef_ubo.Create(sizeof(sss_filter_gaussian_coef_shader_data)); sun_quad_ubo.Create(sizeof(sun_quad_shader_data)); tone_map_ubo.Create(sizeof(tone_map_shader_data)); + transparency_batch_ubo.Create(sizeof(transparency_batch_shader_data)); obj_shader = {}; obj_scene = {}; @@ -455,8 +454,8 @@ render_context::~render_context() { obj_scene_ubo.Destroy(); obj_shader_ubo.Destroy(); - tone_map_ubo.Destroy(); transparency_batch_ubo.Destroy(); + tone_map_ubo.Destroy(); sun_quad_ubo.Destroy(); sss_filter_gaussian_coef_ubo.Destroy(); sprite_scene_ubo.Destroy(); diff --git a/src/DivaGL/render_context.hpp b/src/DivaGL/render_context.hpp index 06357cc..2f01951 100644 --- a/src/DivaGL/render_context.hpp +++ b/src/DivaGL/render_context.hpp @@ -227,8 +227,6 @@ struct obj_shader_shader_data { uint32_t specular : 1; // bit 96+14 uint32_t tone_map : 2; // bit 96+15 uint32_t u45 : 1; // bit 96+16 - uint32_t dof : 1; // bit 96+17 // Added - uint32_t dof_stage : 3; // bit 96+18 // Added } m; uint32_t w; } w; @@ -366,6 +364,10 @@ struct tone_map_shader_data { vec4 g_texcoord_transforms[8]; }; +struct transparency_batch_shader_data { + vec4 g_opacity; +}; + struct render_context { mat4 view_mat; mat4 proj_mat; @@ -399,8 +401,8 @@ struct render_context { GL::UniformBuffer sprite_scene_ubo; GL::UniformBuffer sss_filter_gaussian_coef_ubo; GL::UniformBuffer sun_quad_ubo; - GL::UniformBuffer transparency_batch_ubo; GL::UniformBuffer tone_map_ubo; + GL::UniformBuffer transparency_batch_ubo; obj_shader_shader_data obj_shader; obj_scene_shader_data obj_scene; diff --git a/src/DivaGL/render_manager.cpp b/src/DivaGL/render_manager.cpp index efc1a36..80bf6d0 100644 --- a/src/DivaGL/render_manager.cpp +++ b/src/DivaGL/render_manager.cpp @@ -456,7 +456,7 @@ namespace rndr { //} //else { // sss->textures[0].Bind(); - // glViewportDLL(0, 0, 640, 360); + // gl_state_set_viewport(0, 0, 640, 360); //} glClearColorDLL(sss->param.x, sss->param.y, sss->param.z, 0.0f); @@ -508,7 +508,7 @@ namespace rndr { if (!sss->npr_contour) { sss->textures[0].Bind(); - glViewportDLL(0, 0, 640, 360); + gl_state_set_viewport(0, 0, 640, 360); filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = { 1.0f, 1.0f, 0.0f, 0.0f }; @@ -618,7 +618,7 @@ namespace rndr { || disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_TRANSPARENT) || disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_TRANSLUCENT)) { texture* refr_tex = refract_texture.color_texture; - glViewportDLL(0, 0, refr_tex->width, refr_tex->height); + gl_state_set_viewport(0, 0, refr_tex->width, refr_tex->height); draw_pass_set_camera(); @@ -971,7 +971,7 @@ namespace rndr { gl_state_begin_event("pass_sprite"); if (sprite_manager_get_reqlist_count(0)) { rndr::Render* rend = render; - glViewportDLL(0, 0, rend->screen_width, rend->screen_height); + gl_state_set_viewport(0, 0, rend->screen_width, rend->screen_height); if (multisample && multisample_framebuffer) { gl_state_bind_framebuffer(multisample_framebuffer); @@ -1078,7 +1078,7 @@ void image_filter_scale(RenderTexture* dst, texture* src, const vec4& scale) { return; gl_state_begin_event("`anonymous-namespace'::Impl::apply_no_filter_sub"); - glViewportDLL(0, 0, dst->color_texture->width, dst->color_texture->height); + gl_state_set_viewport(0, 0, dst->color_texture->width, dst->color_texture->height); dst->Bind(); @@ -1245,7 +1245,7 @@ static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, int32_t index, i shad->curr_render_textures[0]->Bind(); shad->curr_render_textures[0]->SetViewport(); texture* tex = shad->curr_render_textures[0]->color_texture; - glScissorDLL(0, 0, tex->width, tex->height); + gl_state_set_scissor(0, 0, tex->width, tex->height); gl_state_enable_depth_test(); gl_state_enable_scissor_test(); glClearColorDLL(1.0, 1.0, 1.0, 1.0); @@ -1253,7 +1253,7 @@ static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, int32_t index, i glClearDLL(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); else if (shad->separate) glClearDLL(GL_COLOR_BUFFER_BIT); - glScissorDLL(1, 1, tex->width - 2, tex->height - 2); + gl_state_set_scissor(1, 1, tex->width - 2, tex->height - 2); float_t shadow_range = shad->get_shadow_range(); float_t offset; @@ -1350,7 +1350,7 @@ static void draw_pass_shadow_filter(RenderTexture* a1, RenderTexture* a2, rctx->filter_scene_ubo.Bind(0); rctx->esm_filter_batch_ubo.Bind(1); - glViewportDLL(0, 0, v7->width, v7->height); + gl_state_set_viewport(0, 0, v7->width, v7->height); a2->Bind(); esm_filter_batch.g_params = { 1.0f / (float_t)v7->width, 0.0f, far_texel_offset, far_texel_offset }; @@ -1405,7 +1405,7 @@ static void draw_pass_shadow_esm_filter(RenderTexture* dst, RenderTexture* buf, rctx->filter_scene_ubo.Bind(0); rctx->esm_filter_batch_ubo.Bind(1); - glViewportDLL(0, 0, dst_tex->width, dst_tex->height); + gl_state_set_viewport(0, 0, dst_tex->width, dst_tex->height); buf->Bind(); esm_filter_batch.g_params = { 1.0f / (float_t)src_tex->width, @@ -1473,7 +1473,7 @@ static bool draw_pass_shadow_litproj_set() { static const GLfloat depth_clear = 1.0f; litproj_shadow[0].Bind(); - glViewportDLL(0, 0, 2048, 512); + gl_state_set_viewport(0, 0, 2048, 512); gl_state_enable_depth_test(); gl_state_set_depth_mask(GL_TRUE); glClearBufferfv(GL_COLOR, 0, (float_t*)&color_clear); @@ -1546,7 +1546,7 @@ static void draw_pass_sss_contour(rndr::Render* rend) { gl_state_enable_depth_test(); gl_state_set_depth_func(GL_ALWAYS); gl_state_set_depth_mask(GL_TRUE); - glViewportDLL(0, 0, rend->render_width[0], rend->render_height[0]); + gl_state_set_viewport(0, 0, rend->render_width[0], rend->render_height[0]); gl_state_active_bind_texture_2d(0, rend->rend_texture[0].GetColorTex()); gl_state_bind_sampler(0, rctx->render_samplers[1]); gl_state_active_bind_texture_2d(1, rend->rend_texture[0].GetDepthTex()); @@ -1660,7 +1660,7 @@ static void draw_pass_sss_filter(sss_data* sss) { gl_state_active_texture(0); if (sss->npr_contour) { sss->textures[0].Bind(); - glViewportDLL(0, 0, 640, 360); + gl_state_set_viewport(0, 0, 640, 360); rndr::Render* rend = render_get(); uniform->arr[U_REDUCE] = 0; shaders_ft.set(SHADER_FT_REDUCE); @@ -1670,7 +1670,7 @@ static void draw_pass_sss_filter(sss_data* sss) { 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f); } sss->textures[2].Bind(); - glViewportDLL(0, 0, 320, 180); + gl_state_set_viewport(0, 0, 320, 180); uniform->arr[U_SSS_FILTER] = 0; shaders_ft.set(SHADER_FT_SSS_FILT); gl_state_bind_texture_2d(sss->textures[0].GetColorTex()); @@ -1689,7 +1689,7 @@ static void draw_pass_sss_filter(sss_data* sss) { rctx->sss_filter_gaussian_coef_ubo.WriteMemory(shader_data); sss->textures[1].Bind(); - glViewportDLL(0, 0, 320, 180); + gl_state_set_viewport(0, 0, 320, 180); uniform->arr[U_SSS_FILTER] = 3; shaders_ft.set(SHADER_FT_SSS_FILT); gl_state_bind_texture_2d(sss->textures[2].GetColorTex()); diff --git a/src/DivaGL/render_texture.hpp b/src/DivaGL/render_texture.hpp index ff15297..fb46aa7 100644 --- a/src/DivaGL/render_texture.hpp +++ b/src/DivaGL/render_texture.hpp @@ -6,6 +6,7 @@ #pragma once #include "shared.hpp" +#include "gl_state.hpp" #include "texture.hpp" struct RenderTexture { @@ -46,7 +47,7 @@ struct RenderTexture { }; inline void SetViewport() { - glViewportDLL(0, 0, GetWidth(), GetHeight()); + gl_state_set_viewport(0, 0, GetWidth(), GetHeight()); }; }; diff --git a/src/DivaGL/renderer/dof.cpp b/src/DivaGL/renderer/dof.cpp index c26fec5..01b359c 100644 --- a/src/DivaGL/renderer/dof.cpp +++ b/src/DivaGL/renderer/dof.cpp @@ -8,6 +8,7 @@ #include "../camera.hpp" #include "../gl_state.hpp" #include "../render_context.hpp" +#include "../shader_ft.hpp" #include struct dof_common_shader_data { @@ -24,12 +25,12 @@ dof_debug* dof_debug_data = (dof_debug*)0x00000001411AB650; dof_pv* dof_pv_data = (dof_pv*)0x0000001411AB630; namespace renderer { - DOF3::DOF3(int32_t width, int32_t height) : textures(), fbo(), samplers(), vao(), program() { + DOF3::DOF3(int32_t width, int32_t height) + : textures(), samplers(), vao(), program() { this->width = width; this->height = height; init(width, height); - load_shaders(); } DOF3::~DOF3() { @@ -146,519 +147,12 @@ namespace renderer { common_ubo.Create(sizeof(dof_common_shader_data)); vec2 data[50] = {}; - renderer::DOF3::calculate_texcoords(data, 3.0); + renderer::DOF3::calculate_texcoords(data, 3.0f); texcoords_ubo.Create(sizeof(data), data); glGenVertexArrays(1, &vao); } - void renderer::DOF3::load_shaders() { - const size_t buf_len = 0x8000; - char* buf = (char*)_operator_new(buf_len); - if (!buf) - return; - - GLProgram::ShaderData shader_data[2]; - shader_data[0].type = GL_VERTEX_SHADER; - shader_data[0].string = - u8"#version 430\n" - u8"out VertexData{\n" - u8" vec2 texcoord;\n" - u8"}result;\n" - u8"void main(){\n" - u8" gl_Position.x = -1.f + (gl_VertexID / 2) * 4;\n" - u8" gl_Position.y = 1.f - (gl_VertexID % 2) * 4;\n" - u8" gl_Position.z = 0.f;\n" - u8" gl_Position.w = 1.f;\n" - u8" result.texcoord = gl_Position.xy * 0.5f + 0.5f;\n" - u8"}\n"; - shader_data[0].length = 273; - - shader_data[1].type = GL_FRAGMENT_SHADER; - shader_data[1].string = - u8"#version 430\n" - u8"layout(binding = 0) uniform sampler2D g_tile;//r=min_depth_m, g=max_coc_pixel\n" - u8"layout(location = 0) out vec2 result;//r=min_depth_m, g=max_coc_pixel\n" - u8"in VertexData{\n" - u8" vec2 texcoord;\n" - u8"}frg;\n" - u8"void main(){\n" - u8" //3x3サンプル。\n" - u8" vec2 texture_size = textureSize(g_tile, 0);\n" - u8" vec2 texel_size = vec2(1.f / texture_size.x, 1.f / texture_size.y);\n" - u8" vec2 uv = frg.texcoord;\n" - u8" const vec2 v00 = textureLod(g_tile, uv + vec2(-texel_size.x, -texel_size.y), 0).rg;\n" - u8" const vec2 v01 = textureLod(g_tile, uv + vec2(0.f, -texel_size.y), 0).rg;\n" - u8" const vec2 v02 = textureLod(g_tile, uv + vec2(texel_size.x, -texel_size.y), 0).rg;\n" - u8" const vec2 v10 = textureLod(g_tile, uv + vec2(-texel_size.x, 0.f), 0).rg;\n" - u8" const vec2 v11 = textureLod(g_tile, uv + vec2(0.f, 0.f), 0).rg;\n" - u8" const vec2 v12 = textureLod(g_tile, uv + vec2(texel_size.x, 0.f), 0).rg;\n" - u8" const vec2 v20 = textureLod(g_tile, uv + vec2(-texel_size.x, texel_size.y), 0).rg;\n" - u8" const vec2 v21 = textureLod(g_tile, uv + vec2(0.f, texel_size.y), 0).rg;\n" - u8" const vec2 v22 = textureLod(g_tile, uv + vec2(texel_size.x, texel_size.y), 0).rg;\n" - u8" //depthはmin。\n" - u8" result.r = min(v00.r, v01.r);\n" - u8" result.r = min(result.r, v02.r);\n" - u8" result.r = min(result.r, v10.r);\n" - u8" result.r = min(result.r, v11.r);\n" - u8" result.r = min(result.r, v12.r);\n" - u8" result.r = min(result.r, v20.r);\n" - u8" result.r = min(result.r, v21.r);\n" - u8" result.r = min(result.r, v22.r);\n" - u8" //cocはmax。\n" - u8" result.g = max(v00.g, v01.g);\n" - u8" result.g = max(result.g, v02.g);\n" - u8" result.g = max(result.g, v10.g);\n" - u8" result.g = max(result.g, v11.g);\n" - u8" result.g = max(result.g, v12.g);\n" - u8" result.g = max(result.g, v20.g);\n" - u8" result.g = max(result.g, v21.g);\n" - u8" result.g = max(result.g, v22.g);\n" - u8"}\n"; - shader_data[1].length = 1741; - - program[0].compile_program(shader_data, 2); - - GLProgram* program = &this->program[1]; - for (int32_t i = 0; i < 2; i++) { - int32_t common_length = 0; - int32_t shader_length = 0; - - memcpy_s(buf, buf_len, "#version 430\n", 13); - common_length += 13; - - memcpy_s(buf + common_length, buf_len - common_length, "#define USE_F2_COC (", 20); - common_length += 20; - - buf[common_length++] = (char)('0' + i); - - memcpy_s(buf + common_length, buf_len - common_length, ")\n", 2); - common_length += 2; - - memcpy_s(buf + common_length, buf_len - common_length, - u8"layout(binding = 0) uniform Common{\n" - u8" uniform vec4 g_depth_params;//x=(n-f)/(nf), y=1/n, z=coc_from_z_scale, w=coc_from_z_offset\n" - u8" uniform vec4 g_spread_scale;//x=scale_from_meter_to_pixel, y=scale_from_meter_to_sample, z=scale_from_pi" - u8"xel_to_sample, w=scale_from_sample_to_pixel\n" - u8" uniform vec4 g_depth_params2;//x=distance_to_focus_m, y=focus_range, z=k/(fuzzing_range*fuzzing_range), " - u8"w=max_coc_radius_in_pixel //yzw=for_f2\n" - u8"};\n" - u8"#define SCALE_FROM_METER_TO_PIXEL g_spread_scale.x\n" - u8"#define SCALE_FROM_METER_TO_SAMPLE g_spread_scale.y\n" - u8"#define SCALE_FROM_PIXEL_TO_SAMPLE g_spread_scale.z\n" - u8"#define SCALE_FROM_SAMPLE_TO_PIXEL g_spread_scale.w\n" - u8"#define SAMPLE_DIVISION (7)\n" - u8"#define SAMPLE_COUNT (SAMPLE_DIVISION * SAMPLE_DIVISION)\n" - u8"#define PI 3.1415926535f\n" - u8"#define DOF_SINGLE_PIXEL_RADIUS (0.5f * 1.414213562f)\n" - u8"#define DOF_DEPTH_SCALE_FOREGROUND 0.f//0で前ボケをあきらめる//0.05f//小さいと前景よりに。\n" - u8"#define MAX_COC_RADIUS_PIXEL (8)\n" - u8"float calculate_depth_m_from_value_in_zbuffer(const float value_in_zbuffer){\n" - u8" return 1.f / (value_in_zbuffer * g_depth_params.x + g_depth_params.y);//線形化。\n" - u8"}\n" - u8"vec4 calculate_depth_m_from_value_in_zbuffer(const vec4 value_in_zbuffer){\n" - u8" return vec4(1.f) / (value_in_zbuffer * g_depth_params.xxxx + g_depth_params.yyyy);\n" - u8"}\n" - u8"float clamp_coc_pixel(const float radius_pixel){\n" - u8" return min(radius_pixel, MAX_COC_RADIUS_PIXEL);\n" - u8" //return clamp(radius_pixel, -MAX_COC_RADIUS_PIXEL, MAX_COC_RADIUS_PIXEL);\n" - u8"}\n" - u8"#if USE_F2_COC\n" - u8"float calculate_coc_pixel_from_depth(const float linear_depth){\n" - u8" float depth_dist = max(abs(g_depth_params2.x - linear_depth) - g_depth_params2.y, 0.f);\n" - u8" float dof_ratio = 1.f - exp(depth_dist * depth_dist * g_depth_params2.z);\n" - u8" return dof_ratio * g_depth_params2.w;\n" - u8"}\n" - u8"float calculate_coc_pixel_from_value_in_zbuffer(const float value_in_zbuffer){\n" - u8" float d = calculate_depth_m_from_value_in_zbuffer(value_in_zbuffer);\n" - u8" return calculate_coc_pixel_from_depth(d);\n" - u8"}\n" - u8"#else\n" - u8"const float TEST_SCALE = 10.f;\n" - u8"float calculate_coc_pixel_from_value_in_zbuffer(const float value_in_zbuffer){\n" - u8" return clamp_coc_pixel(abs(value_in_zbuffer * g_depth_params.z + g_depth_params.w) * 1000.f * TEST_SCALE" - u8");//適当。1[m]=100[pixel]と換算。@todo 適正化。\n" - u8"}\n" - u8"float calculate_coc_pixel_from_depth(const float linear_depth){\n" - u8" float z = (1.f / linear_depth - g_depth_params.y) / g_depth_params.x;//0割りあり得るなぁ。@todo 事前に計算をまとめる。\n" - u8" return calculate_coc_pixel_from_value_in_zbuffer(z);\n" - u8"}\n" - u8"#endif\n" - u8"float calculate_sample_alpha(const float sample_coc_in_pixel){\n" - u8" return\n" - u8" 1.f / (PI * max(DOF_SINGLE_PIXEL_RADIUS * DOF_SINGLE_PIXEL_RADIUS, sample_coc_in_pixel * sample_coc_" - u8"in_pixel));//CoCの面積の逆数。面積で割ることでエネルギーが保存される。\n" - u8"}\n" - u8"float calculate_background_depth_weight(const float depth, const float tile_min_depth){//1で背景。0で前景。\n" - u8" float d = DOF_DEPTH_SCALE_FOREGROUND * (depth - tile_min_depth);\n" - u8" return smoothstep(0.f, 1.f, d);\n" - u8"}\n", 3025); - common_length += 3024; - - memcpy_s(buf + common_length, buf_len - common_length, - u8"layout(binding = 0) uniform sampler2D g_depth;\n" - u8"layout(location = 0) out vec2 result;//r=min_depth_m, g=max_coc_pixel\n" - u8"in VertexData{\n" - u8" vec2 texcoord;\n" - u8"}frg;\n" - u8"void main(){\n" - u8" //タイル化。r=最小深度, g=最大CoC。\n" - u8"#define N (20)\n" - u8" ivec2 texture_size = textureSize(g_depth, 0);\n" - u8" const vec2 step = vec2(1.f / float(texture_size.x), 1.f / float(texture_size.y));\n" - u8" vec2 lt_uv = frg.texcoord + (-N / 2.f + 0.5f) * step;\n" - u8" vec2 uv = lt_uv;\n" - u8" float min_z = 1.f;\n" - u8" float max_coc = 0.f;\n" - u8" for(int i = 0; i < N; ++ i){\n" - u8" uv.x = lt_uv.x;\n" - u8" for(int j = 0; j < N; ++ j){//@todo tehxtureGatherOffsetsでループ回数を減らしてみよ。\n" - u8" const float z = textureLod(g_depth, uv, 0).r;\n" - u8" if(z < min_z){\n" - u8" min_z = z;\n" - u8" }\n" - u8" const float coc = calculate_coc_pixel_from_value_in_zbuffer(z);\n" - u8" if(max_coc < coc){\n" - u8" max_coc = coc;\n" - u8" }\n" - u8" uv.x += step.x;\n" - u8" }\n" - u8" uv.y += step.y;\n" - u8" }\n" - u8" result.r = calculate_depth_m_from_value_in_zbuffer(min_z);//線形化。\n" - u8" result.g = max_coc;\n" - u8" //result.g = 8.f<=max_coc?1.f:0.f;\n" - u8"}\n", 1154); - shader_length = 1153; - - shader_data[1].type = GL_FRAGMENT_SHADER; - shader_data[1].string = buf; - shader_data[1].length = common_length + shader_length; - - program[0].compile_program(shader_data, 2); - - memcpy_s(buf + common_length, buf_len - common_length, - u8"layout(binding = 0) uniform sampler2D g_depth_point_sampler;\n" - u8"layout(binding = 1) uniform sampler2D g_color_linear_sampler;\n" - u8"layout(binding = 2) uniform sampler2D g_tile_sampler;\n" - u8"layout(location = 0) out vec3 result_prefilter;\n" - u8"layout(location = 1) out vec3 result_presort;\n" - u8"in VertexData{\n" - u8" vec2 texcoord;\n" - u8"}frg;\n" - u8"float fetch_max_depth(in const vec2 texcoord){\n" - u8" vec4 z = textureGather(g_depth_point_sampler, texcoord, 0);//bilinearのフットプリントで、4点をサンプル。\n" - u8" return max(max(z.x, z.y), max(z.z, z.w));//最も遠い深度を選択。\n" - u8"}\n" - u8"float calculate_min_bilateral_weight(\n" - u8" in const vec2 texcoord,\n" - u8" in const float depth_center,\n" - u8" in const float side_center){//ここでdepth_centerが前景なら、前景サンプルのみを使うように。depth_centerが背景なら背景サンプルのみを使うように。\n" - u8" const float depth_scale = 1.f;\n" - u8"#if 1\n" - u8" vec4 z = calculate_depth_m_from_value_in_zbuffer(textureGather(g_depth_point_sampler, texcoord, 0));//非線形のまま、差が最大のものを選択した方が良いかも。\n" - u8" z -= vec4(depth_center);\n" - u8" z = abs(z);\n" - u8" float d = max(max(z.x, z.y), max(z.z, z.w));//最も離れた深度を選択。\n" - u8" return 1.f / (d * depth_scale + 1.f);\n" - u8"#elif 0//おもいぞ!\n" - u8" vec4 z = textureGather(g_depth_point_sampler, texcoord, 0);\n" - u8" float max_z = calculate_depth_m_from_value_in_zbuffer(max(max(z.x, z.y), max(z.z, z.w)));//最も遠い深度を選択。\n" - u8" if(0.f < side_center * (max_z - g_depth_params2.x)){//中央タップと同じ側(前景,背景)にある。\n" - u8" z = calculate_depth_m_from_value_in_zbuffer(z);\n" - u8" z -= vec4(depth_center);\n" - u8" z = abs(z);\n" - u8" float d = max(max(z.x, z.y), max(z.z, z.w));//最も離れた深度を選択。\n" - u8" return 1.f / (d * depth_scale + 1.f);\n" - u8" }else{\n" - u8" return 0.f;\n" - u8" }\n" - u8"#else//おもいぞ!\n" - u8" vec4 z = calculate_depth_m_from_value_in_zbuffer(textureGather(g_depth_point_sampler, texcoord, 0));\n" - u8" vec4 d = z - vec4(depth_center);\n" - u8" d = abs(d);//最大の成分を選ぶ。\n" - u8" float rz, rd;\n" - u8" if(d.x < d.y){//y, z, w\n" - u8" if(d.y < d.z){//z, w\n" - u8" if(d.z < d.w){//w\n" - u8" rz = z.w;\n" - u8" rd = d.w;\n" - u8" }else{//z\n" - u8" rz = z.z;\n" - u8" rd = d.z;\n" - u8" }\n" - u8" }else if(d.y < d.w){//w\n" - u8" rz = z.w;\n" - u8" rd = d.w;\n" - u8" }else{//y\n" - u8" rz = z.y;\n" - u8" rd = d.y;\n" - u8" }\n" - u8" }else if(d.x < d.z){//z, w\n" - u8" if(d.z < d.w){//w\n" - u8" rz = z.w;\n" - u8" rd = d.w;\n" - u8" }else{//z\n" - u8" rz = z.z;\n" - u8" rd = d.z;\n" - u8" }\n" - u8" }else if(d.x < d.w){//w\n" - u8" rz = z.w;\n" - u8" rd = d.w;\n" - u8" }else{//x\n" - u8" rz = z.x;\n" - u8" rd = d.x;\n" - u8" }\n" - u8" return (0.f <= (rz - g_depth_params2.x) * side_center) ? (1.f / (rd * depth_scale + 1.f)) : 0.f;//中央タップと側(前景, 背景)が異なる場合は重み0。\n" - u8"#endif\n" - u8"}\n" - u8"float luminace_from_rgb(in const vec3 rgb){\n" - u8" return dot(vec3(0.3f, 0.59f, 0.11f), rgb);\n" - u8"}\n" - u8"vec3 calculate_karis_average(in const vec3 color, const float sharpness){\n" - u8" return color * 1.f / (1.f + (1.f - sharpness) * luminace_from_rgb(color));\n" - u8"}\n" - u8"//9点サンプルして深度を重みにしたバイラテラルフィルタで合成。\n" - u8"vec3 prefilter(in const float coc_center_pixel, in const float depth_center){\n" - u8" const float side_center = depth_center - g_depth_params2.x;//前景->side_center<0, 背景->0arr[U_DOF] = 1; + gl_state_bind_vertex_array(vao); render_tiles(depth_texture, true); downsample(color_texture, depth_texture, true); @@ -694,13 +190,15 @@ namespace renderer { update_data(min_distance, max_distance, fov, focus, focal_length, f_number, 0.0f, 0.1f, 0.0f); + uniform->arr[U_DOF] = 0; + gl_state_bind_vertex_array(vao); render_tiles(depth_texture, false); downsample(color_texture, depth_texture, false); apply_main_filter(false); upsample(rt, color_texture, depth_texture, false); - gl_state_use_program(0); + shader::unbind(); for (int32_t i = 0; i < 8; i++) { gl_state_bind_sampler(i, 0); gl_state_active_bind_texture_2d(i, 0); @@ -712,16 +210,18 @@ namespace renderer { void DOF3::render_tiles(GLuint depth_texture, bool f2) { gl_state_begin_event("renderer::DOF3::render_tiles"); fbo[0].bind_buffer(); - glViewportDLL(0, 0, fbo[0].width, fbo[0].height); - program[f2 ? 5 : 1].use_program(); + gl_state_set_viewport(0, 0, fbo[0].width, fbo[0].height); + uniform->arr[U_DOF_STAGE] = 0; + shaders_ft.set(SHADER_FT_DOF); common_ubo.Bind(0); gl_state_active_bind_texture_2d(0, depth_texture); gl_state_bind_sampler(0, samplers[1]); glDrawArraysDLL(GL_TRIANGLE_STRIP, 0, 4); fbo[1].bind_buffer(); - glViewportDLL(0, 0, fbo[1].width, fbo[1].height); - program[0].use_program(); + gl_state_set_viewport(0, 0, fbo[1].width, fbo[1].height); + uniform->arr[U_DOF_STAGE] = 1; + shaders_ft.set(SHADER_FT_DOF); gl_state_active_bind_texture_2d(0, textures[0]); gl_state_bind_sampler(0, samplers[1]); glDrawArraysDLL(GL_TRIANGLE_STRIP, 0, 4); @@ -732,8 +232,9 @@ namespace renderer { void DOF3::downsample(GLuint color_texture, GLuint depth_texture, bool f2) { gl_state_begin_event("renderer::DOF3::downsample"); fbo[2].bind_buffer(); - glViewportDLL(0, 0, fbo[2].width, fbo[2].height); - program[f2 ? 6 : 2].use_program(); + gl_state_set_viewport(0, 0, fbo[2].width, fbo[2].height); + uniform->arr[U_DOF_STAGE] = 2; + shaders_ft.set(SHADER_FT_DOF); common_ubo.Bind(0); gl_state_active_bind_texture_2d(0, depth_texture); gl_state_bind_sampler(0, samplers[1]); @@ -748,8 +249,9 @@ namespace renderer { void DOF3::apply_main_filter(bool f2) { gl_state_begin_event("renderer::DOF3::apply_main_filter"); fbo[3].bind_buffer(); - glViewportDLL(0, 0, fbo[3].width, fbo[3].height); - program[f2 ? 7 : 3].use_program(); + gl_state_set_viewport(0, 0, fbo[3].width, fbo[3].height); + uniform->arr[U_DOF_STAGE] = 3; + shaders_ft.set(SHADER_FT_DOF); common_ubo.Bind(0); texcoords_ubo.Bind(1); gl_state_active_bind_texture_2d(0, textures[3]); @@ -765,8 +267,9 @@ namespace renderer { void DOF3::upsample(RenderTexture* rt, GLuint color_texture, GLuint depth_texture, bool f2) { gl_state_begin_event("renderer::DOF3::upsample"); rctx->render_buffer.Bind(); - glViewportDLL(0, 0, width, height); - program[f2 ? 8 : 4].use_program(); + gl_state_set_viewport(0, 0, width, height); + uniform->arr[U_DOF_STAGE] = 4; + shaders_ft.set(SHADER_FT_DOF); common_ubo.Bind(0); gl_state_active_bind_texture_2d(0, textures[4]); gl_state_bind_sampler(0, samplers[1]); diff --git a/src/DivaGL/renderer/dof.hpp b/src/DivaGL/renderer/dof.hpp index 0a43fde..cb0961a 100644 --- a/src/DivaGL/renderer/dof.hpp +++ b/src/DivaGL/renderer/dof.hpp @@ -9,7 +9,6 @@ #include "../GL/uniform_buffer.hpp" #include "../render_texture.hpp" #include "fbo.hpp" -#include "gl_program.hpp" enum dof_debug_flags { DOF_DEBUG_USE_UI_PARAMS = 0x01, @@ -52,7 +51,7 @@ namespace renderer { FBO fbo[4]; GLuint samplers[2]; GLuint vao; - GLProgram program[9]; + GLuint program[9]; // Unused GL::UniformBuffer common_ubo; GL::UniformBuffer texcoords_ubo; @@ -65,7 +64,6 @@ namespace renderer { private: void free(); void init(int32_t width, int32_t height); - void load_shaders(); void apply_f2(RenderTexture* rt, GLuint color_texture, GLuint depth_texture, float_t min_distance, float_t max_distance, float_t fov, diff --git a/src/DivaGL/renderer/gl_program.cpp b/src/DivaGL/renderer/gl_program.cpp deleted file mode 100644 index 6da0759..0000000 --- a/src/DivaGL/renderer/gl_program.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "gl_program.hpp" -#include "../gl_state.hpp" - -namespace renderer { - bool GLProgram::compile_program(GLProgram::ShaderData* shader_data, int32_t count) { - if (program) { - glDeleteProgram(program); - program = 0; - } - - program = glCreateProgram(); - - for (int32_t i = 0; i < count; i++, shader_data++) { - GLuint shader = glCreateShader(shader_data->type); - if (!renderer::GLProgram::compile_shader(shader, shader_data->string, shader_data->length)) - return false; - - glAttachShader(program, shader); - glDeleteShader(shader); - } - - glLinkProgram(program); - return !glGetErrorDLL(); - } - - bool GLProgram::compile_shader(GLuint shader, const char* string, int32_t length) { - const char* strings[] = { string }; - int32_t lengths[] = { length }; - - glShaderSource(shader, 1, strings, lengths); - glCompileShader(shader); - - int32_t info_log_length; - char info_log[0x400]; - glGetShaderInfoLog(shader, sizeof(info_log), &info_log_length, info_log); - - int32_t compile_status; - glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status); - return compile_status == GL_TRUE; - } -} diff --git a/src/DivaGL/renderer/gl_program.hpp b/src/DivaGL/renderer/gl_program.hpp deleted file mode 100644 index cc646cb..0000000 --- a/src/DivaGL/renderer/gl_program.hpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "../../KKdLib/default.hpp" -#include "../../KKdLib/vec.hpp" -#include "../gl_state.hpp" -#include "../shared.hpp" - -namespace renderer { - struct GLProgram { - struct ShaderData { - GLenum type; - const char* string; - int32_t length; - }; - - GLuint program; - - bool compile_program(GLProgram::ShaderData* shader_data, int32_t count); - - static bool compile_shader(GLuint shader, const char* string, int32_t length); - - inline void use_program() { - gl_state_use_program(program); - } - }; - - static_assert(sizeof(renderer::GLProgram) == 0x04, "\"renderer::GLProgram\" struct should have a size of 0x04"); -}; diff --git a/src/DivaGL/renderer/transparency.cpp b/src/DivaGL/renderer/transparency.cpp index c7e270c..b4e07d5 100644 --- a/src/DivaGL/renderer/transparency.cpp +++ b/src/DivaGL/renderer/transparency.cpp @@ -6,6 +6,8 @@ #include "transparency.hpp" #include "../../KKdLib/str_utils.hpp" #include "../render_context.hpp" +#include "../gl_state.hpp" +#include "../shader_ft.hpp" extern render_context* rctx; @@ -16,8 +18,6 @@ namespace renderer { color_textures[0] = color_texture; fbo.init(width, height, color_textures, 1, depth_texture); - load_shaders(); - glGenSamplers(1, &sampler); glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); @@ -40,30 +40,30 @@ namespace renderer { } void Transparency::combine(RenderTexture* rt, float_t alpha) { - vec4 g_opacity = { alpha, 0.0f, 0.0f, 0.0f }; + transparency_batch_shader_data shader_data = {}; + shader_data.g_opacity = { alpha, 0.0f, 0.0f, 0.0f }; + rctx->transparency_batch_ubo.WriteMemory(shader_data); gl_state_disable_blend(); gl_state_disable_depth_test(); rctx->render_buffer.Bind(); - program.use_program(); - glUniform4fv(0, 1, (GLfloat*)&g_opacity.x); + shaders_ft.set(SHADER_FT_TRANSPARENCY); + rctx->transparency_batch_ubo.Bind(0); gl_state_active_bind_texture_2d(0, fbo.textures[0]); gl_state_active_bind_texture_2d(1, rt->GetColorTex()); gl_state_bind_vertex_array(vao); - glDrawArraysDLL(GL_TRIANGLE_STRIP, 0, 4); + shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); gl_state_enable_depth_test(); - glCopyImageSubData( - rctx->render_buffer.GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, + glCopyImageSubData(rctx->render_buffer.GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, rt->GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, fbo.width, fbo.height, 1); } void Transparency::copy(GLuint texture) { - glCopyImageSubData( - texture, GL_TEXTURE_2D, 0, 0, 0, 0, + glCopyImageSubData(texture, GL_TEXTURE_2D, 0, 0, 0, 0, fbo.textures[0], GL_TEXTURE_2D, 0, 0, 0, 0, fbo.width, fbo.height, 1); fbo.bind_buffer(); - glViewportDLL(0, 0, fbo.width, fbo.height); + gl_state_set_viewport(0, 0, fbo.width, fbo.height); } void Transparency::resize(GLuint color_texture, GLuint depth_texture, int32_t width, int32_t height) { @@ -71,41 +71,4 @@ namespace renderer { color_textures[0] = color_texture; fbo.init(width, height, color_textures, 1, depth_texture); } - - void renderer::Transparency::load_shaders() { - GLProgram::ShaderData shader_data[2]; - - shader_data[0].type = GL_VERTEX_SHADER; - shader_data[0].string = - u8"#version 430\n" - u8"out VertexData{\n" - u8" vec2 texcoord;\n" - u8"}result;\n" - u8"void main(){\n" - u8" gl_Position.x = -1.f + (gl_VertexID / 2) * 4;\n" - u8" gl_Position.y = 1.f - (gl_VertexID % 2) * 4;\n" - u8" gl_Position.z = 0.f;\n" - u8" gl_Position.w = 1.f;\n" - u8" result.texcoord = gl_Position.xy * 0.5f + 0.5f;\n" - u8"}\n"; - shader_data[0].length = 273; - - shader_data[1].type = GL_FRAGMENT_SHADER; - shader_data[1].string = - u8"#version 430\n" - u8"layout(binding = 0) uniform sampler2D g_layerd_color;\n" - u8"layout(binding = 1) uniform sampler2D g_base_color;\n" - u8"layout(location = 0) uniform vec4 g_opacity;//x=opacity, yzw=unused\n" - u8"in VertexData{\n" - u8" vec2 texcoord;\n" - u8"}frg;\n" - u8"layout(location = 0) out vec4 result;\n" - u8"void main(){\n" - u8" vec4 cl = textureLod(g_layerd_color, frg.texcoord, 0.f);\n" - u8" vec4 cb = textureLod(g_base_color, frg.texcoord, 0.f);\n" - u8" result.rgba = mix(cb, cl, g_opacity.x);\n" - u8"};\n"; - shader_data[1].length = 445; - program.compile_program(shader_data, 2); - } } diff --git a/src/DivaGL/renderer/transparency.hpp b/src/DivaGL/renderer/transparency.hpp index 0bac999..41956b2 100644 --- a/src/DivaGL/renderer/transparency.hpp +++ b/src/DivaGL/renderer/transparency.hpp @@ -9,13 +9,12 @@ #include "../../KKdLib/vec.hpp" #include "../render_texture.hpp" #include "fbo.hpp" -#include "gl_program.hpp" namespace renderer { struct Transparency { private: FBO fbo; - GLProgram program; + GLuint program; // Unused GLuint sampler; GLuint vao; @@ -27,9 +26,6 @@ namespace renderer { void copy(GLuint texture); void resize(GLuint color_texture, GLuint depth_texture, int32_t width, int32_t height); - - private: - void load_shaders(); }; static_assert(sizeof(renderer::Transparency) == 0x30, "\"renderer::Transparency\" struct should have a size of 0x30"); diff --git a/src/DivaGL/screen_shot.cpp b/src/DivaGL/screen_shot.cpp index b6a8656..a78e054 100644 --- a/src/DivaGL/screen_shot.cpp +++ b/src/DivaGL/screen_shot.cpp @@ -101,7 +101,7 @@ HOOK(void, FASTCALL, ScreenShotImpl__get_data, 0x0000000140557F50, ScreenShotImp gl_state_disable_depth_test(); gl_state_disable_blend(); gl_state_disable_cull_face(); - glViewportDLL(0, 0, impl->curr_width, impl->curr_height); + gl_state_set_viewport(0, 0, impl->curr_width, impl->curr_height); shaders_ft.set(SHADER_FT_REDUCE); gl_state_bind_vertex_array(rctx->common_vao); diff --git a/src/DivaGL/shader.hpp b/src/DivaGL/shader.hpp index cf2cae2..588515a 100644 --- a/src/DivaGL/shader.hpp +++ b/src/DivaGL/shader.hpp @@ -14,8 +14,6 @@ #include "gl.hpp" #include "uniform.hpp" -#define SHADER_MAX_UNIFORM_VALUES 16 - struct shader_sub_table { uint32_t sub_index; const int32_t* vp_unival_max; diff --git a/src/DivaGL/shader_ft.cpp b/src/DivaGL/shader_ft.cpp index 13fda6a..5f593ad 100644 --- a/src/DivaGL/shader_ft.cpp +++ b/src/DivaGL/shader_ft.cpp @@ -85,22 +85,28 @@ enum shader_ft_sub_enum { SHADER_FT_SUB_BOX8, SHADER_FT_SUB_COPY, SHADER_FT_SUB_SPRITE, + SHADER_FT_SUB_DOF_RENDER_TILE, + SHADER_FT_SUB_DOF_GATHER_TILE, + SHADER_FT_SUB_DOF_DOWNSAMPLE, + SHADER_FT_SUB_DOF_MAIN_FILTER, + SHADER_FT_SUB_DOF_UPSAMPLE, + SHADER_FT_SUB_TRANSPARENCY, SHADER_FT_SUB_SHADER_END, }; -static const int32_t blinn_vert_vpt_unival_max[] = { +static const int32_t blinn_per_vert_vpt_unival_max[] = { 1, 1, 0, }; -static const int32_t blinn_vert_fpt_unival_max[] = { +static const int32_t blinn_per_vert_fpt_unival_max[] = { 0, 0, 1, }; -static const int32_t blinn_frag_vpt_unival_max[] = { +static const int32_t blinn_per_frag_vpt_unival_max[] = { 1, 1, 0, }; -static const int32_t blinn_frag_fpt_unival_max[] = { +static const int32_t blinn_per_frag_fpt_unival_max[] = { 0, 0, 1, }; @@ -664,662 +670,280 @@ static const int32_t sprite_fpt_unival_max[] = { 3, 3, 2, }; +static const int32_t dof_common_vpt_unival_max[] = { + 0, +}; + +static const int32_t dof_render_tile_fpt_unival_max[] = { + 1, +}; + +static const int32_t dof_gather_tile_fpt_unival_max[] = { + 0, +}; + +static const int32_t dof_downsample_fpt_unival_max[] = { + 1, +}; + +static const int32_t dof_main_filter_fpt_unival_max[] = { + 1, +}; + +static const int32_t dof_upsample_fpt_unival_max[] = { + 1, +}; + +static const int32_t transparency_vpt_unival_max[] = { + -1, +}; + +static const int32_t transparency_fpt_unival_max[] = { + -1, +}; + +#define shader_sub_table_struct(sub_index, vp, fp) \ +{ \ + SHADER_FT_SUB_##sub_index, \ + vp##_vpt_unival_max, \ + fp##_fpt_unival_max, \ + #vp, \ + #fp, \ +} + static const shader_sub_table BLINN_table[] = { - { - SHADER_FT_SUB_BLINN_VERT, - blinn_vert_vpt_unival_max, - blinn_vert_fpt_unival_max, - "blinn_per_vert", - "blinn_per_vert", - }, - { - SHADER_FT_SUB_BLINN_FRAG, - blinn_frag_vpt_unival_max, - blinn_frag_fpt_unival_max, - "blinn_per_frag", - "blinn_per_frag", - }, + shader_sub_table_struct(BLINN_VERT, blinn_per_vert, blinn_per_vert), + shader_sub_table_struct(BLINN_FRAG, blinn_per_frag, blinn_per_frag), }; static const shader_sub_table ITEM_table[] = { - { - SHADER_FT_SUB_ITEM_BLINN, - item_blinn_vpt_unival_max, - item_blinn_fpt_unival_max, - "item_blinn", - "item_blinn", - }, + shader_sub_table_struct(BLINN_VERT, item_blinn, item_blinn), }; static const shader_sub_table STAGE_table[] = { - { - SHADER_FT_SUB_STAGE_BLINN, - stage_blinn_vpt_unival_max, - stage_blinn_fpt_unival_max, - "stage_blinn", - "stage_blinn", - }, + shader_sub_table_struct(STAGE_BLINN, stage_blinn, stage_blinn), }; static const shader_sub_table SKIN_table[] = { - { - SHADER_FT_SUB_SKIN_DEFAULT, - skin_default_vpt_unival_max, - skin_default_fpt_unival_max, - "skin_default", - "skin_default", - }, + shader_sub_table_struct(SKIN_DEFAULT, skin_default, skin_default), }; static const shader_sub_table SSS_SKIN_table[] = { - { - SHADER_FT_SUB_SSS_SKIN, - sss_skin_vpt_unival_max, - sss_skin_fpt_unival_max, - "sss_skin", - "sss_skin", - }, + shader_sub_table_struct(SSS_SKIN, sss_skin, sss_skin), }; static const shader_sub_table SSS_FILT_table[] = { - { - SHADER_FT_SUB_SSS_FILTER_MIN, - sss_filter_min_vpt_unival_max, - sss_filter_min_fpt_unival_max, - "sss_filter_min", - "sss_filter_min", - }, - { - SHADER_FT_SUB_SSS_FILTER_MIN_NPR, - sss_filter_min_vpt_unival_max, - sss_filter_min_npr_fpt_unival_max, - "sss_filter_min", - "sss_filter_min_npr", - }, - { - SHADER_FT_SUB_SSS_FILTER_GAUSS_2D, - sss_filter_gauss_2d_vpt_unival_max, - sss_filter_gauss_2d_fpt_unival_max, - "sss_filter_gauss_2d", - "sss_filter_gauss_2d", - }, + shader_sub_table_struct(SSS_FILTER_MIN, sss_filter_min, sss_filter_min), + shader_sub_table_struct(SSS_FILTER_MIN_NPR, sss_filter_min, sss_filter_min_npr), + shader_sub_table_struct(SSS_FILTER_GAUSS_2D, sss_filter_gauss_2d, sss_filter_gauss_2d), }; static const shader_sub_table HAIR_table[] = { - { - SHADER_FT_SUB_HAIR_DEFAULT, - hair_default_vpt_unival_max, - hair_default_fpt_unival_max, - "hair_default", - "hair_default", - }, - { - SHADER_FT_SUB_HAIR_NPR1, - hair_default_vpt_unival_max, - hair_npr1_fpt_unival_max, - "hair_default", - "hair_npr1", - }, + shader_sub_table_struct(HAIR_DEFAULT, hair_default, hair_default), + shader_sub_table_struct(HAIR_NPR1, hair_default, hair_npr1), }; static const shader_sub_table CLOTH_table[] = { - { - SHADER_FT_SUB_CLOTH_DEFAULT, - cloth_default_vpt_unival_max, - cloth_default_fpt_unival_max, - "cloth_default", - "cloth_default", - }, - { - SHADER_FT_SUB_CLOTH_ANISO, - cloth_default_vpt_unival_max, - cloth_aniso_fpt_unival_max, - "cloth_default", - "cloth_aniso", - }, - { - SHADER_FT_SUB_CLOTH_NPR1, - cloth_default_vpt_unival_max, - cloth_npr1_fpt_unival_max, - "cloth_default", - "cloth_npr1", - }, + shader_sub_table_struct(CLOTH_DEFAULT, cloth_default, cloth_default), + shader_sub_table_struct(CLOTH_ANISO, cloth_default, cloth_aniso), + shader_sub_table_struct(CLOTH_NPR1, cloth_default, cloth_npr1), }; static const shader_sub_table TIGHTS_table[] = { - { - SHADER_FT_SUB_TIGHTS, - tights_vpt_unival_max, - tights_fpt_unival_max, - "tights", - "tights", - }, + shader_sub_table_struct(TIGHTS, tights, tights), }; static const shader_sub_table SKY_table[] = { - { - SHADER_FT_SUB_SKY_DEFAULT, - sky_default_vpt_unival_max, - sky_default_fpt_unival_max, - "sky_default", - "sky_default", - }, + shader_sub_table_struct(SKY_DEFAULT, sky_default, sky_default), }; static const shader_sub_table GLASEYE_table[] = { - { - SHADER_FT_SUB_GLASS_EYE, - glass_eye_vpt_unival_max, - glass_eye_fpt_unival_max, - "glass_eye", - "glass_eye", - }, + shader_sub_table_struct(GLASS_EYE, glass_eye, glass_eye), }; static const shader_sub_table ESMGAUSS_table[] = { - { - SHADER_FT_SUB_ESM_GAUSS, - esm_gauss_vpt_unival_max, - esm_gauss_fpt_unival_max, - "esm_gauss", - "esm_gauss", - }, + shader_sub_table_struct(ESM_GAUSS, esm_gauss, esm_gauss), }; static const shader_sub_table ESMFILT_table[] = { - { - SHADER_FT_SUB_ESM_FILTER_MIN, - esm_filter_min_vpt_unival_max, - esm_filter_min_fpt_unival_max, - "esm_filter_min", - "esm_filter_min", - }, - { - SHADER_FT_SUB_ESM_FILTER_EROSION, - esm_filter_erosion_vpt_unival_max, - esm_filter_erosion_fpt_unival_max, - "esm_filter_erosion", - "esm_filter_erosion", - }, + shader_sub_table_struct(ESM_FILTER_MIN, esm_filter_min, esm_filter_min), + shader_sub_table_struct(ESM_FILTER_EROSION, esm_filter_erosion, esm_filter_erosion), }; static const shader_sub_table LITPROJ_table[] = { - { - SHADER_FT_SUB_LIT_PROJ, - lit_proj_vpt_unival_max, - lit_proj_fpt_unival_max, - "lit_proj", - "lit_proj", - }, + shader_sub_table_struct(LIT_PROJ, lit_proj, lit_proj), }; static const shader_sub_table SIMPLE_table[] = { - { - SHADER_FT_SUB_SIMPLE, - simple_vpt_unival_max, - simple_fpt_unival_max, - "simple", - "simple", - }, + shader_sub_table_struct(SIMPLE, simple, simple), }; static const shader_sub_table SIL_table[] = { - { - SHADER_FT_SUB_SILHOUETTE, - silhouette_vpt_unival_max, - silhouette_fpt_unival_max, - "silhouette", - "silhouette", - }, + shader_sub_table_struct(SILHOUETTE, silhouette, silhouette), }; static const shader_sub_table LAMBERT_table[] = { - { - SHADER_FT_SUB_LAMBERT, - lambert_vpt_unival_max, - lambert_fpt_unival_max, - "lambert", - "lambert", - }, + shader_sub_table_struct(LAMBERT, lambert, lambert), }; static const shader_sub_table CONSTANT_table[] = { - { - SHADER_FT_SUB_CONSTANT, - constant_vpt_unival_max, - constant_fpt_unival_max, - "constant", - "constant", - }, + shader_sub_table_struct(CONSTANT, constant, constant), }; static const shader_sub_table TONEMAP_table[] = { - { - SHADER_FT_SUB_TONEMAP, - tone_map_vpt_unival_max, - tone_map_fpt_unival_max, - "tone_map", - "tone_map", - }, - { - SHADER_FT_SUB_TONEMAP_NPR1, - tone_map_npr1_vpt_unival_max, - tone_map_npr1_fpt_unival_max, - "tone_map_npr1", - "tone_map_npr1", - }, + shader_sub_table_struct(TONEMAP, tone_map, tone_map), + shader_sub_table_struct(TONEMAP_NPR1, tone_map_npr1, tone_map_npr1), }; static const shader_sub_table REDUCE_table[] = { - { - SHADER_FT_SUB_REDUCE_TEX_REDUCE_2, - reduce_tex_reduce_2_vpt_unival_max, - reduce_tex_reduce_2_fpt_unival_max, - "reduce_tex_reduce_2", - "reduce_tex_reduce_2", - }, - { - SHADER_FT_SUB_REDUCE_TEX_REDUCE_2_ALPHAMASK, - reduce_tex_reduce_2_alphamask_vpt_unival_max, - reduce_tex_reduce_2_alphamask_fpt_unival_max, - "reduce_tex_reduce_2_alphamask", - "reduce_tex_reduce_2_alphamask", - }, - { - SHADER_FT_SUB_REDUCE_TEX_REDUCE_4, - reduce_tex_reduce_4_vpt_unival_max, - reduce_tex_reduce_4_fpt_unival_max, - "reduce_tex_reduce_4", - "reduce_tex_reduce_4", - }, - { - SHADER_FT_SUB_REDUCE_TEX_REDUCE_4_EXTRACT, - reduce_tex_reduce_4_extract_vpt_unival_max, - reduce_tex_reduce_4_extract_fpt_unival_max, - "reduce_tex_reduce_4_extract", - "reduce_tex_reduce_4_extract", - }, - { - SHADER_FT_SUB_GHOST, - ghost_vpt_unival_max, - ghost_fpt_unival_max, - "ghost", - "ghost", - }, - { - SHADER_FT_SUB_REDUCE_TEX_REDUCE_COMPOSITE_2, - reduce_tex_reduce_composite_2_vpt_unival_max, - reduce_tex_reduce_composite_2_fpt_unival_max, - "reduce_tex_reduce_composite_2", - "reduce_tex_reduce_composite_2", - }, - { - SHADER_FT_SUB_REDUCE_TEX_REDUCE_COMPOSITE_BLUR, - reduce_tex_reduce_composite_blur_vpt_unival_max, - reduce_tex_reduce_composite_blur_fpt_unival_max, - "reduce_tex_reduce_composite_blur", - "reduce_tex_reduce_composite_blur", - }, - { - SHADER_FT_SUB_REDUCE_TEX_REDUCE_COMPOSITE_4, - reduce_tex_reduce_composite_4_vpt_unival_max, - reduce_tex_reduce_composite_4_fpt_unival_max, - "reduce_tex_reduce_composite_4", - "reduce_tex_reduce_composite_4", - }, + shader_sub_table_struct(REDUCE_TEX_REDUCE_2, + reduce_tex_reduce_2, reduce_tex_reduce_2), + shader_sub_table_struct(REDUCE_TEX_REDUCE_2_ALPHAMASK, + reduce_tex_reduce_2_alphamask, reduce_tex_reduce_2_alphamask), + shader_sub_table_struct(REDUCE_TEX_REDUCE_4, + reduce_tex_reduce_4, reduce_tex_reduce_4), + shader_sub_table_struct(REDUCE_TEX_REDUCE_4_EXTRACT, + reduce_tex_reduce_4_extract, reduce_tex_reduce_4_extract), + shader_sub_table_struct(GHOST, ghost, ghost), + shader_sub_table_struct(REDUCE_TEX_REDUCE_COMPOSITE_2, + reduce_tex_reduce_composite_2, reduce_tex_reduce_composite_2), + shader_sub_table_struct(REDUCE_TEX_REDUCE_COMPOSITE_BLUR, + reduce_tex_reduce_composite_blur, reduce_tex_reduce_composite_blur), + shader_sub_table_struct(REDUCE_TEX_REDUCE_COMPOSITE_4, + reduce_tex_reduce_composite_4, reduce_tex_reduce_composite_4), }; static const shader_sub_table MAGNIFY_table[] = { - { - SHADER_FT_SUB_MAGNIFY_LINEAR, - magnify_linear_vpt_unival_max, - magnify_linear_fpt_unival_max, - "magnify_linear", - "magnify_linear", - }, - { - SHADER_FT_SUB_MAGNIFY_DIFF, - magnify_diff_vpt_unival_max, - magnify_diff_fpt_unival_max, - "magnify_diff", - "magnify_diff", - }, - { - SHADER_FT_SUB_MAGNIFY_DIFF2, - magnify_diff2_vpt_unival_max, - magnify_diff2_fpt_unival_max, - "magnify_diff2", - "magnify_diff2", - }, - { - SHADER_FT_SUB_MAGNIFY_CONE, - magnify_cone_vpt_unival_max, - magnify_cone_fpt_unival_max, - "magnify_cone", - "magnify_cone", - }, - { - SHADER_FT_SUB_MAGNIFY_CONE2, - magnify_cone2_vpt_unival_max, - magnify_cone2_fpt_unival_max, - "magnify_cone2", - "magnify_cone2", - }, + shader_sub_table_struct(MAGNIFY_LINEAR, magnify_linear, magnify_linear), + shader_sub_table_struct(MAGNIFY_DIFF, magnify_diff, magnify_diff), + shader_sub_table_struct(MAGNIFY_DIFF2, magnify_diff2, magnify_diff2), + shader_sub_table_struct(MAGNIFY_CONE, magnify_cone, magnify_cone), + shader_sub_table_struct(MAGNIFY_CONE2, magnify_cone2, magnify_cone2), }; static const shader_sub_table MLAA_table[] = { - { - SHADER_FT_SUB_MLAA_EDGE, - mlaa_edge_vpt_unival_max, - mlaa_edge_fpt_unival_max, - "mlaa_edge", - "mlaa_edge", - }, - { - SHADER_FT_SUB_MLAA_AREA, - mlaa_area_vpt_unival_max, - mlaa_area_fpt_unival_max, - "mlaa_area", - "mlaa_area", - }, - { - SHADER_FT_SUB_MLAA_BLEND, - mlaa_blend_vpt_unival_max, - mlaa_blend_fpt_unival_max, - "mlaa_blend", - "mlaa_blend", - }, + shader_sub_table_struct(MLAA_EDGE, mlaa_edge, mlaa_edge), + shader_sub_table_struct(MLAA_AREA, mlaa_area, mlaa_area), + shader_sub_table_struct(MLAA_BLEND, mlaa_blend, mlaa_blend), }; static const shader_sub_table CONTOUR_table[] = { - { - SHADER_FT_SUB_CONTOUR, - contour_vpt_unival_max, - contour_fpt_unival_max, - "contour", - "contour", - }, + shader_sub_table_struct(CONTOUR, contour, contour), }; static const shader_sub_table CONTOUR_NPR_table[] = { - { - SHADER_FT_SUB_CONTOUR_NPR, - contour_npr_vpt_unival_max, - contour_npr_fpt_unival_max, - "contour_npr", - "contour_npr", - }, + shader_sub_table_struct(CONTOUR_NPR, contour_npr, contour_npr), }; static const shader_sub_table EXPOSURE_table[] = { - { - SHADER_FT_SUB_EXPOSURE_MINIFY, - exposure_minify_vpt_unival_max, - exposure_minify_fpt_unival_max, - "exposure_minify", - "exposure_minify", - }, - { - SHADER_FT_SUB_EXPOSURE_MEASURE, - exposure_measure_vpt_unival_max, - exposure_measure_fpt_unival_max, - "exposure_measure", - "exposure_measure", - }, - { - SHADER_FT_SUB_EXPOSURE_AVERAGE, - exposure_average_vpt_unival_max, - exposure_average_fpt_unival_max, - "exposure_average", - "exposure_average", - }, + shader_sub_table_struct(EXPOSURE_MINIFY, exposure_minify, exposure_minify), + shader_sub_table_struct(EXPOSURE_MEASURE, exposure_measure, exposure_measure), + shader_sub_table_struct(EXPOSURE_AVERAGE, exposure_average, exposure_average), }; static const shader_sub_table GAUSS_table[] = { - { - SHADER_FT_SUB_PP_GAUSS_USUAL, - pp_gauss_usual_vpt_unival_max, - pp_gauss_usual_fpt_unival_max, - "pp_gauss_usual", - "pp_gauss_usual", - }, - { - SHADER_FT_SUB_PP_GAUSS_CONE, - pp_gauss_cone_vpt_unival_max, - pp_gauss_cone_fpt_unival_max, - "pp_gauss_cone", - "pp_gauss_cone", - }, + shader_sub_table_struct(PP_GAUSS_USUAL, pp_gauss_usual, pp_gauss_usual), + shader_sub_table_struct(PP_GAUSS_CONE, pp_gauss_cone, pp_gauss_cone), }; static const shader_sub_table SUN_table[] = { - { - SHADER_FT_SUB_SUN, - sun_vpt_unival_max, - sun_fpt_unival_max, - "sun", - "sun", - }, + shader_sub_table_struct(SUN, sun, sun), }; static const shader_sub_table SUN_NO_TEXTURED_table[] = { - { - SHADER_FT_SUB_SUN_NO_TEXTURED, - sun_no_textured_vpt_unival_max, - sun_no_textured_fpt_unival_max, - "sun_no_textured", - "sun_no_textured", - }, + shader_sub_table_struct(SUN_NO_TEXTURED, sun_no_textured, sun_no_textured), }; static const shader_sub_table WATER01_table[] = { - { - SHADER_FT_SUB_WATER01, - water01_vpt_unival_max, - water01_fpt_unival_max, - "water01", - "water01", - }, + shader_sub_table_struct(WATER01, water01, water01), }; static const shader_sub_table W_PTCL_table[] = { - { - SHADER_FT_SUB_WATER_PARTICLE, - water_particle_vpt_unival_max, - water_particle_fpt_unival_max, - "water_particle", - "water_particle", - }, + shader_sub_table_struct(WATER_PARTICLE, water_particle, water_particle), }; static const shader_sub_table SNOW_PT_table[] = { - { - SHADER_FT_SUB_SNOW_PARTICLE, - snow_particle_vpt_unival_max, - snow_particle_fpt_unival_max, - "snow_particle", - "snow_particle", - }, - { - SHADER_FT_SUB_SNOW_PARTICLE_CPU, - snow_particle_cpu_vpt_unival_max, - snow_particle_cpu_fpt_unival_max, - "snow_particle_cpu", - "snow_particle_cpu", - }, + shader_sub_table_struct(SNOW_PARTICLE, snow_particle, snow_particle), + shader_sub_table_struct(SNOW_PARTICLE_CPU, snow_particle_cpu, snow_particle_cpu), }; static const shader_sub_table LEAF_PT_table[] = { - { - SHADER_FT_SUB_LEAF_PARTICLE, - leaf_particle_vpt_unival_max, - leaf_particle_fpt_unival_max, - "leaf_particle", - "leaf_particle", - }, + shader_sub_table_struct(LEAF_PARTICLE, leaf_particle, leaf_particle), }; static const shader_sub_table STAR_table[] = { - { - SHADER_FT_SUB_STAR, - star_vpt_unival_max, - star_fpt_unival_max, - "star", - "star", - }, - { - SHADER_FT_SUB_STAR_MILKY_WAY, - star_milky_way_vpt_unival_max, - star_milky_way_fpt_unival_max, - "star_milky_way", - "star_milky_way", - }, + shader_sub_table_struct(STAR, star, star), + shader_sub_table_struct(STAR_MILKY_WAY, star_milky_way, star_milky_way), }; static const shader_sub_table FLOOR_table[] = { - { - SHADER_FT_SUB_FLOOR, - floor_vpt_unival_max, - floor_fpt_unival_max, - "floor", - "floor", - }, + shader_sub_table_struct(FLOOR, floor, floor), }; static const shader_sub_table PUDDLE_table[] = { - { - SHADER_FT_SUB_PUDDLE, - puddle_vpt_unival_max, - puddle_fpt_unival_max, - "puddle", - "puddle", - }, + shader_sub_table_struct(PUDDLE, puddle, puddle), }; static const shader_sub_table S_REFL_table[] = { - { - SHADER_FT_SUB_SIMPLE_REFLECT, - simple_reflect_vpt_unival_max, - simple_reflect_fpt_unival_max, - "simple_reflect", - "simple_reflect", - }, + shader_sub_table_struct(SIMPLE_REFLECT, simple_reflect, simple_reflect), }; static const shader_sub_table S_REFR_table[] = { - { - SHADER_FT_SUB_SIMPLE_REFRACT, - simple_refract_vpt_unival_max, - simple_refract_fpt_unival_max, - "simple_refract", - "simple_refract", - }, + shader_sub_table_struct(SIMPLE_REFRACT, simple_refract, simple_refract), }; static const shader_sub_table RIPEMIT_table[] = { - { - SHADER_FT_SUB_RIPPLE_EMIT, - ripple_emit_vpt_unival_max, - ripple_emit_fpt_unival_max, - "ripple_emit", - "ripple_emit", - }, + shader_sub_table_struct(RIPPLE_EMIT, ripple_emit, ripple_emit), }; static const shader_sub_table RAIN_table[] = { - { - SHADER_FT_SUB_RAIN, - rain_vpt_unival_max, - rain_fpt_unival_max, - "rain", - "rain", - }, + shader_sub_table_struct(RAIN, rain, rain), }; static const shader_sub_table RIPPLE_table[] = { - { - SHADER_FT_SUB_RIPPLE, - ripple_vpt_unival_max, - ripple_fpt_unival_max, - "ripple", - "ripple", - }, + shader_sub_table_struct(RIPPLE, ripple, ripple), }; static const shader_sub_table FOGPTCL_table[] = { - { - SHADER_FT_SUB_FOG_PTCL, - fog_ptcl_vpt_unival_max, - fog_ptcl_fpt_unival_max, - "fog_ptcl", - "fog_ptcl", - }, + shader_sub_table_struct(FOG_PTCL, fog_ptcl, fog_ptcl), }; static const shader_sub_table PARTICL_table[] = { - { - SHADER_FT_SUB_PARTICLE, - particle_vpt_unival_max, - particle_fpt_unival_max, - "particle", - "particle", - }, + shader_sub_table_struct(PARTICLE, particle, particle), }; static const shader_sub_table GLITTER_PT_table[] = { - { - SHADER_FT_SUB_GLITTER_PARTICLE, - glitter_particle_vpt_unival_max, - glitter_particle_fpt_unival_max, - "glitter_particle", - "glitter_particle", - }, + shader_sub_table_struct(GLITTER_PARTICLE, glitter_particle, glitter_particle), }; static const shader_sub_table FONT_table[] = { - { - SHADER_FT_SUB_FONT, - font_vpt_unival_max, - font_fpt_unival_max, - "font", - "font", - }, + shader_sub_table_struct(FONT, font, font), }; static const shader_sub_table IMGFILT_table[] = { - { - SHADER_FT_SUB_BOX4, - box4_vpt_unival_max, - box4_fpt_unival_max, - "box4", - "box4", - }, - { - SHADER_FT_SUB_BOX8, - box8_vpt_unival_max, - box8_fpt_unival_max, - "box8", - "box8", - }, - { - SHADER_FT_SUB_COPY, - copy_vpt_unival_max, - copy_fpt_unival_max, - "copy", - "copy", - }, + shader_sub_table_struct(BOX4, box4, box4), + shader_sub_table_struct(BOX8, box8, box8), + shader_sub_table_struct(COPY, copy, copy), }; static const shader_sub_table SPRITE_table[] = { - { - SHADER_FT_SUB_SPRITE, - sprite_vpt_unival_max, - sprite_fpt_unival_max, - "sprite", - "sprite", - }, + shader_sub_table_struct(SPRITE, sprite, sprite), }; +static const shader_sub_table DOF_table[] = { + shader_sub_table_struct(DOF_RENDER_TILE, dof_common, dof_render_tile), + shader_sub_table_struct(DOF_GATHER_TILE, dof_common, dof_gather_tile), + shader_sub_table_struct(DOF_DOWNSAMPLE, dof_common, dof_downsample), + shader_sub_table_struct(DOF_MAIN_FILTER, dof_common, dof_main_filter), + shader_sub_table_struct(DOF_UPSAMPLE, dof_common, dof_upsample), +}; + +static const shader_sub_table TRANSPARENCY_table[] = { + shader_sub_table_struct(TRANSPARENCY, transparency, transparency), +}; + +#undef shader_sub_table_struct + static const uniform_name BLINN_uniform[] = { U_SKINNING, U_MORPH, @@ -1530,6 +1154,14 @@ static const uniform_name SPRITE_uniform[] = { U_COMBINER, }; +static const uniform_name DOF_uniform[] = { + U_DOF, +}; + +static const uniform_name TRANSPARENCY_uniform[] = { + U_INVALID, +}; + struct glass_eye_struct { vec4 field_0; vec4 field_10; @@ -1624,6 +1256,8 @@ const shader_table shader_ft_table[] = { shader_table_struct(FONT), shader_table_struct(IMGFILT), shader_table_struct(SPRITE), + shader_table_struct(DOF), + shader_table_struct(TRANSPARENCY), }; #undef shader_table_struct @@ -1648,6 +1282,7 @@ static void shader_bind_gauss(shader_set_data* set, shader* shad); static void shader_bind_snow_particle(shader_set_data* set, shader* shad); static void shader_bind_star(shader_set_data* set, shader* shad); static void shader_bind_imgfilter(shader_set_data* set, shader* shad); +static void shader_bind_dof(shader_set_data* set, shader* shad); const shader_bind_func shader_ft_bind_func_table[] = { { @@ -1710,6 +1345,10 @@ const shader_bind_func shader_ft_bind_func_table[] = { SHADER_FT_IMGFILT, shader_bind_imgfilter, }, + { + SHADER_FT_DOF, + shader_bind_dof, + }, }; const size_t shader_ft_bind_func_table_size = @@ -2044,3 +1683,23 @@ static void shader_bind_imgfilter(shader_set_data* set, shader* shad) { break; } } + +static void shader_bind_dof(shader_set_data* set, shader* shad) { + switch (uniform->arr[U_DOF_STAGE]) { + case 0: + shad->bind(set, SHADER_FT_SUB_DOF_RENDER_TILE); + break; + case 1: + shad->bind(set, SHADER_FT_SUB_DOF_GATHER_TILE); + break; + case 2: + shad->bind(set, SHADER_FT_SUB_DOF_DOWNSAMPLE); + break; + case 3: + shad->bind(set, SHADER_FT_SUB_DOF_MAIN_FILTER); + break; + case 4: + shad->bind(set, SHADER_FT_SUB_DOF_UPSAMPLE); + break; + } +} diff --git a/src/DivaGL/shader_ft.hpp b/src/DivaGL/shader_ft.hpp index 53ddc00..e9643b1 100644 --- a/src/DivaGL/shader_ft.hpp +++ b/src/DivaGL/shader_ft.hpp @@ -56,6 +56,8 @@ enum shader_ft_enum { SHADER_FT_FONT, SHADER_FT_IMGFILT, SHADER_FT_SPRITE, + SHADER_FT_DOF, + SHADER_FT_TRANSPARENCY, SHADER_FT_END, SHADER_FT_MAX, }; diff --git a/src/DivaGL/sprite.cpp b/src/DivaGL/sprite.cpp index b535977..58b5354 100644 --- a/src/DivaGL/sprite.cpp +++ b/src/DivaGL/sprite.cpp @@ -472,8 +472,7 @@ namespace spr { if (index == 2 && resolution_mode != RESOLUTION_MODE_MAX) res_window_get()->resolution_mode = resolution_mode; - GLint v43[4]; - glGetIntegervDLL(GL_VIEWPORT, v43); + gl_state_rect viewport_rect = gl_state_get_viewport(); for (int32_t i = 0; i < 2; i++) { auto reqlist = this->reqlist[index][i]; @@ -520,15 +519,15 @@ namespace spr { y_min = (int32_t)min.y; x_max = (int32_t)(max.x - min.x); y_max = (int32_t)(max.y - min.y); - glViewportDLL(x_min, y_min, x_max, y_max); + gl_state_set_viewport(x_min, y_min, x_max, y_max); } else { view_projection = view_projection_aet; - x_min = v43[0]; - y_min = v43[1]; - x_max = v43[2]; - y_max = v43[3]; + x_min = viewport_rect.x; + y_min = viewport_rect.y; + x_max = viewport_rect.width; + y_max = viewport_rect.height; } float_t v23 = (float_t)x_max * 0.5f; diff --git a/src/DivaGL/uniform.hpp b/src/DivaGL/uniform.hpp index 33f80bf..95cb425 100644 --- a/src/DivaGL/uniform.hpp +++ b/src/DivaGL/uniform.hpp @@ -80,6 +80,9 @@ enum uniform_name { U45 = 0x45, U_MAX = 0x46, U_INVALID = 0xFFFFFFFF, + + U_DOF = U_TEX_0_TYPE, + U_DOF_STAGE = U_TEX_1_TYPE, }; struct uniform_value {