From e3051f90aebc216df25a506aa1018b653d5b5f90 Mon Sep 17 00:00:00 2001 From: ManDude <7569514+ManDude@users.noreply.github.com> Date: Wed, 1 Jun 2022 23:34:19 +0100 Subject: [PATCH] small shader optimizations (#1402) * small shader optimizations * revert camera invert --- .../opengl_renderer/DirectRenderer.cpp | 4 +- .../opengl_renderer/DirectRenderer2.cpp | 5 +- game/graphics/opengl_renderer/Sprite3.cpp | 50 +++++++------------ .../opengl_renderer/background/Shrub.cpp | 2 +- .../opengl_renderer/background/Tie3.cpp | 1 + .../background/background_common.cpp | 29 +++++------ .../foreground/Generic2_OpenGL.cpp | 10 ++-- .../opengl_renderer/foreground/Merc2.cpp | 5 +- .../ocean/CommonOceanRenderer.cpp | 10 ++-- .../opengl_renderer/shaders/direct2.frag | 2 +- .../opengl_renderer/shaders/direct2.vert | 2 +- .../shaders/direct_basic_textured.frag | 2 +- .../shaders/direct_basic_textured.vert | 2 +- .../opengl_renderer/shaders/generic.frag | 4 +- .../opengl_renderer/shaders/generic.vert | 9 ++-- .../opengl_renderer/shaders/merc2.frag | 4 +- .../opengl_renderer/shaders/merc2.vert | 9 ++-- .../opengl_renderer/shaders/ocean_common.frag | 18 ++----- .../opengl_renderer/shaders/ocean_common.vert | 18 +++++-- .../shaders/ocean_texture.frag | 3 +- .../shaders/ocean_texture.vert | 2 +- .../opengl_renderer/shaders/shrub.frag | 11 ++-- .../opengl_renderer/shaders/shrub.vert | 36 ++++++------- .../opengl_renderer/shaders/sprite3_3d.frag | 8 +-- .../opengl_renderer/shaders/sprite3_3d.vert | 18 +++---- .../opengl_renderer/shaders/tfrag3.frag | 10 ++-- .../opengl_renderer/shaders/tfrag3.vert | 36 ++++++------- .../shaders/tfrag3_no_tex.vert | 28 ++++------- 28 files changed, 144 insertions(+), 194 deletions(-) diff --git a/game/graphics/opengl_renderer/DirectRenderer.cpp b/game/graphics/opengl_renderer/DirectRenderer.cpp index 04cc45885..755263238 100644 --- a/game/graphics/opengl_renderer/DirectRenderer.cpp +++ b/game/graphics/opengl_renderer/DirectRenderer.cpp @@ -269,8 +269,8 @@ void DirectRenderer::update_gl_prim(SharedRenderState* render_state) { m_ogl.alpha_mult); glUniform4f(glGetUniformLocation(render_state->shaders[ShaderId::DIRECT_BASIC_TEXTURED].id(), "fog_color"), - render_state->fog_color[0], render_state->fog_color[1], render_state->fog_color[2], - render_state->fog_intensity); + render_state->fog_color[0] / 255.f, render_state->fog_color[1] / 255.f, + render_state->fog_color[2] / 255.f, render_state->fog_intensity / 255); } else { render_state->shaders[ShaderId::DIRECT_BASIC].activate(); diff --git a/game/graphics/opengl_renderer/DirectRenderer2.cpp b/game/graphics/opengl_renderer/DirectRenderer2.cpp index c535eb177..3784d92b5 100644 --- a/game/graphics/opengl_renderer/DirectRenderer2.cpp +++ b/game/graphics/opengl_renderer/DirectRenderer2.cpp @@ -325,8 +325,9 @@ void DirectRenderer2::setup_opengl_for_draw_mode(const Draw& draw, render_state->shaders[ShaderId::DIRECT2].activate(); glUniform1f(m_ogl.alpha_reject, alpha_reject); glUniform1f(m_ogl.color_mult, color_mult); - glUniform4f(m_ogl.fog_color, render_state->fog_color[0], render_state->fog_color[1], - render_state->fog_color[2], render_state->fog_intensity); + glUniform4f(m_ogl.fog_color, render_state->fog_color[0] / 255.f, + render_state->fog_color[1] / 255.f, render_state->fog_color[2] / 255.f, + render_state->fog_intensity / 255); } } diff --git a/game/graphics/opengl_renderer/Sprite3.cpp b/game/graphics/opengl_renderer/Sprite3.cpp index 0e41da2f1..ed51f7a09 100644 --- a/game/graphics/opengl_renderer/Sprite3.cpp +++ b/game/graphics/opengl_renderer/Sprite3.cpp @@ -213,38 +213,24 @@ void Sprite3::render_2d_group0(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) { // opengl sprite frame setup - glUniform4fv(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "hvdf_offset"), - 1, m_3d_matrix_data.hvdf_offset.data()); - glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "pfog0"), - m_frame_data.pfog0); - glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "min_scale"), - m_frame_data.min_scale); - glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "max_scale"), - m_frame_data.max_scale); - glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "fog_min"), - m_frame_data.fog_min); - glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "fog_max"), - m_frame_data.fog_max); - glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "bonus"), - m_frame_data.bonus); - glUniform4fv(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "hmge_scale"), 1, - m_frame_data.hmge_scale.data()); - glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "deg_to_rad"), - m_frame_data.deg_to_rad); - glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "inv_area"), - m_frame_data.inv_area); - glUniformMatrix4fv(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "camera"), - 1, GL_FALSE, m_3d_matrix_data.camera.data()); - glUniform4fv(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "xy_array"), 8, - m_frame_data.xy_array[0].data()); - glUniform4fv(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "xyz_array"), 4, - m_frame_data.xyz_array[0].data()); - glUniform4fv(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "st_array"), 4, - m_frame_data.st_array[0].data()); - glUniform4fv(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "basis_x"), 1, - m_frame_data.basis_x.data()); - glUniform4fv(glGetUniformLocation(render_state->shaders[ShaderId::SPRITE3].id(), "basis_y"), 1, - m_frame_data.basis_y.data()); + auto shid = render_state->shaders[ShaderId::SPRITE3].id(); + glUniform4fv(glGetUniformLocation(shid, "hvdf_offset"), 1, m_3d_matrix_data.hvdf_offset.data()); + glUniform1f(glGetUniformLocation(shid, "pfog0"), m_frame_data.pfog0); + glUniform1f(glGetUniformLocation(shid, "min_scale"), m_frame_data.min_scale); + glUniform1f(glGetUniformLocation(shid, "max_scale"), m_frame_data.max_scale); + glUniform1f(glGetUniformLocation(shid, "fog_min"), m_frame_data.fog_min); + glUniform1f(glGetUniformLocation(shid, "fog_max"), m_frame_data.fog_max); + // glUniform1f(glGetUniformLocation(shid, "bonus"), m_frame_data.bonus); + // glUniform4fv(glGetUniformLocation(shid, "hmge_scale"), 1, m_frame_data.hmge_scale.data()); + glUniform1f(glGetUniformLocation(shid, "deg_to_rad"), m_frame_data.deg_to_rad); + glUniform1f(glGetUniformLocation(shid, "inv_area"), m_frame_data.inv_area); + glUniformMatrix4fv(glGetUniformLocation(shid, "camera"), 1, GL_FALSE, + m_3d_matrix_data.camera.data()); + glUniform4fv(glGetUniformLocation(shid, "xy_array"), 8, m_frame_data.xy_array[0].data()); + glUniform4fv(glGetUniformLocation(shid, "xyz_array"), 4, m_frame_data.xyz_array[0].data()); + glUniform4fv(glGetUniformLocation(shid, "st_array"), 4, m_frame_data.st_array[0].data()); + glUniform4fv(glGetUniformLocation(shid, "basis_x"), 1, m_frame_data.basis_x.data()); + glUniform4fv(glGetUniformLocation(shid, "basis_y"), 1, m_frame_data.basis_y.data()); u16 last_prog = -1; diff --git a/game/graphics/opengl_renderer/background/Shrub.cpp b/game/graphics/opengl_renderer/background/Shrub.cpp index b6fe012f2..88a9ef4d6 100644 --- a/game/graphics/opengl_renderer/background/Shrub.cpp +++ b/game/graphics/opengl_renderer/background/Shrub.cpp @@ -330,4 +330,4 @@ void Shrub::render_tree(int idx, tree.perf.tree_time.add(tree_timer.getSeconds()); } -void Shrub::draw_debug_window() {} \ No newline at end of file +void Shrub::draw_debug_window() {} diff --git a/game/graphics/opengl_renderer/background/Tie3.cpp b/game/graphics/opengl_renderer/background/Tie3.cpp index 30505e631..f68cbb8fb 100644 --- a/game/graphics/opengl_renderer/background/Tie3.cpp +++ b/game/graphics/opengl_renderer/background/Tie3.cpp @@ -369,6 +369,7 @@ void Tie3::render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfi 2 * (0xff & m_pc_port_data.itimes[i / 2].data()[2 * (i % 2)]) / 127.f; } } + if (!m_override_level) { m_has_level = setup_for_level(m_pc_port_data.level_name, render_state); } diff --git a/game/graphics/opengl_renderer/background/background_common.cpp b/game/graphics/opengl_renderer/background/background_common.cpp index 892f39b32..6b17314fe 100644 --- a/game/graphics/opengl_renderer/background/background_common.cpp +++ b/game/graphics/opengl_renderer/background/background_common.cpp @@ -148,21 +148,18 @@ void first_tfrag_draw_setup(const TfragRenderSettings& settings, SharedRenderState* render_state, ShaderId shader) { render_state->shaders[shader].activate(); - glUniform1i(glGetUniformLocation(render_state->shaders[shader].id(), "tex_T0"), 0); - glUniformMatrix4fv(glGetUniformLocation(render_state->shaders[shader].id(), "camera"), 1, - GL_FALSE, settings.math_camera.data()); - glUniform4f(glGetUniformLocation(render_state->shaders[shader].id(), "hvdf_offset"), - settings.hvdf_offset[0], settings.hvdf_offset[1], settings.hvdf_offset[2], - settings.hvdf_offset[3]); - glUniform1f(glGetUniformLocation(render_state->shaders[shader].id(), "fog_constant"), - settings.fog.x()); - glUniform1f(glGetUniformLocation(render_state->shaders[shader].id(), "fog_min"), - settings.fog.y()); - glUniform1f(glGetUniformLocation(render_state->shaders[shader].id(), "fog_max"), - settings.fog.z()); - glUniform4f(glGetUniformLocation(render_state->shaders[shader].id(), "fog_color"), - render_state->fog_color[0], render_state->fog_color[1], render_state->fog_color[2], - render_state->fog_intensity); + auto shid = render_state->shaders[shader].id(); + glUniform1i(glGetUniformLocation(shid, "tex_T0"), 0); + glUniformMatrix4fv(glGetUniformLocation(shid, "camera"), 1, GL_FALSE, + settings.math_camera.data()); + glUniform4f(glGetUniformLocation(shid, "hvdf_offset"), settings.hvdf_offset[0], + settings.hvdf_offset[1], settings.hvdf_offset[2], settings.hvdf_offset[3]); + glUniform1f(glGetUniformLocation(shid, "fog_constant"), settings.fog.x()); + glUniform1f(glGetUniformLocation(shid, "fog_min"), settings.fog.y()); + glUniform1f(glGetUniformLocation(shid, "fog_max"), settings.fog.z()); + glUniform4f(glGetUniformLocation(shid, "fog_color"), render_state->fog_color[0] / 255.f, + render_state->fog_color[1] / 255.f, render_state->fog_color[2] / 255.f, + render_state->fog_intensity / 255); } void interp_time_of_day_slow(const float weights[8], @@ -675,4 +672,4 @@ void update_render_state_from_pc_settings(SharedRenderState* state, const TfragP state->camera_fog = data.fog; state->has_pc_data = true; } -} \ No newline at end of file +} diff --git a/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp b/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp index 4ca157dc0..d7536dbc4 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp +++ b/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp @@ -78,8 +78,9 @@ void Generic2::init_shaders(ShaderLibrary& shaders) { void Generic2::opengl_bind_and_setup_proj(SharedRenderState* render_state) { render_state->shaders[ShaderId::GENERIC].activate(); - glUniform4f(m_ogl.fog_color, render_state->fog_color[0], render_state->fog_color[1], - render_state->fog_color[2], render_state->fog_intensity); + glUniform4f(m_ogl.fog_color, render_state->fog_color[0] / 255.f, + render_state->fog_color[1] / 255.f, render_state->fog_color[2] / 255.f, + render_state->fog_intensity / 255); glUniform4f(m_ogl.scale, m_drawing_config.proj_scale[0], m_drawing_config.proj_scale[1], m_drawing_config.proj_scale[2], 0); glUniform1f(m_ogl.mat_23, m_drawing_config.proj_mat_23); @@ -189,8 +190,9 @@ void Generic2::setup_opengl_for_draw_mode(const DrawMode& draw_mode, glUniform1f(m_ogl.alpha_reject, alpha_reject); glUniform1f(m_ogl.color_mult, color_mult); - glUniform4f(m_ogl.fog_color, render_state->fog_color[0], render_state->fog_color[1], - render_state->fog_color[2], render_state->fog_intensity); + glUniform4f(m_ogl.fog_color, render_state->fog_color[0] / 255.f, + render_state->fog_color[1] / 255.f, render_state->fog_color[2] / 255.f, + render_state->fog_intensity / 255); } void Generic2::setup_opengl_tex(u16 unit, diff --git a/game/graphics/opengl_renderer/foreground/Merc2.cpp b/game/graphics/opengl_renderer/foreground/Merc2.cpp index b1f79a25b..4310ac270 100644 --- a/game/graphics/opengl_renderer/foreground/Merc2.cpp +++ b/game/graphics/opengl_renderer/foreground/Merc2.cpp @@ -67,8 +67,9 @@ void Merc2::init_for_frame(SharedRenderState* render_state) { render_state->shaders[ShaderId::MERC2].activate(); // set uniforms that we know from render_state - glUniform4f(m_uniforms.fog_color, render_state->fog_color[0], render_state->fog_color[1], - render_state->fog_color[2], render_state->fog_intensity); + glUniform4f(m_uniforms.fog_color, render_state->fog_color[0] / 255.f, + render_state->fog_color[1] / 255.f, render_state->fog_color[2] / 255.f, + render_state->fog_intensity / 255); } void Merc2::draw_debug_window() { diff --git a/game/graphics/opengl_renderer/ocean/CommonOceanRenderer.cpp b/game/graphics/opengl_renderer/ocean/CommonOceanRenderer.cpp index 9643d27ce..2f8ff68fb 100644 --- a/game/graphics/opengl_renderer/ocean/CommonOceanRenderer.cpp +++ b/game/graphics/opengl_renderer/ocean/CommonOceanRenderer.cpp @@ -275,8 +275,8 @@ void CommonOceanRenderer::flush_near(SharedRenderState* render_state, ScopedProf GL_STREAM_DRAW); render_state->shaders[ShaderId::OCEAN_COMMON].activate(); glUniform4f(glGetUniformLocation(render_state->shaders[ShaderId::OCEAN_COMMON].id(), "fog_color"), - render_state->fog_color[0], render_state->fog_color[1], render_state->fog_color[2], - render_state->fog_intensity); + render_state->fog_color[0] / 255.f, render_state->fog_color[1] / 255.f, + render_state->fog_color[2] / 255.f, render_state->fog_intensity / 255); glDepthMask(GL_FALSE); glEnable(GL_DEPTH_TEST); @@ -450,8 +450,8 @@ void CommonOceanRenderer::flush_mid(SharedRenderState* render_state, ScopedProfi GL_STREAM_DRAW); render_state->shaders[ShaderId::OCEAN_COMMON].activate(); glUniform4f(glGetUniformLocation(render_state->shaders[ShaderId::OCEAN_COMMON].id(), "fog_color"), - render_state->fog_color[0], render_state->fog_color[1], render_state->fog_color[2], - render_state->fog_intensity); + render_state->fog_color[0] / 255.f, render_state->fog_color[1] / 255.f, + render_state->fog_color[2] / 255.f, render_state->fog_intensity / 255); glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); @@ -521,4 +521,4 @@ void CommonOceanRenderer::flush_mid(SharedRenderState* render_state, ScopedProfi prof.add_draw_call(); prof.add_tri(m_next_free_index[bucket]); } -} \ No newline at end of file +} diff --git a/game/graphics/opengl_renderer/shaders/direct2.frag b/game/graphics/opengl_renderer/shaders/direct2.frag index 9a241d72f..4aaca6215 100644 --- a/game/graphics/opengl_renderer/shaders/direct2.frag +++ b/game/graphics/opengl_renderer/shaders/direct2.frag @@ -70,6 +70,6 @@ void main() { discard; } if ((tex_info.y & 4u) != 0) { - color.xyz = mix(color.xyz, fog_color.xyz / 255., clamp(fog_color.w * (1 - fog), 0, 1)); + color.xyz = mix(color.xyz, fog_color.rgb, clamp(fog_color.a * fog, 0, 1)); } } diff --git a/game/graphics/opengl_renderer/shaders/direct2.vert b/game/graphics/opengl_renderer/shaders/direct2.vert index 7895564c6..310ca4ffb 100644 --- a/game/graphics/opengl_renderer/shaders/direct2.vert +++ b/game/graphics/opengl_renderer/shaders/direct2.vert @@ -22,5 +22,5 @@ void main() { fragment_color = vec4(rgba_in.x, rgba_in.y, rgba_in.z, rgba_in.w * 2.); tex_coord = tex_coord_in; tex_info = byte_info.xy; - fog = float(byte_info.z) / 255.; + fog = 255 - byte_info.z; } diff --git a/game/graphics/opengl_renderer/shaders/direct_basic_textured.frag b/game/graphics/opengl_renderer/shaders/direct_basic_textured.frag index 01dc44c7e..8e67fa742 100644 --- a/game/graphics/opengl_renderer/shaders/direct_basic_textured.frag +++ b/game/graphics/opengl_renderer/shaders/direct_basic_textured.frag @@ -73,7 +73,7 @@ void main() { discard; } if (tex_info.w == 1) { - color.xyz = mix(color.xyz, fog_color.xyz / 255., clamp(fog_color.w * (1 - fog), 0, 1)); + color.xyz = mix(color.xyz, fog_color.rgb, clamp(fog_color.a * fog, 0, 1)); } } diff --git a/game/graphics/opengl_renderer/shaders/direct_basic_textured.vert b/game/graphics/opengl_renderer/shaders/direct_basic_textured.vert index e60ccbf73..89ce20f92 100644 --- a/game/graphics/opengl_renderer/shaders/direct_basic_textured.vert +++ b/game/graphics/opengl_renderer/shaders/direct_basic_textured.vert @@ -19,5 +19,5 @@ void main() { fragment_color = vec4(rgba_in.x, rgba_in.y, rgba_in.z, rgba_in.w * 2.); tex_coord = tex_coord_in; tex_info = tex_info_in; - fog = position_in.w / 255.; + fog = 255 - position_in.w; } diff --git a/game/graphics/opengl_renderer/shaders/generic.frag b/game/graphics/opengl_renderer/shaders/generic.frag index 622a789b1..8642942de 100644 --- a/game/graphics/opengl_renderer/shaders/generic.frag +++ b/game/graphics/opengl_renderer/shaders/generic.frag @@ -73,6 +73,6 @@ void main() { discard; } if ((tex_info.y & 4u) != 0) { - color.xyz = mix(color.xyz, fog_color.xyz / 255., clamp(fog_color.w * (fog), 0, 1)); + color.xyz = mix(color.xyz, fog_color.rgb, clamp(fog_color.a * fog, 0, 1)); } -} \ No newline at end of file +} diff --git a/game/graphics/opengl_renderer/shaders/generic.vert b/game/graphics/opengl_renderer/shaders/generic.vert index b2f5dfa8f..c6d6e30c9 100644 --- a/game/graphics/opengl_renderer/shaders/generic.vert +++ b/game/graphics/opengl_renderer/shaders/generic.vert @@ -46,10 +46,7 @@ void main() { // vu.Q = gen.fog.x() / gen.vtx_p0.w(); float Q = fog_constants.x / transformed.w; - float fog1 = -transformed.w + hvdf_offset.w; - float fog2 = min(fog1, fog_constants.z); - float fog3 = max(fog2, fog_constants.y); - fog = 1 - (fog3/256); + fog = 255 - clamp(-transformed.w + hvdf_offset.w, fog_constants.z, fog_constants.y); // itof12.xyz vf18, vf22 texture int to float // vu.vf18.itof12(Mask::xyz, vu.vf22); @@ -84,6 +81,6 @@ void main() { // scissoring area adjust gl_Position.y *= 512.0/448.0; - fragment_color = vec4(rgba_in.x, rgba_in.y, rgba_in.z, rgba_in.w * 2.); + fragment_color = vec4(rgba_in.rgb, rgba_in.a * 2); tex_info = byte_info.xy; -} \ No newline at end of file +} diff --git a/game/graphics/opengl_renderer/shaders/merc2.frag b/game/graphics/opengl_renderer/shaders/merc2.frag index 5fd680f2d..70bef8f54 100644 --- a/game/graphics/opengl_renderer/shaders/merc2.frag +++ b/game/graphics/opengl_renderer/shaders/merc2.frag @@ -30,5 +30,5 @@ void main() { discard; } - color.xyz = mix(color.xyz, fog_color.xyz / 255., clamp(fog, 0, 1)); -} \ No newline at end of file + color.xyz = mix(color.xyz, fog_color.rgb, clamp(fog, 0, 1)); +} diff --git a/game/graphics/opengl_renderer/shaders/merc2.vert b/game/graphics/opengl_renderer/shaders/merc2.vert index fc990dc88..91f2cea3e 100644 --- a/game/graphics/opengl_renderer/shaders/merc2.vert +++ b/game/graphics/opengl_renderer/shaders/merc2.vert @@ -27,6 +27,8 @@ uniform vec4 fog_constants; uniform mat4 perspective_matrix; +const float SCISSOR_ADJUST = 512.0/448.0; + // output out vec3 vtx_color; out vec2 vtx_st; @@ -94,10 +96,7 @@ void main() { float Q = fog_constants.x / transformed[3]; - float fog1 = -transformed.w + hvdf_offset.w; - float fog2 = min(fog1, fog_constants.z); - float fog3 = max(fog2, fog_constants.y); - fog = 1 - (fog3/256); + fog = (255 - clamp(-transformed.w + hvdf_offset.w, fog_constants.z, fog_constants.y))/255.0; transformed.xyz *= Q; transformed.xyz += hvdf_offset.xyz; @@ -107,8 +106,8 @@ void main() { transformed.x /= (256); transformed.y /= -(128); transformed.xyz *= transformed.w; + transformed.y *= SCISSOR_ADJUST; gl_Position = transformed; - gl_Position.y *= 512.0/448.0; vtx_color = rgba * light_color; diff --git a/game/graphics/opengl_renderer/shaders/ocean_common.frag b/game/graphics/opengl_renderer/shaders/ocean_common.frag index e920be3b9..13adb17ce 100644 --- a/game/graphics/opengl_renderer/shaders/ocean_common.frag +++ b/game/graphics/opengl_renderer/shaders/ocean_common.frag @@ -17,22 +17,14 @@ uniform sampler2D tex_T0; void main() { vec4 T0 = texture(tex_T0, tex_coord.xy / tex_coord.z); if (bucket == 0) { - color.xyz = fragment_color.xyz * T0.xyz; - color.w = fragment_color.w; - color.xyz *= 2; - color.xyz = mix(color.xyz, fog_color.xyz / 255., clamp(fog_color.w * (1 - fog), 0, 1)); - } else if (bucket == 1) { - color = fragment_color * T0; - color.xyzw *= 2; - } else if (bucket == 2) { + color.rgb = fragment_color.rgb * T0.rgb; + color.a = fragment_color.a; + color.rgb = mix(color.rgb, fog_color.rgb, clamp(fog_color.a * fog, 0, 1)); + } else if (bucket == 1 || bucket == 2 || bucket == 4) { color = fragment_color * T0; } else if (bucket == 3) { color = fragment_color * T0; - color.xyzw *= 2; - color.xyz = mix(color.xyz, fog_color.xyz / 255., clamp(fog_color.w * (1 - fog), 0, 1)); - } else if (bucket == 4) { - color = fragment_color * T0; - color.w = 0; + color.rgb = mix(color.rgb, fog_color.rgb, clamp(fog_color.a * fog, 0, 1)); } } diff --git a/game/graphics/opengl_renderer/shaders/ocean_common.vert b/game/graphics/opengl_renderer/shaders/ocean_common.vert index c1779606e..9e71b5f69 100644 --- a/game/graphics/opengl_renderer/shaders/ocean_common.vert +++ b/game/graphics/opengl_renderer/shaders/ocean_common.vert @@ -9,11 +9,23 @@ out vec4 fragment_color; out vec3 tex_coord; out float fog; +const float SCISSOR_ADJUST = 512.0/448.0; + +uniform int bucket; + void main() { gl_Position = vec4((position_in.x - 0.5) * 16., -(position_in.y - 0.5) * 32, position_in.z * 2 - 1., 1.0); // scissoring area adjust - gl_Position.y *= 512.0/448.0; - fragment_color = vec4(rgba_in.x, rgba_in.y, rgba_in.z, rgba_in.w * 2.); + gl_Position.y *= SCISSOR_ADJUST; + fragment_color = vec4(rgba_in.rgb, rgba_in.a * 2); tex_coord = tex_coord_in; - fog = float(fog_in) / 255.; + fog = 255 - fog_in; + + if (bucket == 0) { + fragment_color.rgb *= 2; + } else if (bucket == 1 || bucket == 3) { + fragment_color *= 2; + } else if (bucket == 4) { + fragment_color.a = 0; + } } diff --git a/game/graphics/opengl_renderer/shaders/ocean_texture.frag b/game/graphics/opengl_renderer/shaders/ocean_texture.frag index a6305cf3f..f48ea2fd6 100644 --- a/game/graphics/opengl_renderer/shaders/ocean_texture.frag +++ b/game/graphics/opengl_renderer/shaders/ocean_texture.frag @@ -8,6 +8,5 @@ uniform sampler2D tex_T0; void main() { vec4 tex = texture(tex_T0, tex_coord); - tex.xyz *= 2; color = fragment_color * tex; -} \ No newline at end of file +} diff --git a/game/graphics/opengl_renderer/shaders/ocean_texture.vert b/game/graphics/opengl_renderer/shaders/ocean_texture.vert index c1de21266..847912c2b 100644 --- a/game/graphics/opengl_renderer/shaders/ocean_texture.vert +++ b/game/graphics/opengl_renderer/shaders/ocean_texture.vert @@ -10,6 +10,6 @@ out vec2 tex_coord; void main() { // inputs are 0 - 2048. gl_Position = vec4((position_in.x - 1024) / 1024, (position_in.y - 1024) / 1024, 0.5, 1.0); - fragment_color = vec4(rgba_in.x, rgba_in.y, rgba_in.z, 1); + fragment_color = vec4(rgba_in.rgb * 2, 1); tex_coord = tex_coord_in; } diff --git a/game/graphics/opengl_renderer/shaders/shrub.frag b/game/graphics/opengl_renderer/shaders/shrub.frag index 481940e1c..aafd4e9e6 100644 --- a/game/graphics/opengl_renderer/shaders/shrub.frag +++ b/game/graphics/opengl_renderer/shaders/shrub.frag @@ -13,16 +13,11 @@ uniform vec4 fog_color; void main() { vec4 T0 = texture(tex_T0, tex_coord.xy / 4096.f); - color = fragment_color * T0 * 2.0; - color.w *= 2; + color = fragment_color * T0; - if (color.a < alpha_min * 2) { + if (color.a < alpha_min || color.a > alpha_max) { discard; } - if (color.a > alpha_max) { - discard; - } - - color.xyz = mix(color.xyz, fog_color.xyz / 255., clamp(fogginess/255 * fog_color.w, 0., 1.)); + color.xyz = mix(color.xyz, fog_color.rgb, clamp(fogginess * fog_color.a, 0, 1)); } diff --git a/game/graphics/opengl_renderer/shaders/shrub.vert b/game/graphics/opengl_renderer/shaders/shrub.vert index 7a7a4b28a..b84897eda 100644 --- a/game/graphics/opengl_renderer/shaders/shrub.vert +++ b/game/graphics/opengl_renderer/shaders/shrub.vert @@ -16,6 +16,8 @@ out vec4 fragment_color; out vec3 tex_coord; out float fogginess; +const float SCISSOR_ADJUST = 512.0/448.0; + void main() { @@ -32,47 +34,36 @@ void main() { // gs is 12.4 fixed point, set up with 2048.0 as the center. // the itof0 is done in the preprocessing step. now we have floats. - + // Step 3, the camera transform - vec4 transformed = -camera[3].xyzw; - transformed += -camera[0] * position_in.x; - transformed += -camera[1] * position_in.y; - transformed += -camera[2] * position_in.z; + vec4 transformed = -camera[3]; + transformed -= camera[0] * position_in.x; + transformed -= camera[1] * position_in.y; + transformed -= camera[2] * position_in.z; // compute Q - float Q = fog_constant / transformed[3]; + float Q = fog_constant / transformed.w; - float fog1 = -transformed.w + hvdf_offset.w; - float fog2 = min(fog1, fog_max); - float fog3 = max(fog2, fog_min); - fogginess = 255 - fog3; + // do fog! + fogginess = 255 - clamp(-transformed.w + hvdf_offset.w, fog_min, fog_max); // perspective divide! transformed.xyz *= Q; - // offset transformed.xyz += hvdf_offset.xyz; - - // ftoi4 - //transformed.xyzw *= 16; - // correct xy offset transformed.xy -= (2048.); - // correct z scale transformed.z /= (8388608); transformed.z -= 1; - // correct xy scale transformed.x /= (256); transformed.y /= -(128); - // hack transformed.xyz *= transformed.w; - - gl_Position = transformed; // scissoring area adjust - gl_Position.y *= 512.0/448.0; + transformed.y *= SCISSOR_ADJUST; + gl_Position = transformed; // time of day lookup // start with the vertex color (only rgb, VIF filled in the 255.) @@ -80,7 +71,8 @@ void main() { // get the time of day multiplier vec4 tod_color = texelFetch(tex_T1, time_of_day_index, 0); // combine - fragment_color *= tod_color * 2; + fragment_color *= tod_color * 4; + fragment_color.a *= 2; tex_coord = tex_coord_in; } diff --git a/game/graphics/opengl_renderer/shaders/sprite3_3d.frag b/game/graphics/opengl_renderer/shaders/sprite3_3d.frag index c22fa3a44..5262d1206 100644 --- a/game/graphics/opengl_renderer/shaders/sprite3_3d.frag +++ b/game/graphics/opengl_renderer/shaders/sprite3_3d.frag @@ -15,13 +15,9 @@ void main() { if (tex_info.y == 0) { T0.w = 1.0; } - color = fragment_color * T0 * 2.0; + color = fragment_color * T0; - if (color.a < alpha_min) { - discard; - } - - if (color.a > alpha_max) { + if (color.a < alpha_min || color.a > alpha_max) { discard; } } diff --git a/game/graphics/opengl_renderer/shaders/sprite3_3d.vert b/game/graphics/opengl_renderer/shaders/sprite3_3d.vert index c05c400af..be42f88fd 100644 --- a/game/graphics/opengl_renderer/shaders/sprite3_3d.vert +++ b/game/graphics/opengl_renderer/shaders/sprite3_3d.vert @@ -16,12 +16,10 @@ uniform float fog_min; uniform float fog_max; uniform float min_scale; uniform float max_scale; -uniform float bonus; uniform float deg_to_rad; uniform float inv_area; uniform vec4 basis_x; uniform vec4 basis_y; -uniform vec4 hmge_scale; uniform vec4 xy_array[8]; uniform vec4 xyz_array[4]; uniform vec4 st_array[4]; @@ -30,6 +28,8 @@ out flat vec4 fragment_color; out vec3 tex_coord; out flat uvec2 tex_info; +const float SCISSOR_ADJUST = 512.0/448.0; + vec4 matrix_transform(mat4 mtx, vec3 pt) { return mtx[3] + mtx[0] * pt.x @@ -114,8 +114,8 @@ void main() { fge = false; } */ - scales_vf01.z = min(max(scales_vf01.z, min_scale), max_scale); - scales_vf01.w = min(max(scales_vf01.w, min_scale), max_scale); + scales_vf01.z = clamp(scales_vf01.z, min_scale, max_scale); + scales_vf01.w = clamp(scales_vf01.w, min_scale, max_scale); quat.z *= deg_to_rad; float sp_sin = sin(quat.z); @@ -131,6 +131,7 @@ void main() { transformed = offset_pos_vf10 + vf12_rotated * xy0_vf19.x + vf13_rotated_trans * xy0_vf19.y; } else if (rendermode == 2) { // hud sprites + transformed_pos_vf02.xyz *= Q; vec4 offset_pos_vf10 = transformed_pos_vf02 + (matrix == 0 ? hud_hvdf_offset : hud_hvdf_user[matrix - 1]); @@ -159,22 +160,19 @@ void main() { // STEP 5: final adjustments // correct xy offset transformed.xy -= (2048.); - // correct z scale transformed.z /= (8388608); transformed.z -= 1; - // correct xy scale transformed.x /= (256); transformed.y /= -(128); - // hack transformed.xyz *= transformed.w; - - gl_Position = transformed; // scissoring area adjust - gl_Position.y *= 512.0/448.0; + transformed.y *= SCISSOR_ADJUST; + gl_Position = transformed; + fragment_color *= 2; fragment_color.w *= 2; tex_info = tex_info_in.xy; diff --git a/game/graphics/opengl_renderer/shaders/tfrag3.frag b/game/graphics/opengl_renderer/shaders/tfrag3.frag index bb51ed66e..379482da8 100644 --- a/game/graphics/opengl_renderer/shaders/tfrag3.frag +++ b/game/graphics/opengl_renderer/shaders/tfrag3.frag @@ -14,15 +14,11 @@ uniform vec4 fog_color; void main() { //vec4 T0 = texture(tex_T0, tex_coord); vec4 T0 = texture(tex_T0, tex_coord.xy); - color = fragment_color * T0 * 2.0; + color = fragment_color * T0; - if (color.a < alpha_min) { + if (color.a < alpha_min || color.a > alpha_max) { discard; } - if (color.a > alpha_max) { - discard; - } - - color.xyz = mix(color.xyz, fog_color.xyz / 255., clamp(fogginess/255 * fog_color.w, 0., 1.)); + color.rgb = mix(color.rgb, fog_color.rgb, clamp(fogginess * fog_color.a, 0, 1)); } diff --git a/game/graphics/opengl_renderer/shaders/tfrag3.vert b/game/graphics/opengl_renderer/shaders/tfrag3.vert index c0a70e2df..e78e96b36 100644 --- a/game/graphics/opengl_renderer/shaders/tfrag3.vert +++ b/game/graphics/opengl_renderer/shaders/tfrag3.vert @@ -15,6 +15,8 @@ out vec4 fragment_color; out vec3 tex_coord; out float fogginess; +const float SCISSOR_ADJUST = 512.0/448.0; + void main() { @@ -33,54 +35,46 @@ void main() { // the itof0 is done in the preprocessing step. now we have floats. // Step 3, the camera transform - vec4 transformed = -camera[3].xyzw; - transformed += -camera[0] * position_in.x; - transformed += -camera[1] * position_in.y; - transformed += -camera[2] * position_in.z; + vec4 transformed = -camera[3]; + transformed -= camera[0] * position_in.x; + transformed -= camera[1] * position_in.y; + transformed -= camera[2] * position_in.z; // compute Q - float Q = fog_constant / transformed[3]; + float Q = fog_constant / transformed.w; - float fog1 = -transformed.w + hvdf_offset.w; - float fog2 = min(fog1, fog_max); - float fog3 = max(fog2, fog_min); - fogginess = 255 - fog3; + // do fog! + fogginess = 255 - clamp(-transformed.w + hvdf_offset.w, fog_min, fog_max); // perspective divide! transformed.xyz *= Q; - // offset transformed.xyz += hvdf_offset.xyz; - - // ftoi4 - //transformed.xyzw *= 16; - // correct xy offset transformed.xy -= (2048.); - // correct z scale transformed.z /= (8388608); transformed.z -= 1; - // correct xy scale transformed.x /= (256); transformed.y /= -(128); - // hack transformed.xyz *= transformed.w; - - gl_Position = transformed; // scissoring area adjust - gl_Position.y *= 512.0/448.0; + transformed.y *= SCISSOR_ADJUST; + gl_Position = transformed; // time of day lookup fragment_color = texelFetch(tex_T1, time_of_day_index, 0); - fragment_color.w *= 2; // fog hack if (fragment_color.r < 0.0075 && fragment_color.g < 0.0075 && fragment_color.b < 0.0075) { fogginess = 0; } + // color adjustment + fragment_color *= 2; + fragment_color.a *= 2; + tex_coord = tex_coord_in; } diff --git a/game/graphics/opengl_renderer/shaders/tfrag3_no_tex.vert b/game/graphics/opengl_renderer/shaders/tfrag3_no_tex.vert index 809877d2b..8970445db 100644 --- a/game/graphics/opengl_renderer/shaders/tfrag3_no_tex.vert +++ b/game/graphics/opengl_renderer/shaders/tfrag3_no_tex.vert @@ -9,43 +9,35 @@ uniform float fog_constant; out vec4 fragment_color; +const float SCISSOR_ADJUST = 512.0/448.0; + // this is just for debugging. void main() { - vec4 transformed = -camera[3].xyzw; - transformed += -camera[0] * position_in.x; - transformed += -camera[1] * position_in.y; - transformed += -camera[2] * position_in.z; + vec4 transformed = camera[3]; + transformed += camera[0] * position_in.x; + transformed += camera[1] * position_in.y; + transformed += camera[2] * position_in.z; // compute Q - float Q = fog_constant / transformed[3]; + float Q = fog_constant / transformed.w; // perspective divide! transformed.xyz *= Q; - // offset transformed.xyz += hvdf_offset.xyz; - - // ftoi4 - //transformed.xyzw *= 16; - // correct xy offset transformed.xy -= (2048.); - // correct z scale - transformed.z /= (16777216); - transformed.z *= 2; + transformed.z /= (8388608); transformed.z -= 1; - // correct xy scale transformed.x /= (256); transformed.y /= -(128); - // hack transformed.xyz *= transformed.w; - - gl_Position = transformed; // scissoring area adjust - gl_Position.y *= 512.0/448.0; + transformed.y *= SCISSOR_ADJUST; + gl_Position = transformed; // time of day lookup fragment_color = rgba_in;