From a29fca982bd1288a4f56ae3d056e2b64627e5ca4 Mon Sep 17 00:00:00 2001 From: water111 <48171810+water111@users.noreply.github.com> Date: Sat, 18 Jan 2025 16:07:01 -0500 Subject: [PATCH] [jak1] Fix wind (#3837) I accidentally broke this with the camera matrix improvements, but it's fixed now. ![image](https://github.com/user-attachments/assets/144ac770-d7bf-414a-8814-062bbe51c39e) --------- Co-authored-by: water111 --- game/graphics/opengl_renderer/Shader.cpp | 1 + game/graphics/opengl_renderer/Shader.h | 1 + .../opengl_renderer/background/Tie3.cpp | 31 ++++++---- .../opengl_renderer/shaders/tie_wind.frag | 31 ++++++++++ .../opengl_renderer/shaders/tie_wind.vert | 58 +++++++++++++++++++ 5 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 game/graphics/opengl_renderer/shaders/tie_wind.frag create mode 100644 game/graphics/opengl_renderer/shaders/tie_wind.vert diff --git a/game/graphics/opengl_renderer/Shader.cpp b/game/graphics/opengl_renderer/Shader.cpp index 9850d6b624..9e18e7e9d2 100644 --- a/game/graphics/opengl_renderer/Shader.cpp +++ b/game/graphics/opengl_renderer/Shader.cpp @@ -131,6 +131,7 @@ ShaderLibrary::ShaderLibrary(GameVersion version) { at(ShaderId::HFRAG) = {"hfrag", version}; at(ShaderId::HFRAG_MONTAGE) = {"hfrag_montage", version}; at(ShaderId::PLAIN_TEXTURE) = {"plain_texture", version}; + at(ShaderId::TIE_WIND) = {"tie_wind", version}; for (auto& shader : m_shaders) { ASSERT_MSG(shader.okay(), "error compiling shader"); diff --git a/game/graphics/opengl_renderer/Shader.h b/game/graphics/opengl_renderer/Shader.h index 02769f9528..99acd7b186 100644 --- a/game/graphics/opengl_renderer/Shader.h +++ b/game/graphics/opengl_renderer/Shader.h @@ -64,6 +64,7 @@ enum class ShaderId { HFRAG = 37, HFRAG_MONTAGE = 38, PLAIN_TEXTURE = 39, + TIE_WIND = 40, MAX_SHADERS }; diff --git a/game/graphics/opengl_renderer/background/Tie3.cpp b/game/graphics/opengl_renderer/background/Tie3.cpp index 7ab938bd0e..a32eab6c06 100644 --- a/game/graphics/opengl_renderer/background/Tie3.cpp +++ b/game/graphics/opengl_renderer/background/Tie3.cpp @@ -932,6 +932,20 @@ void Tie3::render_tree_wind(int idx, out[3] = cam[0] * mat[3].x() + cam[1] * mat[3].y() + cam[2] * mat[3].z() + cam[3]; } + auto shader_id = ShaderId::TIE_WIND; + first_tfrag_draw_setup(settings.camera, render_state, shader_id); + glBindVertexArray(tree.vao); + glBindBuffer(GL_ARRAY_BUFFER, tree.vertex_buffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, + render_state->no_multidraw ? tree.single_draw_index_buffer : tree.index_buffer); + + glActiveTexture(GL_TEXTURE10); + glBindTexture(GL_TEXTURE_1D, tree.time_of_day_texture); + + glActiveTexture(GL_TEXTURE0); + glEnable(GL_PRIMITIVE_RESTART); + glPrimitiveRestartIndex(UINT32_MAX); + int last_texture = -1; glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tree.wind_vertex_index_buffer); @@ -946,7 +960,7 @@ void Tie3::render_tree_wind(int idx, } last_texture = draw.tree_tex_id; } - auto double_draw = setup_tfrag_shader(render_state, draw.mode, ShaderId::TFRAG3); + auto double_draw = setup_tfrag_shader(render_state, draw.mode, shader_id); int off = 0; for (auto& grp : draw.instance_groups) { @@ -955,9 +969,8 @@ void Tie3::render_tree_wind(int idx, continue; // invisible, skip. } - glUniformMatrix4fv( - glGetUniformLocation(render_state->shaders[ShaderId::TFRAG3].id(), "camera"), 1, GL_FALSE, - tree.wind_matrix_cache.at(grp.instance_idx)[0].data()); + glUniformMatrix4fv(glGetUniformLocation(render_state->shaders[shader_id].id(), "camera"), 1, + GL_FALSE, tree.wind_matrix_cache.at(grp.instance_idx)[0].data()); prof.add_draw_call(); prof.add_tri(grp.num); @@ -972,12 +985,10 @@ void Tie3::render_tree_wind(int idx, case DoubleDrawKind::AFAIL_NO_DEPTH_WRITE: prof.add_draw_call(); prof.add_tri(grp.num); - glUniform1f( - glGetUniformLocation(render_state->shaders[ShaderId::TFRAG3].id(), "alpha_min"), - -10.f); - glUniform1f( - glGetUniformLocation(render_state->shaders[ShaderId::TFRAG3].id(), "alpha_max"), - double_draw.aref_second); + glUniform1f(glGetUniformLocation(render_state->shaders[shader_id].id(), "alpha_min"), + -10.f); + glUniform1f(glGetUniformLocation(render_state->shaders[shader_id].id(), "alpha_max"), + double_draw.aref_second); glDepthMask(GL_FALSE); glDrawElements(tree.draw_mode, draw.vertex_index_stream.size(), GL_UNSIGNED_INT, (void*)0); diff --git a/game/graphics/opengl_renderer/shaders/tie_wind.frag b/game/graphics/opengl_renderer/shaders/tie_wind.frag new file mode 100644 index 0000000000..af42cdfd74 --- /dev/null +++ b/game/graphics/opengl_renderer/shaders/tie_wind.frag @@ -0,0 +1,31 @@ +#version 410 core + +out vec4 color; + +in vec4 fragment_color; +in vec3 tex_coord; +in float fogginess; +uniform sampler2D tex_T0; + +uniform float alpha_min; +uniform float alpha_max; +uniform vec4 fog_color; + +uniform int gfx_hack_no_tex; + + +void main() { + if (gfx_hack_no_tex == 0) { + //vec4 T0 = texture(tex_T0, tex_coord); + vec4 T0 = texture(tex_T0, tex_coord.xy); + color = fragment_color * T0; + } else { + color = fragment_color/2; + } + + if (color.a < alpha_min || color.a > alpha_max) { + discard; + } + + color.rgb = mix(color.rgb, fog_color.rgb, clamp(fogginess * fog_color.a, 0, 1)); +} \ No newline at end of file diff --git a/game/graphics/opengl_renderer/shaders/tie_wind.vert b/game/graphics/opengl_renderer/shaders/tie_wind.vert new file mode 100644 index 0000000000..b774036a2a --- /dev/null +++ b/game/graphics/opengl_renderer/shaders/tie_wind.vert @@ -0,0 +1,58 @@ +#version 410 core + +layout (location = 0) in vec3 position_in; +layout (location = 1) in vec3 tex_coord_in; +layout (location = 2) in int time_of_day_index; + +uniform vec4 hvdf_offset; +uniform mat4 camera; +uniform float fog_constant; +uniform float fog_min; +uniform float fog_max; +uniform sampler1D tex_T10; // note, sampled in the vertex shader on purpose. +uniform int decal; + +out vec4 fragment_color; +out vec3 tex_coord; +out float fogginess; + +void main() { + vec4 transformed = -camera[3]; + transformed -= camera[0] * position_in.x; + transformed -= camera[1] * position_in.y; + transformed -= camera[2] * position_in.z; + float Q = fog_constant / transformed.w; + + fogginess = 255 - clamp(-transformed.w + hvdf_offset.w, fog_min, fog_max); + + // perspective divide! + transformed.xyz *= Q; + // offset + transformed.xyz += hvdf_offset.xyz; + // 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; + // scissoring area adjust + transformed.y *= SCISSOR_ADJUST * HEIGHT_SCALE; + gl_Position = transformed; + + // time of day lookup + fragment_color = texelFetch(tex_T10, time_of_day_index, 0); + // color adjustment + fragment_color *= 2; + fragment_color.a *= 2; + + if (decal == 1) { + // tfrag/tie always use TCC=RGB, so even with decal, alpha comes from fragment. + fragment_color.xyz = vec3(1.0, 1.0, 1.0); + } + + tex_coord = tex_coord_in; +} \ No newline at end of file