碎碎念:
一般网上用rgba来控制uv的方案好像多一点,但是我感觉色环直接上下左右拉好像更直观更爽一点,网上没有看到类似方案,于是我自己写了一个。
主要参考的是ronja的方案:HSV Color Space
主要思路:
这个颜色拆成 色相 Hue 和 饱和度 Saturation。
Hue 决定往哪个方向偏移,Saturation 决定偏移有多。
然后用这个结果去改 UV,最后再用新的 UV 去采样 MainTex。
HSV 里 Hue 本来就可以看成一个圆周角度,而 Saturation 可以理解成离灰色中心有多远
HLSL:
float3 C = max(ControlColor, 0.0);
float maxC = max(C.r, max(C.g, C.b));
if (maxC > 0.00001)
{
C /= maxC;
}
float cMax = max(C.r, max(C.g, C.b));
float cMin = min(C.r, min(C.g, C.b));
float delta = cMax - cMin;
float sat = 0.0;
if (cMax > 0.00001)
{
sat = delta / cMax;
}
float hue = 0.0;
if (delta > 0.00001)
{
if (cMax == C.r)
{
hue = (C.g - C.b) / delta;
if (hue < 0.0)
{
hue += 6.0;
}
}
else if (cMax == C.g)
{
hue = (C.b - C.r) / delta + 2.0;
}
else
{
hue = (C.r - C.g) / delta + 4.0;
}
hue /= 6.0;
}
float angle = hue * 6.28318530718 + AngleOffsetDeg * 0.01745329252;
float2 dir = float2(cos(angle), -sin(angle));
float sat01 = saturate((sat - MinSat) / max(0.00001, (1.0 - MinSat)));
float mag = OffsetStrength * pow(sat01, SatPower);
float2 newUV = UV - dir * mag;
newUV = saturate(newUV);
float3 texColor = Texture2DSample(MainTex, MainTexSampler, newUV).rgb;
return texColor;