50 lines
No EOL
1.2 KiB
HLSL
50 lines
No EOL
1.2 KiB
HLSL
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);
|
|
}
|
|
}
|
|
|
|
float valueStep(float gradient, float numberBeforeWhite=2, float maskOffset=-1) {
|
|
float num = ceil(frac((gradient + maskOffset) / (numberBeforeWhite+1))*(1 + numberBeforeWhite));
|
|
if (num == numberBeforeWhite)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
} |