色階變換做的一個顏色漸變效果

剛剛看了一個實現Photoshop的色階效果 例子,玩着無聊感覺這個做個實時漸變也是可以的!

shader部分代碼如下:

Shader "LT/FloorsRusted" {
Properties {
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_inBlack ("Input Black", Range(0,255)) = 0
_inGamma ("Input Gamma", Range(0,2)) = 1.61
_inWhite ("Input White", Range(0,255)) = 255

_OutWhite ("Out White", Range(0,255)) = 255
_OutBlack ("Out Black", Range(0,255)) = 0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200

CGPROGRAM
#pragma surface surf Lambert

#pragma target 3.0

sampler2D _MainTex;
float _inBlack;
float _inGamma;
float _inWhite;
float _OutWhite;
float _OutBlack;

struct Input {
float2 uv_MainTex;
};

//將原貼圖中RPG顏色改爲調整後新的色階值改通道的像素值
float GetPixelLevel(float pixelColor)
{
float pixelResult;
pixelResult = max(0.0, pixelColor * 255.0 - _inBlack);   // - _inBlack使像素變暗,確保減去後的值不會小於0
pixelResult = saturate (pow(pixelResult/(_inWhite - _inBlack),_inGamma)); //除以(_inWhite - _inBlack)會比直接除以_inWhite更亮。
pixelResult = (pixelResult * (_OutWhite - _OutBlack) +_OutBlack)/255; //使用_OutWhite和_OutBlack修改像素值,以便可以從全局上控制最大像素值和最小像素值
return pixelResult;
}
void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) ;
fixed outRPixel = GetPixelLevel(c.r);
fixed outGPixel = GetPixelLevel(c.g);
fixed outBPixel = GetPixelLevel(c.b);

o.Albedo = fixed3(outRPixel,outGPixel,outBPixel);
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"

}

掛在物體上的C#腳本如下:

using UnityEngine;
using System.Collections;


//這個腳本掛在當前shader的模型上
[ExecuteInEditMode]
public class ChangeFloorsRusted : MonoBehaviour {

Material mat;
// Use this for initialization
void Start () {
mat =  GetComponent<Renderer> ().sharedMaterial;
if (mat)
StartCoroutine ("addColor");
}

/// <summary>
/// 隔0.01秒就變換下顏色。。。
/// </summary>
/// <returns>The color.</returns>
IEnumerator addColor()
{
while (mat.GetFloat ("_inBlack")<206f)
{
float inWhite = mat.GetFloat ("_inWhite"); 
float inBlack = mat.GetFloat ("_inBlack");
if (inWhite < 255f) {
inWhite++;
mat.SetFloat ("_inWhite", inWhite);
} else {
inBlack++;
mat.SetFloat ("_inBlack", inBlack);
}
yield return new WaitForSeconds(0.01f);  

}
}

變換前                                      變換後





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章