UnityShader:HSV(色相,饱和度,亮度)转换

http://blog.csdn.net/costfine/article/details/46930473

发现其实美术调整颜色的时候大部分都是调整的HSV,因为可以方便的分别调整色相(hue)、饱和度(saturation)和色调(value)。例如人们要将颜色调整的偏红一点,那么只需要修改色相, 如果使用RGB的话,就需要同时调整3个值,仅仅只是增加R值的话,理论上讲,只是把红色值加重了而已。就算是平时使用的调色板,大部分也是按照HSV来的,例如U3D的调色板: 

颜色空间有很多中,RGB、HSL、HSV、CMYK...等等好多,如果有兴趣的话可以去搜搜。但我们这里只用HSV 。
比如一张贴图是红色系的,我们要改成绿色系,只需要将hue值偏移到绿色值就好了。
各种颜色空间转换的公式:
http://www.easyrgb.com/index.php?X=MATH&H=22#text22

方法我们知道了,公式也有了,下面直接写代码。

Shader "Tornado/ColorGradation_HSV" {
    Properties {
        //贴图
        _MainTex ("MainTex (RGB)", 2D) = "white" {}
        //Hue的值范围为0-359. 其他两个为0-1 ,这里我们设置到3,因为乘以3后 都不一定能到超过.
        _Hue ("Hue", Range(0,359)) = 0
        _Saturation ("Saturation", Range(0,3.0)) = 1.0
        _Value ("Value", Range(0,3.0)) = 1.0
    }
    SubShader {
    Pass {
        Tags { "RenderType"="Opaque" }
        LOD 200

        Lighting Off

        CGPROGRAM
        #pragma vertex vert_img
        #pragma fragment frag
        #include "UnityCG.cginc"

        sampler2D _MainTex;
        half _Hue;
        half _Saturation;
        half _Value;

        struct Input {
            float2 uv_MainTex;
        };

        //RGB to HSV
        float3 RGBConvertToHSV(float3 rgb)
        {
            float R = rgb.x,G = rgb.y,B = rgb.z;
            float3 hsv;
            float max1=max(R,max(G,B));
            float min1=min(R,min(G,B));
            if (R == max1)
            {
                hsv.x = (G-B)/(max1-min1);
            }
            if (G == max1)
            {
                hsv.x = 2 + (B-R)/(max1-min1);
                }
            if (B == max1)
            {
                hsv.x = 4 + (R-G)/(max1-min1);
                }
            hsv.x = hsv.x * 60.0;
            if (hsv.x < 0)
                hsv.x = hsv.x + 360;
            hsv.z=max1;
            hsv.y=(max1-min1)/max1;
            return hsv;
        }

        //HSV to RGB
        float3 HSVConvertToRGB(float3 hsv)
        {
            float R,G,B;
            //float3 rgb;
            if( hsv.y == 0 )
            {
                R=G=B=hsv.z;
            }
            else
            {
                hsv.x = hsv.x/60.0;
                int i = (int)hsv.x;
                float f = hsv.x - (float)i;
                float a = hsv.z * ( 1 - hsv.y );
                float b = hsv.z * ( 1 - hsv.y * f );
                float 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 float3(R,G,B);
        }       

        fixed4 frag (v2f_img i) : SV_Target
        {
            fixed4 original = tex2D(_MainTex, i.uv);    //获取贴图原始颜色

            float3 colorHSV;
            colorHSV.xyz = RGBConvertToHSV(original.xyz);   //转换为HSV
            colorHSV.x += _Hue; //调整偏移Hue值
            colorHSV.x = colorHSV.x%360;    //超过360的值从0开始

            colorHSV.y *= _Saturation;  //调整饱和度
            colorHSV.z *= _Value;                           

            original.xyz = HSVConvertToRGB(colorHSV.xyz);   //将调整后的HSV,转换为RGB颜色

            return original;
        }
        ENDCG
    }
    }
    FallBack "Diffuse"
}原图和调整Hue后的对比,像不像以前玩格斗游戏,两个玩家选同一个角色,然后2P变色的效果… 

同样的也可以应用到摄像机特效上….瞬间改变场景的氛围 

当然还可以调整饱和度和亮度。。。饱和度调整到0就成了黑白图了

参考 
http://blog.csdn.net/idfaya/article/details/6770414

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 20:37:23

UnityShader:HSV(色相,饱和度,亮度)转换的相关文章

颜色矩阵 滤镜 ColorMatrix 色相 饱和度 亮度

颜色矩阵原理 色彩的三要素 1.色相.色相通俗的说就是"颜色",色相的改变就是颜色的改变,色相的调节伴随着红橙黄绿蓝紫的变化. 2.亮度.明度通俗的说就是"光照度",明度的改变就是光照在物体上带来的改变,明度的调节伴随着越高,光越强,越泛白(就像过曝一样,往白色上偏离):越低,光越弱,越往黑里偏 3.饱和度.饱和度通俗的说就是"色彩的纯度",饱和度的改变会影响颜色的鲜艳程度,以红色为例子,越高,越接近红色,越低则越接近灰色(黑白) 在编程中有时候

android图像处理系列之三--图片色调饱和度、色相、亮度处理

原图: 处理后: 下面贴代码: 一.图片处理层: [java] view plaincopy package com.jacp.tone.view; import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.ColorMatrix; import android

photoshop:调整图层之色相/饱和度

色相/饱和度:快速调色及调整图片色彩浓淡明暗 面板主要参数:色相.饱和度.明度 色相用来改变颜色:顺序按红-黄-绿-青-蓝-洋红 饱和度用来控制色彩浓淡 明度控制色彩明暗 勾选"着色",图片会变成单色 受影响区域: photoshop:调整图层之色相/饱和度,布布扣,bubuko.com

CoreImage 可以用滤镜来处理图片,比如修改饱和度,亮度,对比度等

// //  ViewController.m //  UI-CoreImage // //  Created by Bruce on 15/5/22. //  Copyright (c) 2015年 Bruce. All rights reserved. // /*  CoreImage 可以用滤镜来处理图片,比如修改饱和度,亮度,对比度等  它利用GPU(或者CPU,取决于客户)来非常快速.甚至实时地处理图像数据和视频的帧.多个Core Image滤镜可以叠加在一起,从而可以一次性地产生多重

android图像处理系列之三-- 图片色调饱和度、色相、亮度处理

原图: 处理后: 下面贴代码: 一.图片处理层: [java] view plain copy package com.jacp.tone.view; import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.ColorMatrix; import androi

Android学习笔记之-:对Android图像色调饱和度亮度处理

首先也简单介绍下图像的RGBA模型,R指红色(Red),G指绿色(Green),B指蓝色(Blue)及A指透明度(Alpha),由这四种元素搭配组合成了各种各样的颜色. 处理工具类及方法: public class ImageTools { /** * 对图片进行处理 * @description: * @date 2015-8-12 下午8:45:05 */ public static Bitmap getColorImage(Bitmap bitmap, float sx, float bh

关于色相\饱和度

说白了就是控制你要调整的范围,选范围,加范围,减范围. 不过这个范围的变化参照是色相,所以你才会觉得高深,其实还是简单.

RGB与HSV颜色互想转换

这段代码我已经不太记得是从哪抄的了,惭愧: float3 rgb2hsv(float3 c) { float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); float k1 = step(c.b, c.g); float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), k1); float k2 = step(p.x, c.r); float4 q = lerp(float4(p.xyw, c.r

RGB与HSB之间的转换公式

先来了解一些概念: 1.RGB是一种加色模型,就是将不同比例的Red/Green/Blue混合在一起得到新颜色.通常RGB颜色模型表示为: 2.HSB(HSV) 通过色相/饱和度/亮度三要素来表达颜色. H(Hue):表示颜色的类型(例如红色,绿色或者黄色).取值范围为0—360.其中每一个值代表一种颜色. S(Saturation):颜色的饱和度.从0到1.有时候也称为纯度.(0表示灰度图,1表示纯的颜色) B(Brightness or Value):颜色的明亮程度.从0到1.(0表示黑色,