色阶Shader
Shader "Custom/LevelsShader" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _inBlack ("Input Black", Range(0, 255)) = 0 _inGamma ("Input Gamma", Range(0, 255)) = 1.61 _inWhite ("Input White", Range(0, 255)) = 255 _outWhite ("Output White", Range(0, 255)) = 255 _outBlack ("Output Black", Range(0, 255)) = 0 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Lambert sampler2D _MainTex; float _inBlack; float _inGamma; float _inWhite; float _outWhite; float _outBlack; struct Input { float2 uv_MainTex; }; //自定义函数 (色阶计算公式) float GetPixelLevel(float pixelColor) { float pixelResult; //把值的范围从0.0~1.0扩大至0.0~255.0 pixelResult = (pixelColor * 255.0); //减去_inBlack值,使像素变得更暗。 pixelResult = max(0, pixelResult - _inBlack); //计算新的白色值,即调节像素亮度。 pixelResult = saturate(pow(pixelResult / (_inWhite - _inBlack), _inGamma)); //对最小像素值以及最大像素值有一个最终的全局控制,除以255使其重新恢复到0.0~1.0的范围。 pixelResult = (pixelResult * (_outWhite - _outBlack) + _outBlack)/255.0; return pixelResult; } void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = GetPixelLevel(c); o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }
调节不同的参数值,得到的几种效果截图。