467 lines
13 KiB
GLSL
467 lines
13 KiB
GLSL
#version 450
|
|
|
|
layout(location = 0) in vec2 coords;
|
|
|
|
layout(location = 0) out vec4 outColor;
|
|
|
|
layout(push_constant) uniform p_constants_t
|
|
{
|
|
uint frame;
|
|
uint test;
|
|
float time;
|
|
float targetNits;
|
|
};
|
|
|
|
vec3 nitsToPq(vec3 nits)
|
|
{
|
|
vec3 y = clamp(nits / 10000.0, vec3(0.0), vec3(1.0));
|
|
const float c1 = 0.8359375;
|
|
const float c2 = 18.8515625;
|
|
const float c3 = 18.6875;
|
|
const float m1 = 0.1593017578125;
|
|
const float m2 = 78.84375;
|
|
vec3 num = c1 + c2 * pow(y, vec3(m1));
|
|
vec3 den = 1.0 + c3 * pow(y, vec3(m1));
|
|
vec3 n = pow(num / den, vec3(m2));
|
|
return n;
|
|
}
|
|
|
|
vec3 pqToNits(vec3 pq)
|
|
{
|
|
const float c1 = 0.8359375;
|
|
const float c2 = 18.8515625;
|
|
const float c3 = 18.6875;
|
|
|
|
const float oo_m1 = 1.0 / 0.1593017578125;
|
|
const float oo_m2 = 1.0 / 78.84375;
|
|
|
|
vec3 num = max(pow(pq, vec3(oo_m2)) - c1, vec3(0.0));
|
|
vec3 den = c2 - c3 * pow(pq, vec3(oo_m2));
|
|
|
|
return 10000.0 * pow(num / den, vec3(oo_m1));
|
|
}
|
|
|
|
vec3 linearToSrgb(vec3 color) {
|
|
bvec3 isLo = lessThanEqual(color, vec3(0.0031308f));
|
|
|
|
vec3 loPart = color * 12.92f;
|
|
vec3 hiPart = pow(color, vec3(5.0f / 12.0f)) * 1.055f - 0.055f;
|
|
return mix(hiPart, loPart, isLo);
|
|
}
|
|
|
|
vec4 linearToSrgb(vec4 color) {
|
|
return vec4(linearToSrgb(color.rgb), color.a);
|
|
}
|
|
|
|
vec3 srgbToLinear(vec3 color) {
|
|
bvec3 isLo = lessThanEqual(color, vec3(0.04045f));
|
|
|
|
vec3 loPart = color / 12.92f;
|
|
vec3 hiPart = pow((color + 0.055f) / 1.055f, vec3(12.0f / 5.0f));
|
|
return mix(hiPart, loPart, isLo);
|
|
}
|
|
|
|
vec4 srgbToLinear(vec4 color) {
|
|
return vec4(srgbToLinear(color.rgb), color.a);
|
|
}
|
|
|
|
float gold_noise(vec2 xy, float seed)
|
|
{
|
|
const float PHI = 1.61803398874989484820459;
|
|
return fract(tan(distance(xy*PHI, xy)*seed)*xy.x);
|
|
}
|
|
|
|
float positive_mod(float flX, float flPeriod)
|
|
{
|
|
float flVal = mod( flX, flPeriod );
|
|
return ( flVal < 0 ) ? flVal + flPeriod : abs( flVal ); // fabs fixes -0
|
|
}
|
|
|
|
vec3 hsv_to_rgb(vec3 hsv)
|
|
{
|
|
if ( abs( hsv.y ) < 0.0000001 )
|
|
{
|
|
return vec3( hsv.z ) ;
|
|
}
|
|
|
|
float flHue = positive_mod( hsv.x, 1.f );
|
|
flHue *= 6.f;
|
|
|
|
int i = int(floor(flHue)); // integer part
|
|
float f = fract(flHue); // fractional part
|
|
|
|
float p = hsv.z * ( 1.f - hsv.y );
|
|
float q = hsv.z * ( 1.f - hsv.y * f );
|
|
float t = hsv.z * ( 1.f - hsv.y * ( 1.f - f ) );
|
|
|
|
switch(i)
|
|
{
|
|
case 0: return vec3( hsv.z, t, p ); break;
|
|
case 1: return vec3( q, hsv.z, p ); break;
|
|
case 2: return vec3( p, hsv.z, t ); break;
|
|
case 3: return vec3( p, q, hsv.z ); break;
|
|
case 4: return vec3( t, p, hsv.z ); break;
|
|
case 5: return vec3( hsv.z, p, q ); break;
|
|
}
|
|
|
|
return vec3( 0 );
|
|
}
|
|
|
|
vec4 plagfrog_o(vec4 outcolor, vec4 color, vec2 coord, float x, float y, float sqr, float h, float w)
|
|
{
|
|
float sqd = ( ( coord.x - x ) / w ) * ( ( coord.x - x ) / w ) + ( ( coord.y - y ) / h ) * ( ( coord.y - y ) / h );
|
|
float a = 1.0 - clamp(sqd-sqr,0.0,1.0);
|
|
|
|
vec4 ret = (color * a) + (outcolor * (1-a));
|
|
return ret;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
outColor = vec4(0.0, 0.0, 0.0, 1.0);
|
|
int nextTest = 0;
|
|
|
|
if (test == nextTest++)
|
|
{
|
|
float bodyBrightness = targetNits * 0.15;
|
|
vec2 coord = (gl_FragCoord.xy / 2.2) + vec2(-20, 50);
|
|
|
|
vec4 colg = srgbToLinear(vec4( 0.46, 0.69, 0.33, 1.0 ));
|
|
vec4 collg = srgbToLinear(vec4( 0.77, 0.89, 0.70, 1.0 ));
|
|
vec4 coldg = srgbToLinear(vec4( 0.36, 0.56, 0.23, 1.0 ));
|
|
vec4 colw = vec4(0.0);
|
|
vec4 colb = srgbToLinear(vec4( 100000.0, 0.0, 0.0, 1.0 ));
|
|
vec4 sdfOutColor = vec4( 0.0 );
|
|
sdfOutColor = plagfrog_o( sdfOutColor, colg, coord, 192.0, 165.0, 1280.0, 1.0, 1.0 );
|
|
sdfOutColor = plagfrog_o( sdfOutColor, colg, coord, 320.0, 165.0, 1280.0, 1.0, 1.0 );
|
|
sdfOutColor = plagfrog_o( sdfOutColor, colg, coord, 256.0, 256.0, 16384.0, 0.75, 1.0 );
|
|
|
|
sdfOutColor = plagfrog_o( sdfOutColor, collg, coord, 256.0, 365.0, 16384.0, 0.75, 1.25 ) * sdfOutColor.a;
|
|
|
|
sdfOutColor = plagfrog_o( sdfOutColor, colw, coord, 192.0, 165.0, 512.0, 1.0, 1.0 );
|
|
sdfOutColor = plagfrog_o( sdfOutColor, colw, coord, 320.0, 165.0, 512.0, 1.0, 1.0 );
|
|
sdfOutColor = plagfrog_o( sdfOutColor, colb, coord, 192.0, 165.0, 128.0, 1.0, 1.0 );
|
|
sdfOutColor = plagfrog_o( sdfOutColor, colb, coord, 320.0, 165.0, 128.0, 1.0, 1.0 );
|
|
|
|
sdfOutColor = plagfrog_o( sdfOutColor, coldg, coord, 224.0, 240.0, 64.0, 1.0, 1.0 );
|
|
sdfOutColor = plagfrog_o( sdfOutColor, coldg, coord, 288.0, 240.0, 64.0, 1.0, 1.0 );
|
|
|
|
sdfOutColor *= bodyBrightness;
|
|
|
|
outColor = vec4(nitsToPq(sdfOutColor.rgb), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
const vec3 start = vec3(0.0);
|
|
const vec3 end = vec3(targetNits);
|
|
|
|
vec3 color = mix(start, end, coords.x);
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
const vec3 start = vec3(0.0);
|
|
const vec3 end = vec3(nitsToPq(vec3(targetNits)).x);
|
|
|
|
vec3 color = mix(start, end, coords.x);
|
|
|
|
outColor = vec4(color, 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
const vec3 start = vec3(0.0);
|
|
const vec3 end = vec3(targetNits);
|
|
|
|
vec3 color = mix(start, end, coords.x);
|
|
if (coords.y < 1.0 / 3.0)
|
|
color.gb = vec2(0.0);
|
|
else if (coords.y < 2.0 / 3.0)
|
|
color.rb = vec2(0.0);
|
|
else
|
|
color.rg = vec2(0.0);
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
const vec3 start = vec3(0.0);
|
|
const vec3 end = vec3(nitsToPq(vec3(targetNits)).x);
|
|
|
|
vec3 color = mix(start, end, coords.x);
|
|
if (coords.y < 1.0 / 3.0)
|
|
color.gb = vec2(0.0);
|
|
else if (coords.y < 2.0 / 3.0)
|
|
color.rb = vec2(0.0);
|
|
else
|
|
color.rg = vec2(0.0);
|
|
|
|
outColor = vec4(color, 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
|
|
if (coords.x < 1.0 / 7.0)
|
|
color.rgb = vec3(1.0);
|
|
else if (coords.x < 2.0 / 7.0)
|
|
color.rg = vec2(1.0);
|
|
else if (coords.x < 3.0 / 7.0)
|
|
color.gb = vec2(1.0);
|
|
else if (coords.x < 4.0 / 7.0)
|
|
color.g = 1.0;
|
|
else if (coords.x < 5.0 / 7.0)
|
|
color.rb = vec2(1.0);
|
|
else if (coords.x < 6.0 / 7.0)
|
|
color.r = 1.0;
|
|
else
|
|
color.b = 1.0;
|
|
|
|
color *= targetNits;
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
|
|
if (coords.x < 1.0 / 7.0)
|
|
color.rgb = vec3(1.0);
|
|
else if (coords.x < 2.0 / 7.0)
|
|
color.rg = vec2(1.0);
|
|
else if (coords.x < 3.0 / 7.0)
|
|
color.gb = vec2(1.0);
|
|
else if (coords.x < 4.0 / 7.0)
|
|
color.g = 1.0;
|
|
else if (coords.x < 5.0 / 7.0)
|
|
color.rb = vec2(1.0);
|
|
else if (coords.x < 6.0 / 7.0)
|
|
color.r = 1.0;
|
|
else
|
|
color.b = 1.0;
|
|
|
|
color = max(color, vec3(0.5));
|
|
color *= targetNits;
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
|
|
if (coords.y < 1.0 / 7.0)
|
|
color.rgb = vec3(1.0);
|
|
else if (coords.y < 2.0 / 7.0)
|
|
color.rg = vec2(1.0);
|
|
else if (coords.y < 3.0 / 7.0)
|
|
color.gb = vec2(1.0);
|
|
else if (coords.y < 4.0 / 7.0)
|
|
color.g = 1.0;
|
|
else if (coords.y < 5.0 / 7.0)
|
|
color.rb = vec2(1.0);
|
|
else if (coords.y < 6.0 / 7.0)
|
|
color.r = 1.0;
|
|
else
|
|
color.b = 1.0;
|
|
|
|
color *= coords.x;
|
|
|
|
color *= targetNits;
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
float val = nitsToPq(vec3(targetNits)).x;
|
|
|
|
if (coords.y < 1.0 / 7.0)
|
|
color.rgb = vec3(val);
|
|
else if (coords.y < 2.0 / 7.0)
|
|
color.rg = vec2(val);
|
|
else if (coords.y < 3.0 / 7.0)
|
|
color.gb = vec2(val);
|
|
else if (coords.y < 4.0 / 7.0)
|
|
color.g = val;
|
|
else if (coords.y < 5.0 / 7.0)
|
|
color.rb = vec2(val);
|
|
else if (coords.y < 6.0 / 7.0)
|
|
color.r = val;
|
|
else
|
|
color.b = val;
|
|
|
|
color *= coords.x;
|
|
|
|
outColor = vec4(color, 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
|
|
if (coords.y < 1.0 / 7.0)
|
|
color.rgb = vec3(1.0);
|
|
else if (coords.y < 2.0 / 7.0)
|
|
color.rg = vec2(1.0);
|
|
else if (coords.y < 3.0 / 7.0)
|
|
color.gb = vec2(1.0);
|
|
else if (coords.y < 4.0 / 7.0)
|
|
color.g = 1.0;
|
|
else if (coords.y < 5.0 / 7.0)
|
|
color.rb = vec2(1.0);
|
|
else if (coords.y < 6.0 / 7.0)
|
|
color.r = 1.0;
|
|
else
|
|
color.b = 1.0;
|
|
|
|
color *= floor(coords.x * 21.0) / 21.0;
|
|
|
|
color *= targetNits;
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
float val = nitsToPq(vec3(targetNits)).x;
|
|
|
|
if (coords.y < 1.0 / 7.0)
|
|
color.rgb = vec3(val);
|
|
else if (coords.y < 2.0 / 7.0)
|
|
color.rg = vec2(val);
|
|
else if (coords.y < 3.0 / 7.0)
|
|
color.gb = vec2(val);
|
|
else if (coords.y < 4.0 / 7.0)
|
|
color.g = val;
|
|
else if (coords.y < 5.0 / 7.0)
|
|
color.rb = vec2(val);
|
|
else if (coords.y < 6.0 / 7.0)
|
|
color.r = val;
|
|
else
|
|
color.b = val;
|
|
|
|
color *= floor(coords.x * 21.0) / 21.0;
|
|
|
|
outColor = vec4(color, 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
const vec3 color = vec3(hsv_to_rgb(vec3(1.0 - coords.y, coords.x, 1.0)) * targetNits);
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
if ((int(gl_FragCoord.x) & 1) == 0)
|
|
color = vec3(targetNits);
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
if ((int(gl_FragCoord.y) & 1) == 0)
|
|
color = vec3(targetNits);
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
if (((int(gl_FragCoord.x) & 1) == 0) == ((int(gl_FragCoord.y) & 1) == 0))
|
|
color = vec3(targetNits);
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
const vec3 barycentrics = vec3(1.0 - coords.x - coords.y, coords.x, coords.y) * targetNits;
|
|
|
|
outColor = vec4(nitsToPq(barycentrics), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
float value = ((frame & 1) == 0) ? targetNits : 0.0;
|
|
|
|
outColor = vec4(nitsToPq(vec3(value)), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
float value = ((frame & 1) == 0) ? targetNits : 0.0;
|
|
|
|
outColor = vec4(nitsToPq(vec3(value, 0, 0)), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
float value = ((frame & 1) == 0) ? targetNits : 0.0;
|
|
|
|
outColor = vec4(nitsToPq(vec3(0, value, 0)), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
float value = ((frame & 1) == 0) ? targetNits : 0.0;
|
|
|
|
outColor = vec4(nitsToPq(vec3(0, 0, value)), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
float value = ((frame & 1) == 0) ? targetNits : 0.0;
|
|
|
|
uint index = (frame >> 1u) % 3u;
|
|
vec3 color = vec3(0);
|
|
color[index] = value;
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
const float seed = fract(time);
|
|
|
|
vec3 value = vec3(gold_noise(gl_FragCoord.xy, seed + 0.2)) * targetNits;
|
|
|
|
outColor = vec4(nitsToPq(value), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
const float seed = fract(time);
|
|
|
|
vec3 value = vec3(
|
|
gold_noise(gl_FragCoord.xy, seed + 0.1),
|
|
gold_noise(gl_FragCoord.xy, seed + 0.2),
|
|
gold_noise(gl_FragCoord.xy, seed + 0.3)) * targetNits;
|
|
|
|
outColor = vec4(nitsToPq(value), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
if (((int(gl_FragCoord.x / 32.0) & 1) == 0) == ((int(gl_FragCoord.y / 32.0) & 1) == 0))
|
|
color = vec3(targetNits);
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
if (((int(gl_FragCoord.x / 32.0) & 1) == 0) == ((int(gl_FragCoord.y / 32.0) & 1) == 0))
|
|
color = vec3(targetNits, 0, 0);
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
if (((int(gl_FragCoord.x / 32.0) & 1) == 0) == ((int(gl_FragCoord.y / 32.0) & 1) == 0))
|
|
color = vec3(0, targetNits, 0);
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
else if (test == nextTest++)
|
|
{
|
|
vec3 color = vec3(0.0);
|
|
if (((int(gl_FragCoord.x / 32.0) & 1) == 0) == ((int(gl_FragCoord.y / 32.0) & 1) == 0))
|
|
color = vec3(0, 0, targetNits);
|
|
|
|
outColor = vec4(nitsToPq(color), 1.0);
|
|
}
|
|
} |