mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
small shader optimizations (#1402)
* small shader optimizations * revert camera invert
This commit is contained in:
parent
efeae09354
commit
e3051f90ae
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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],
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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));
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,6 +8,5 @@ uniform sampler2D tex_T0;
|
|||
|
||||
void main() {
|
||||
vec4 tex = texture(tex_T0, tex_coord);
|
||||
tex.xyz *= 2;
|
||||
color = fragment_color * tex;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
||||
|
||||
|
@ -34,45 +36,34 @@ 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
|
||||
// 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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue