cbuffer Screen : register(b0, space3) { float x; float y; float c; float d; }; float srgb( float color ) { return (color<0.0031308) ? color*12.92:1.055*pow(color,(1.0/2.4))-0.055; } float3 oklab_srgb(float3 c) { float l_ = c.x + 0.3963377774f * c.y + 0.2158037573f * c.z; float m_ = c.x - 0.1055613458f * c.y - 0.0638541728f * c.z; float s_ = c.x - 0.0894841775f * c.y - 1.2914855480f * c.z; float l = l_*l_*l_; float m = m_*m_*m_; float s = s_*s_*s_; float3 lin = float3( +4.0767416621f * l - 3.3077115913f * m + 0.2309699292f * s, -1.2684380046f * l + 2.6097574011f * m - 0.3413193965f * s, -0.0041960863f * l - 0.7034186147f * m + 1.7076147010f * s ); return float3(srgb(lin.x), srgb(lin.y), srgb(lin.z)); } float3 oklch_oklab(float3 lch) { float a = lch.y * cos(lch.z); float b = lch.y * sin(lch.z); return float3(lch.x, a, b); } float3 please(float3 col) { return oklab_srgb(oklch_oklab(col)); } float sdCircle(float2 p, float r) { return length(p)-r; } float2 smin( float a, float b, float k ) { float h = 1.0 - min( abs(a-b)/(4.0*k), 1.0 ); float w = h*h; float m = w*0.5; float s = w*k; return (aradians(180)) { col.z = ( col.z + radians(180)) % radians(360); col2.z = ( col2.z + radians(180)) % radians(360); float3 l = lerp(col, col2, b); l.z = (l.z + radians(180)) % radians(360); return l; } return lerp(col, col2, b); } float4 main(float4 pos : SV_Position) : SV_Target { float2 p = float2(pos.x - ( x/2 ), pos.y - ( y / 2)); float d = sdCircle(p, 100.0); float3 scol = dcol(float3(0.75, 0.14, radians(360.0)), d); float d2 = sdCircle(p-float2(100.0, 120.0), 80.0); float3 scol2 = dcol(float3(0.75, 0.14, radians(173.0)), d2); float d3 = sdCircle(p-float2(-100.0, 120.0), 70.0); float3 scol3 = dcol(float3(0.75, 0.14, radians(250.0)), d3); float2 d_d2 = smin(d, d2, 20); float3 c_c2 = lcol(scol, scol2, d_d2.y); float cl = max(-d_d2.x, 0.0); float2 d_d3 = smin(d, d3, 20); float3 c_c3 = lcol(scol, scol3, d_d3.y); float cl2 = max(-d_d3.x, 0.0); float2 d2_d3 = smin(d2, d3, 20); float3 c2_c3 = lcol(scol2, scol3, d2_d3.y); float cl3 = max(-d2_d3.x, 0.0); float dist = min(min(d_d2.x, d_d3.x), d2_d3.x); float sum = cl + cl2 + cl3; float3 col = lcol(lcol(c_c2, c_c3, cl2/(cl+cl2)), c2_c3, cl3/sum); if (any(isnan(col))){ col = float3(0, 0, 0); } float aaf = fwidth(dist); float alpha = smoothstep(0, -aaf, dist); col = please(col) * alpha; float3 bg = float3(pos.x / x, pos.y / y, 1.0) * (1-alpha); return float4(col + bg, 1.0); }