Unity Shaders and Effects Cookbook (2-7)实现 Photoshop 色阶效果

看完了这一书上的代码,然后在网上查找 Photoshop 色阶的一些解释,大致理解为:调整色阶就是调整亮度,也就是调整纹理 R、G、B 通道的数值大小。

下面是 Photoshop 中的直方图转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

Unity Shaders and Effects Cookbook (2-7)实现 Photoshop 色阶效果_第1张图片


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

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

Unity Shaders and Effects Cookbook (2-7)实现 Photoshop 色阶效果_第2张图片

在 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


你可能感兴趣的:(Unity,Shaders,and,Effects,Cook,一起学Unity,Shader)