色彩与HSV模型(转)

【基本知识】

颜色

可分为红绿蓝三原色的组成。

也可分为 按色调,饱和度,亮度构成。

色调

颜色色别。如玫瑰红、桔黄、柠檬黄、钴蓝、群青、翠绿

饱和度 (纯度)

指色彩的纯净程度。含有色彩成分的比例愈大,则色彩的纯度愈高。可见光谱的各种单色光是最纯的颜色,为极限纯度。当一种颜色掺入黑、白或其他彩色时,纯度就产生变化。当掺入的色达到很大的比例时,在眼睛看来,原来的颜色将失去本来的光彩,而变成掺和的颜色了。当然这并不等于说在这种被掺和的颜色里已经不存在原来的色素,而是由于大量的掺入其他彩色而使得原来的色素被同化,人的眼睛已经无法感觉出来了。

亮度(明度)

指色彩中深浅程度,明暗程度。在无彩色中,白色明度最高,黑色明度最低。有彩色中:黄色明度最高、兰紫色明度最低。

【HSV模型】

HSV(Hue, Saturation, Value)是由此而来的一种颜色空间, 也称六角锥体模型(Hexcone Model)。

HSV也是Photoshop及Unity中常用的颜色表示方式。

H 色调

用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

S 饱和度

可简单理解为颜色偏离同亮度灰色的程度。饱和度取值范围为0.0~1.0,值越大,颜色越饱和。

V 亮度

取值范围为0.0~1.0

附上两个Shader,一个是好友Canvas写的降低饱和度的Shader,包含了 HSV和RGB的相互转换函数。

另一个是我写的简易降低饱和度的Shader。

Shader "ProjectS/Saturation_Render" {

Properties {

_MainTex ("Base (RGB)", 2D) = "white" {}

}

SubShader {

Pass {

CGPROGRAM

#pragma vertex vert_img

#pragma fragment frag

#pragma fragmentoption ARB_precision_hint_fastest

#include "UnityCG.cginc"

#pragma target 2.0

uniform sampler2D _MainTex;

float3 rgb_to_hsv_no_clip(float3 RGB)

{

float3 HSV;

float minChannel, maxChannel;

if (RGB.x > RGB.y) {

maxChannel = RGB.x;

minChannel = RGB.y;

}else {

maxChannel = RGB.y;

minChannel = RGB.x;

}

if (RGB.z > maxChannel) maxChannel = RGB.z;

if (RGB.z < minChannel) minChannel = RGB.z;

HSV.xy = 0;

HSV.z = maxChannel;

float delta = maxChannel - minChannel;//Delta RGB value

if (delta != 0) {// If gray, leave HS at zero

HSV.y = delta / HSV.z;

float3 delRGB;

delRGB = (HSV.zzz - RGB + 3*delta) / (6.0*delta);

if( RGB.x == HSV.z ) HSV.x = delRGB.z - delRGB.y;

else if ( RGB.y == HSV.z ) HSV.x = ( 1.0/3.0) + delRGB.x - delRGB.z;

else if ( RGB.z == HSV.z ) HSV.x = ( 2.0/3.0) + delRGB.y - delRGB.x;

}

return (HSV);

}

float3 hsv_to_rgb(float3 HSV)

{

float3 RGB = HSV.z;

float var_h = HSV.x * 6;

float var_i = floor(var_h);// Or ... var_i = floor( var_h )

float var_1 = HSV.z * (1.0 - HSV.y);

float var_2 = HSV.z * (1.0 - HSV.y * (var_h-var_i));

float var_3 = HSV.z * (1.0 - HSV.y * (1-(var_h-var_i)));

if(var_i == 0) { RGB = float3(HSV.z, var_3, var_1); }

else if (var_i == 1) { RGB = float3(var_2, HSV.z, var_1); }

else if (var_i == 2) { RGB = float3(var_1, HSV.z, var_3); }

else if (var_i == 3) { RGB = float3(var_1, var_2, HSV.z); }

else if (var_i == 4) { RGB = float3(var_3, var_1, HSV.z); }

else{ RGB = float3(HSV.z, var_1, var_2); }

return (RGB);

}

fixed4 frag (v2f_img i) : SV_Target

{

fixed4 original = tex2D(_MainTex, i.uv);

float3 RGB = float3(original.r, original.g, original.b);

float3 HSV = rgb_to_hsv_no_clip(RGB);

HSV.y = HSV.y - HSV.y * 0.6f;

RGB = hsv_to_rgb(HSV);

fixed4 output = fixed4(RGB.x, RGB.y, RGB.z, 1);

return output;

}

ENDCG

}

}

Fallback off

}

Shader "Custom/Easy_Saturation" {

Properties {

_MainTex ("Base (RGB)", 2D) = "white" {}

_Deviation ("Deviation", Range(0,1)) = 0.5

}

SubShader {

Pass {

CGPROGRAM

#pragma vertex vert_img

#pragma fragment frag

#pragma fragmentoption ARB_precision_hint_fastest

#include "UnityCG.cginc"

uniform sampler2D _MainTex;

float _Deviation;

float4 ToGray(float4 c)

{

float maxv;

maxv = max(c.x,c.y);

maxv = max(maxv,c.z);

float x = (maxv-c.x)*_Deviation+c.x;

float y = (maxv-c.y)*_Deviation+c.y;

float z = (maxv-c.z)*_Deviation+c.z;

return float4(x,y,z,c.a);

}

fixed4 frag (v2f_img i) : SV_Target

{

fixed4 original = tex2D(_MainTex, i.uv);

return ToGray(original);

}

ENDCG

}

}

Fallback "Diffuse"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,509评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,093评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 171,632评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,848评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,855评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,353评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,738评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,706评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,240评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,268评论 3 345
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,398评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,012评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,709评论 3 337
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,178评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,312评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,932评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,464评论 2 365

推荐阅读更多精彩内容