Unity Shaders and Effects Cookbook:实现Photoshop色阶效果

发表于2017-11-23
评论0 1.6k浏览

这篇文章要介绍的是如何实现Photoshop色阶效果,在网上查了些 Photoshop 色阶的一些解释,大致理解为:调整色阶就是调整亮度,也就是调整纹理 R、G、B 通道的数值大小。


下面是 Photoshop 中的直方图:


X 轴表示 亮度,也就是 R 通道 值。

Y轴表示有多少个像素的颜色 的 R通道是这个值。


在 Shader 中调整 色阶,就是来调整 R、G、B的值。原理是这样,但是具体的算法,应该去问Adobe了……。

  1. Shader "CookBookShaders/PhotoshopLevel"   
  2. {  
  3.     Properties   
  4.     {  
  5.         _MainTex ("Base (RGB)", 2D) = "white" {}  
  6.   
  7.         _inBlack ("Input Black",Range(0,255)) = 0  
  8.   
  9.         _inWhite ("Input White",Range(0,255)) = 255  
  10.   
  11.         _outBlack ("Output Black",Range(0,255)) = 0  
  12.         _outWhite ("Output White",Range(0,255)) = 255  
  13.   
  14.         _inGamma ("Input Gamma",Range(0,2)) = 1.61  
  15.   
  16.     }  
  17.   
  18.     SubShader   
  19.     {  
  20.         Tags { "RenderType"="Opaque" }  
  21.         LOD 200  
  22.           
  23.         CGPROGRAM  
  24.         #pragma surface surf Lambert  
  25.   
  26.         sampler2D _MainTex;  
  27.   
  28.         float _inBlack;  
  29.         float _inWhite;  
  30.         float _outBlack;  
  31.         float _outWhite;  
  32.         float _inGamma;  
  33.   
  34.         struct Input   
  35.         {  
  36.             float2 uv_MainTex;  
  37.         };  
  38.   
  39.         float getPixelLevel(float pixelColor)  
  40.         {  
  41.             float pixelResult;  
  42.             pixelResult = (pixelColor*255.0);//因为颜色是(0,1)范围的,这里要(0,255)参与计算  
  43.             pixelResult = max(0,pixelResult - _inBlack); //让 pixelColor也就是通道值,比如R的值,减去一个值 _inBlack ,就是变暗。  
  44.   
  45.             pixelResult = saturate( pow( pixelResult/(_inWhite - _inBlack),_inGamma ));//用原来的亮度pixelResult除以 指定亮度与指定暗度的差值。得到值范围(1,n),pow进行次方运算。  
  46.             pixelResult = (pixelResult * (_outWhite - _outBlack) +_outBlack ) / 255.0;  
  47.             return pixelResult;  
  48.         }  
  49.   
  50.   
  51.   
  52.         void surf (Input IN, inout SurfaceOutput o)   
  53.         {  
  54.             half4 c = tex2D (_MainTex, IN.uv_MainTex);  
  55.   
  56.   
  57.             float outRPixel = getPixelLevel(c.r);  
  58.             float outGPixel = getPixelLevel(c.g);  
  59.             float outBPixel = getPixelLevel(c.b);  
  60.   
  61.   
  62.             o.Albedo = float3(outRPixel,outGPixel,outBPixel);  
  63.             o.Alpha = c.a;  
  64.         }  
  65.         ENDCG  
  66.     }   
  67.     FallBack "Diffuse"  
  68. }  

调节的效果图转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn



示例项目打包下载:http://pan.baidu.com/s/1o8zRrnG

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: