MENU

• 2026 年 04 月 20 日 • 已有 10 只咪围观过 • -学海无涯-

碎碎念:

一般网上用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;
返回文章列表 打赏
本页链接的二维码
打赏二维码