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

X 轴表示 亮度,也就是 R 通道 值。
Y轴表示有多少个像素的颜色 的 R通道是这个值。

在 Shader 中调整 色阶,就是来调整 R、G、B的值。原理是这样,但是具体的算法,应该去问Adobe了……。
- Shader "CookBookShaders/PhotoshopLevel"
- {
- Properties
- {
- _MainTex ("Base (RGB)", 2D) = "white" {}
-
- _inBlack ("Input Black",Range(0,255)) = 0
-
- _inWhite ("Input White",Range(0,255)) = 255
-
- _outBlack ("Output Black",Range(0,255)) = 0
- _outWhite ("Output White",Range(0,255)) = 255
-
- _inGamma ("Input Gamma",Range(0,2)) = 1.61
-
- }
-
- SubShader
- {
- Tags { "RenderType"="Opaque" }
- LOD 200
-
- CGPROGRAM
- #pragma surface surf Lambert
-
- sampler2D _MainTex;
-
- float _inBlack;
- float _inWhite;
- float _outBlack;
- float _outWhite;
- float _inGamma;
-
- struct Input
- {
- float2 uv_MainTex;
- };
-
- float getPixelLevel(float pixelColor)
- {
- float pixelResult;
- pixelResult = (pixelColor*255.0);//因为颜色是(0,1)范围的,这里要(0,255)参与计算
- pixelResult = max(0,pixelResult - _inBlack); //让 pixelColor也就是通道值,比如R的值,减去一个值 _inBlack ,就是变暗。
-
- pixelResult = saturate( pow( pixelResult/(_inWhite - _inBlack),_inGamma ));//用原来的亮度pixelResult除以 指定亮度与指定暗度的差值。得到值范围(1,n),pow进行次方运算。
- pixelResult = (pixelResult * (_outWhite - _outBlack) +_outBlack ) / 255.0;
- return pixelResult;
- }
-
-
-
- void surf (Input IN, inout SurfaceOutput o)
- {
- half4 c = tex2D (_MainTex, IN.uv_MainTex);
-
-
- float outRPixel = getPixelLevel(c.r);
- float outGPixel = getPixelLevel(c.g);
- float outBPixel = getPixelLevel(c.b);
-
-
- o.Albedo = float3(outRPixel,outGPixel,outBPixel);
- o.Alpha = c.a;
- }
- ENDCG
- }
- FallBack "Diffuse"
- }
调节的效果图转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
示例项目打包下载:http://pan.baidu.com/s/1o8zRrnG