small shader optimizations (#1402)

* small shader optimizations

* revert camera invert
This commit is contained in:
ManDude 2022-06-01 23:34:19 +01:00 committed by GitHub
parent efeae09354
commit e3051f90ae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
28 changed files with 144 additions and 194 deletions

View file

@ -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();

View file

@ -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);
}
}

View file

@ -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;

View file

@ -330,4 +330,4 @@ void Shrub::render_tree(int idx,
tree.perf.tree_time.add(tree_timer.getSeconds());
}
void Shrub::draw_debug_window() {}
void Shrub::draw_debug_window() {}

View file

@ -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);
}

View file

@ -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;
}
}
}

View file

@ -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,

View file

@ -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() {

View file

@ -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]);
}
}
}

View file

@ -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));
}
}

View file

@ -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;
}

View file

@ -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));
}
}

View file

@ -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;
}

View file

@ -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));
}
}
}

View file

@ -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;
}
}

View file

@ -30,5 +30,5 @@ void main() {
discard;
}
color.xyz = mix(color.xyz, fog_color.xyz / 255., clamp(fog, 0, 1));
}
color.xyz = mix(color.xyz, fog_color.rgb, clamp(fog, 0, 1));
}

View file

@ -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;

View file

@ -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));
}
}

View file

@ -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;
}
}

View file

@ -8,6 +8,5 @@ uniform sampler2D tex_T0;
void main() {
vec4 tex = texture(tex_T0, tex_coord);
tex.xyz *= 2;
color = fragment_color * tex;
}
}

View file

@ -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;
}

View file

@ -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));
}

View file

@ -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;
}

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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));
}

View file

@ -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;
}

View file

@ -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;