【Unity3D Shader】学习笔记-图片滤镜①
前言
本篇开始连续的几篇文章主要介绍各种图片滤镜效果,本篇包括图片置灰,黑白图,发黄的老照片效果。
[声明:本笔记系列文章的图片资源都源自百度图片搜索,如有问题联系我]
一、图片置灰
(左侧置灰,右侧对比)
通过将原图RGB颜色 点乘 心理学置灰值(0.299,0.587,0.114)即可得到灰度图片。
fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); // 这个是一个常量 心理学置灰值 fixed3 gray_color = fixed3(0.299, 0.587, 0.114); fixed gray = dot(col.rgb , gray_color); fixed4 final_col = fixed4(gray, gray, gray, col.a); return final_col; }
二、PS中的纯黑白算法
效果和上面的比较相似,Photoshop CS图像黑白调整功能的计算公式为:
gray= (max - mid) * ratio_max + (mid - min) * ratio_max_mid + min
公式中:gray为像素灰度值,max、mid和min分别为图像像素R、G、B分量颜色的最大值、中间值和最小值,ratio_max为max所代表的分量颜色(单色)比率,ratio_max_mid则为max与mid两种分量颜色所形成的复色比率。
默认的单色及复色比率为:
Color_Ratio_Red =0.4;
Color_Ratio_Yellow =0.6;
Color_Ratio_Green =0.4;
Color_Ratio_Cyan =0.6;
Color_Ratio_Blue =0.2;
Color_Ratio_Magenta =0.8;
fixed4 black_white_tex(float2 uv) { #define RED_COLOR_RATIO 0.4 #define GREEN_COLOR_RATIO 0.4 #define BLUE_COLOR_RATIO 0.2 fixed4 main_col = tex2D(_MainTex, uv); // 黑白的公式 三通道的最大值max,最小值min,以及中间值mid //gray= (max - mid) * ratio_max + (mid - min) * ratio_max_mid + min fixed max_value = max(main_col.r, max(main_col.g, main_col.b)); fixed min_value = min(main_col.r, min(main_col.g, main_col.b)); // 通过rgb相加减去最大最小值就可以得到中间值 fixed mid_value = main_col.r+main_col.g+main_col.b - max_value - min_value; // if min_value == r 取 0.4, else if min_value == g 取 0.2, else 取 0.4 fixed ratio_max_mid = lerp(GREEN_COLOR_RATIO, lerp(BLUE_COLOR_RATIO, RED_COLOR_RATIO, step(main_col.b, min_value)), step(main_col.g, min_value)); // if max_value == r 取 0.4, else if max_value == g 取 0.4, else 取 0.2 fixed ratio_max = lerp(RED_COLOR_RATIO, lerp(GREEN_COLOR_RATIO, BLUE_COLOR_RATIO, step(main_col.b, max_value)), step(main_col.g, max_value)); fixed temp = (max_value - mid_value) * ratio_max + (mid_value - min_value) * ratio_max_mid + min_value; fixed3 final_col = fixed3(temp, temp, temp); return fixed4(final_col, main_col.a); }
三、发黄的老照片
公式比较简单,通过对原图的RGB的各个通道进行调色后呈现发黄的效果:
new_r=0.393*R+0.769*G+0.189*B;
new_g=0.349*R+0.686*G+0.168*B;
new_b=0.272*R+0.534*G+0.131*B;
fixed4 old_pic(fixed2 uv) { fixed4 main_col = tex2D(_MainTex, uv); fixed r = 0.393 * main_col.r + 0.769*main_col.g + 0.189 * main_col.b; fixed g = 0.349 * main_col.r + 0.686*main_col.g + 0.168 * main_col.b; fixed b = 0.272 * main_col.r + 0.534*main_col.g + 0.131 * main_col.b; fixed3 final_col = fixed3(r, g, b); return fixed4(final_col, main_col.a); }