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 {