看完了这一书上的代码,然后在网上查找 Photoshop 色阶的一些解释,大致理解为:调整色阶就是调整亮度,也就是调整纹理 R、G、B 通道的数值大小。
下面是 Photoshop 中的直方图转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
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://pan.baidu.com/s/1o8zRrnG