float3 hueShift(float3 color, float hueAdjust) { const float3 kRGBToYPrime = float3(0.299, 0.587, 0.114); const float3 kRGBToI = float3(0.596, -0.275, -0.321); const float3 kRGBToQ = float3(0.212, -0.523, 0.311); const float3 kYIQToR = float3(1.0, 0.956, 0.621); const float3 kYIQToG = float3(1.0, -0.272, -0.647); const float3 kYIQToB = float3(1.0, -1.107, 1.704); float YPrime = dot(color, kRGBToYPrime); float I = dot(color, kRGBToI); float Q = dot(color, kRGBToQ); float hue = atan2(Q, I); float chroma = sqrt(I * I + Q * Q); hue += hueAdjust; Q = chroma * sin(hue); I = chroma * cos(hue); float3 yIQ = float3(YPrime, I, Q); return float3(dot(yIQ, kYIQToR), dot(yIQ, kYIQToG), dot(yIQ, kYIQToB)); } float2 uvRot(float2 uv, float angle) { return mul(float2x2(cos(angle), -sin(angle), sin(angle), cos(angle)), uv); } float lerp3(float a, float b, float c, float t) { if (t < 0.5f) { return lerp(a, b, t * 2); } else { return lerp(b, c, (t-0.5f)*2); } }