轉(zhuǎn)自http://blog.csdn.NET/candycat1992/article/details/39255575
1.新建一個(gè)場(chǎng)景
2.將以下腳本添加到攝像機(jī)上
[csharp] view plain copy
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class TestRenderImage : MonoBehaviour {
#region Variables
public Shader curShader;
public float grayScaleAmount = 1.0f;
private Material curMaterial;
#endregion
#region Properties
public Material material
{
get
{
if (curMaterial == null)
{
curMaterial = new Material(curShader);
curMaterial.hideFlags = HideFlags.HideAndDontSave;
}
return curMaterial;
}
}
#endregion
// Use this for initialization
void Start()
{
if (SystemInfo.supportsImageEffects == false)
{
enabled = false;
return;
}
if (curShader != null && curShader.isSupported == false)
{
enabled = false;
}
}
void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
{
if (curShader != null)
{
material.SetFloat("_LuminosityAmount", grayScaleAmount);
Graphics.Blit(sourceTexture, destTexture, material);
}
else
{
Graphics.Blit(sourceTexture, destTexture);
}
}
// Update is called once per frame
void Update()
{
grayScaleAmount = Mathf.Clamp(grayScaleAmount, 0.0f, 1.0f);
}
void OnDisable()
{
if (curMaterial != null)
{
DestroyImmediate(curMaterial);
}
}
}
3.新建一個(gè)shader僻肖,修改為以下代碼根欧,然后賦值給上面的腳本
[csharp] view plain copy
Shader "Custom/ImageEffect" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_LuminosityAmount ("GrayScale Amount", Range(0.0, 1.0)) = 1.0
}
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
fixed _LuminosityAmount;
fixed4 frag(v2f_img i) : COLOR
{
//Get the colors from the RenderTexture and the uv's
//from the v2f_img struct
fixed4 renderTex = tex2D(_MainTex, i.uv);
//Apply the Luminosity values to our render texture
float luminosity = 0.299 * renderTex.r + 0.587 * renderTex.g + 0.114 * renderTex.b;
fixed4 finalColor = lerp(renderTex, luminosity, _LuminosityAmount);
return finalColor;
}
ENDCG
}
}
FallBack "Diffuse"
}
4.效果圖
分析:這里的特效是針對(duì)整個(gè)畫(huà)面的,通過(guò)修改shader可以整體地改變畫(huà)面的效果。
解釋:一旦通過(guò)上述的各種檢查余境,我們就需要調(diào)用內(nèi)置的OnRenderImage函數(shù)來(lái)實(shí)現(xiàn)畫(huà)面特效。這個(gè)函數(shù)負(fù)責(zé)從Unity渲染器中抓取當(dāng)前的render texture嚎卫,然后使用Graphics.Blit()函數(shù)再傳遞給Shader(通過(guò)sourceTexture參數(shù))勃救,然后再返回一個(gè)處理后的圖像再次傳遞回給Unity渲染器(通過(guò)destTexture參數(shù))。這兩個(gè)行數(shù)互相搭配是處理畫(huà)面特效的很常見(jiàn)的方法甲脏。你可以在下面的連接中找到這兩個(gè)函數(shù)更詳細(xì)的信息:OnRenderImage:該攝像機(jī)上的任何腳本都可以收到這個(gè)回調(diào)(意味著你必須把它附到一個(gè)Camera上)眶熬。允許你修改最后的Render Texture。Graphics.Blit:sourceTexture會(huì)成為material的_MainTex块请。
畫(huà)面特效是順序處理的聋涨,這就像Photoshop中的layers。如果你有多個(gè)屏幕特效负乡,你可以按順序添加給該Camera牍白,那么它們就會(huì)按照這個(gè)順序被處理。
上述的過(guò)程是被簡(jiǎn)化過(guò)的抖棘,但通過(guò)這些我們可以看出畫(huà)面特效的核心是如何工作的茂腥。最后狸涌,我們總結(jié)上述使用Render Texture實(shí)現(xiàn)畫(huà)面特效的核心過(guò)程:
在腳本中檢查當(dāng)前平臺(tái)對(duì)特效的支持;
通過(guò)OnRenderImage()函數(shù)抓取render texture最岗,再通過(guò)Graphics.Blit()函數(shù)傳遞給虛擬材質(zhì)中的Shader進(jìn)行后處理帕胆;
Shader的_MainTex即為接收到的render texture,在frag函數(shù)里對(duì)圖像進(jìn)行逐像素處理后再返回給OnRenderImage函數(shù)般渡,得到最后的屏幕畫(huà)面懒豹。