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

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

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

  1. OpenCV 学习笔记(10)HSV颜色空间及颜色空间转换(RGB-HSV)

    1.1 颜色空间介绍 RGB 颜色空间是大家最熟悉的颜色空间,即三基色空间,任何一种颜色都可以由该三种 颜色混合而成.然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV(色 调 H ...

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

    色相/饱和度:快速调色及调整图片色彩浓淡明暗 面板主要参数:色相.饱和度.明度 色相用来改变颜色:顺序按红-黄-绿-青-蓝-洋红 饱和度用来控制色彩浓淡 明度控制色彩明暗 勾选“着色”,图片会变成单色 ...

  3. PS日记二(调色:色阶,曲线,色相/饱和度,色彩平衡,蒙板)

    基础知识一:在PS操作中为什么要复制图层(ctrl+J)? 答:复制图层主要是为了 备份原图层,在副本中进行操作 如果说你副本弄坏了,还有原来的PS复制图层一方面是保全原图.二是因为图层是ps操作的基 ...

  4. GDI+在Delphi程序的应用 Photoshop色相饱和度明度功能

    本文用GDI+实现Photoshop色相/饱和度/明度功能,参照我的其它有关GDI+在 Delphi程序的应用的文章,代码也可供TBitmap使用. 有些人不喜欢,或者不太懂Delphi的BASM代码 ...

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

    原图: 处理后: 下面贴代码: 一.图片处理层: package com.jacp.tone.view; import java.util.ArrayList; import android.cont ...

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

    原图: 处理后: 下面贴代码: 一.图片处理层: package com.jacp.tone.view; import java.util.ArrayList; import android.cont ...

  7. 颜色的RGB-计算HSV公式色度/饱和度/亮度 简化代码

    计算颜色的HSV值 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创新! ...

  8. R 语言画图的基本参数

    R 语言画图的基本参数 点 点的种类 点的种类参数为 pch,每一种符号对应一个数字编号 # 点有25种,为了展示25种点 x = 1:25 y = 1:25 x ## [1] 1 2 3 4 5 6 ...

  9. RGB与HSB之间转换

    先来了解一些概念: 1.RGB是一种加色模型,就是将不同比例的Red/Green/Blue混合在一起得到新颜色.通常RGB颜色模型表示为: 2.HSB(HSV) 通过色相/饱和度/亮度三要素来表达颜色 ...

随机推荐

  1. tomcat报错

    错误日志如下: 十月 10, 2016 10:44:57 上午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.serv ...

  2. 【BZOJ 3052】【WC 2013】糖果公园

    对树的dfs序分块,打开了新世界的大门233 第一关键字是l所在的块,第二关键字是r所在的块,第三关键字是时间,分完块后暴力莫队即可 #include<cmath> #include< ...

  3. 总结Controller向View传值的方式(转)

    总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通View页面传一个Model对象 向强类型页面传传 ...

  4. WordPress 博客文章时间格式the_time()设置

    国外设计的WordPress 主题里的文章的时间格式是类似“十一月 21, 2010”这种格式的,而中国人习惯的是年在前,月紧跟其后,日在末尾,所以看国外的就显得很别扭,但是我们可以通过修改WP时间代 ...

  5. Http 和TCP的关系,TCP长连接和短连接有什么区别?

    HTTP 协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用.由于HTTP在 ...

  6. slim

    Slim 是一个非常优雅的 PHP 微框架,非常适合做API,支持多种http请求方式,比如get,post,delete,put等 安装使用Composer composer require sli ...

  7. namespace for c++

    namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都可能使用相同的 ...

  8. 【BZOJ-1113】海报PLA 单调栈

    1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 896  Solved: 573[Submit][Status ...

  9. 禁止apache显示目录索引的常见方法(apache禁止列目录)

    禁止Apache显示目录索引,禁止Apache显示目录结构列表,禁止Apache浏览目录,这是网上提问比较多的,其实都是一个意思.下面说下禁止禁止Apache显示目录索引的常见的3种方法. 要实现禁止 ...

  10. 控件的invoke和beginInvoke方法

    System.Windows.Forms.Timer 的timer是在主线程上执行的,因此在timer的tick事件中操作界面上的控件不会发生线程的安全性检测. Control的invoke和begi ...