Shader中RGB和HSV的相互转换

本文详细介绍了RGB和HSV两种色彩模型的定义及其相互转换的算法。RGB模型基于红、绿、蓝三种基本颜色,而HSV则从色调、饱和度和明度三个维度描述颜色。文章提供了具体的转换公式,并展示了Unity Shader语言中的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RGB中的xyz分别对应r(红色)g(绿色)b(蓝色)

HSV中的xyz分别对应h(色调、颜色)s(饱和度)v(明度)

RGB转化到HSV的算法:
max=max(R,G,B);
min=min(R,G,B);
V=max(R,G,B);
S=(max-min)/max;
if (R = max) H =(G-B)/(max-min)* 60;
if (G = max) H = 120+(B-R)/(max-min)* 60;
if (B = max) H = 240 +(R-G)/(max-min)* 60;
if (H < 0) H = H+ 360;

HSV转化到RGB的算法:
if (s = 0)
R=G=B=V;
else
H /= 60;
i = INTEGER(H);
f = H - i;
a = V * ( 1 - s );
b = V * ( 1 - s * f );
c = V * ( 1 - s * (1 - f ) );
switch(i)
case 0: R = V; G = c; B = a;
case 1: R = b; G = v; B = a;
case 2: R = a; G = v; B = c;
case 3: R = a; G = b; B = v;
case 4: R = c; G = a; B = v;
case 5: R = v; G = a; B = b;

 

Unity Shader代码

//RGB转换成HSV

    half3 RGBToHSV(half3 RGB)
    {
        half R = RGB.x, G = RGB.y, B = RGB.z;
        half3 hsv;
        half Max = max(R, max(G, B));
        half Min = min(R, max(G, B));
        if (R == Max)
        {
            hsv.x = (G - B) / (Max - Min);
        }
        if (G == Max)
        {
            hsv.x = 2 + (B - R) / (Max - Min);
        }
        if (B == Max)
        {
            hsv.x = 4 + (R - G) / (Max - Min);
        }
        hsv.x = hsv.x * 60.0;
        if (hsv.x < 0)
            hsv.x = hsv.x + 360;
        hsv.z = Max;
        hsv.y = (Max - Min) / Max;
        return hsv;
    }

//HSV转换成RGB

    half3 HSVToRGB(half3 HSV)
    {
        half R, G, B;
        if (HSV.y == 0)
        {
            R = G = B = HSV.z;
        }
        else
        {
            HSV.x = HSV.x / 60.0;
            int i = (int)HSV.x;
            half f = HSV.x - (half)i;
            half a = HSV.z * (1 - HSV.y);
            half b = HSV.z * (1 - HSV.y * f);
            half c = HSV.z * (1 - HSV.y * (1 - f));
            switch (i)
            {
            case 0: R = HSV.z; G = c; B = a;
                break;
            case 1: R = b; G = HSV.z; B = a;
                break;
            case 2: R = a; G = HSV.z; B = c;
                break;
            case 3: R = a; G = b; B = HSV.z;
                break;
            case 4: R = c; G = a; B = HSV.z;
                break;
            default: R = HSV.z; G = a; B = b;
                break;
            }
        }
        return half3(R, G, B);
    }

在Unity中,如果你想让Image组件中的黑色部分变成褐色,你可以创建一个自定义Shader来实现这个效果。这通常涉及到颜色替换混合的工作。下面是一个简单的步骤Shader代码示例: 1. 首先,在Unity中新建一个Shader,并选择“Unlit.shader Graph”作为模板。 2. 在Shader Graph中,新建一个MaterialOutput节点,将其命名为"Main"。 3. 添加一个ColorRamp节点,连接到"Base Color"输入,设置其最小值为黑色(0,0,0),最大值为你要转换颜色(例如,0.68,0.4,0.27,对应于一种接近褐色的RGB值)。 4. 创建一个HSVToRGB节点,将ColorRamp的结果从颜色空间转换RGB。这样,黑点会被映射成你设定的褐色。 5. 连接HSVToRGB的输出到"Main"节点的Color输入。 6. 确保材质应用到了Image组件上。 ```shader Shader "Custom/BrownFromBlack" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; fixed4 _ColorRampStart; fixed4 _ColorRampEnd; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); col.rgb = lerp(col.rgb, _ColorRampEnd.rgb, saturate(_ColorRampStart.r - col.a)); return col; } ENDCG } } FallBack "Diffuse" } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值