Files
jak-project/game/graphics/opengl_renderer/shaders/generic.frag
T
2023-08-07 00:15:53 +01:00

83 lines
1.8 KiB
GLSL

#version 410 core
out vec4 color;
in vec2 tex_coord;
uniform float alpha_reject;
uniform float color_mult;
uniform vec4 fog_color;
in float fog;
in vec4 fragment_color;
flat in uvec2 tex_info;
uniform int gfx_hack_no_tex;
uniform uint warp_sample_mode;
uniform sampler2D tex_T0;
vec4 sample_tex(vec2 coord, uint unit) {
return texture(tex_T0, coord);
}
void main() {
// 0x1 is tcc
// 0x2 is decal
// 0x4 is fog
if (warp_sample_mode == 1 || gfx_hack_no_tex == 0) {
vec4 T0 = sample_tex(tex_coord.xy, tex_info.x);
if ((tex_info.y & 1u) == 0) {
if ((tex_info.y & 2u) == 0) {
// modulate + no tcc
color.rgb = fragment_color.rgb * T0.rgb;
color.a = fragment_color.a;
} else {
// decal + no tcc
color.rgb = T0.rgb * 0.5;
color.a = fragment_color.a;
}
} else {
if ((tex_info.y & 2u) == 0) {
// modulate + tcc
color = fragment_color * T0;
} else {
// decal + tcc
color.rgb = T0.rgb * 0.5;
color.a = T0.a;
}
}
color *= 2;
} else {
if ((tex_info.y & 1u) == 0) {
if ((tex_info.y & 2u) == 0) {
// modulate + no tcc
color.rgb = fragment_color.rgb;
color.a = fragment_color.a * 2;
} else {
// decal + no tcc
color.rgb = vec3(1);
color.a = fragment_color.a * 2;
}
} else {
if ((tex_info.y & 2u) == 0) {
// modulate + tcc
color = fragment_color;
} else {
// decal + tcc
color.rgb = vec3(0.5);
color.a = 1.0;
}
}
}
color.rgb *= color_mult;
if (color.a < alpha_reject) {
discard;
}
if ((tex_info.y & 4u) != 0) {
color.xyz = mix(color.xyz, fog_color.rgb, clamp(fog_color.a * fog, 0, 1));
}
}