mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-03-30 10:05:52 +02:00
110 lines
2.8 KiB
GLSL
110 lines
2.8 KiB
GLSL
R"(
|
|
#ifdef _32_BIT_OUTPUT
|
|
// Default. Used when we're not utilizing native fp16
|
|
#define round_to_8bit(v4) (floor(fma(v4, vec4(255.), vec4(0.5))) / vec4(255.))
|
|
#else
|
|
// FP16 version
|
|
#define round_to_8bit(v4) (floor(fma(v4, f16vec4(255.), f16vec4(0.5))) / f16vec4(255.))
|
|
#endif
|
|
|
|
#ifdef _DISABLE_EARLY_DISCARD
|
|
bool _fragment_discard = false;
|
|
#define _kill() _fragment_discard = true
|
|
#else
|
|
#define _kill() discard
|
|
#endif
|
|
|
|
#ifdef _ENABLE_WPOS
|
|
vec4 get_wpos()
|
|
{
|
|
float abs_scale = abs(wpos_scale);
|
|
return (gl_FragCoord * vec4(abs_scale, wpos_scale, 1., 1.)) + vec4(0., wpos_bias, 0., 0.);
|
|
}
|
|
#endif
|
|
|
|
#ifdef _ENABLE_FOG_READ
|
|
vec4 fetch_fog_value(const in uint mode)
|
|
{
|
|
vec4 result = vec4(fog_c.x, 0., 0., 0.);
|
|
switch(mode)
|
|
{
|
|
default:
|
|
return result;
|
|
case FOG_LINEAR:
|
|
// linear
|
|
result.y = fog_param1 * fog_c.x + (fog_param0 - 1.);
|
|
break;
|
|
case FOG_EXP:
|
|
// exponential
|
|
result.y = exp(11.084 * (fog_param1 * fog_c.x + fog_param0 - 1.5));
|
|
break;
|
|
case FOG_EXP2:
|
|
// exponential2
|
|
result.y = exp(-pow(4.709 * (fog_param1 * fog_c.x + fog_param0 - 1.5), 2.));
|
|
break;
|
|
case FOG_EXP_ABS:
|
|
// exponential_abs
|
|
result.y = exp(11.084 * (fog_param1 * abs(fog_c.x) + fog_param0 - 1.5));
|
|
break;
|
|
case FOG_EXP2_ABS:
|
|
// exponential2_abs
|
|
result.y = exp(-pow(4.709 * (fog_param1 * abs(fog_c.x) + fog_param0 - 1.5), 2.));
|
|
break;
|
|
case FOG_LINEAR_ABS:
|
|
// linear_abs
|
|
result.y = fog_param1 * abs(fog_c.x) + (fog_param0 - 1.);
|
|
break;
|
|
}
|
|
|
|
result.y = clamp(result.y, 0., 1.);
|
|
return result;
|
|
}
|
|
#endif
|
|
|
|
#ifdef _EMULATE_COVERAGE_TEST
|
|
// Purely stochastic
|
|
bool coverage_test_passes(const in vec4 _sample)
|
|
{
|
|
float random_val = _rand(gl_FragCoord);
|
|
return (_sample.a > random_val);
|
|
}
|
|
#endif
|
|
|
|
#ifdef _ENABLE_LINEAR_TO_SRGB
|
|
vec4 linear_to_srgb(const in vec4 cl)
|
|
{
|
|
vec4 low = cl * 12.92;
|
|
vec4 high = 1.055 * pow(cl, vec4(1. / 2.4)) - 0.055;
|
|
bvec4 selection = lessThan(cl, vec4(0.0031308));
|
|
return clamp(mix(high, low, selection), 0., 1.);
|
|
}
|
|
#endif
|
|
|
|
#ifdef _ENABLE_SRGB_TO_LINEAR
|
|
vec4 srgb_to_linear(const in vec4 cs)
|
|
{
|
|
vec4 a = cs / 12.92;
|
|
vec4 b = pow((cs + 0.055) / 1.055, vec4(2.4));
|
|
return _select(a, b, greaterThan(cs, vec4(0.04045)));
|
|
}
|
|
#endif
|
|
|
|
// Required by all fragment shaders for alpha test
|
|
bool comparison_passes(const in float a, const in float b, const in uint func)
|
|
{
|
|
switch (func)
|
|
{
|
|
default:
|
|
case 0: return false; //never
|
|
case 1: return (CMP_FIXUP(a) < CMP_FIXUP(b)); //less
|
|
case 2: return (CMP_FIXUP(a) == CMP_FIXUP(b)); //equal
|
|
case 3: return (CMP_FIXUP(a) <= CMP_FIXUP(b)); //lequal
|
|
case 4: return (CMP_FIXUP(a) > CMP_FIXUP(b)); //greater
|
|
case 5: return (CMP_FIXUP(a) != CMP_FIXUP(b)); //nequal
|
|
case 6: return (CMP_FIXUP(a) >= CMP_FIXUP(b)); //gequal
|
|
case 7: return true; //always
|
|
}
|
|
}
|
|
|
|
)"
|