看完了这一书上的代码,然后在网上查找 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://blog.csdn.net/huutu http://www.thisisgame.com.cn
示例项目打包下载:
http://pan.baidu.com/s/1o8zRrnG