鸟语天空
屏幕特效——深度效果
post by:追风剑情 2016-7-17 10:21

SceneDepth_Effect.shader


Shader "Custom/SceneDepth_Effect" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_DepthPower ("Depth Power", Range(1, 5)) = 1
	}
	SubShader {
		Pass
		{
			CGPROGRAM
			#pragma vertex vert_img
			#pragma fragment frag
			#pragma fragmentoption ARB_precision_hint_fastest
			#include "UnityCG.cginc"
			
			uniform sampler2D _MainTex;
			fixed _DepthPower;
			sampler2D _CameraDepthTexture;
			
			fixed4 frag(v2f_img i) : COLOR
			{
				float d = UNITY_SAMPLE_DEPTH( tex2D(_CameraDepthTexture, i.uv.xy) );
				d = pow(Linear01Depth(d), _DepthPower);
				return d;
			}
			ENDCG
		}
	} 
	FallBack "Diffuse"
}


UNITY_SAMPLE_DEPTH()函数会从_CameraDepthTexture中获得深度值并且为每个像素产生一个单精度的浮点值。

Linear01Depth()函数会确保深度值在0到1之间。


TestRenderImage.cs


using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class TestRenderImage : MonoBehaviour {

	public Shader curShader;
	private Material curMaterial;
	public float depthPower = 1.0f;

	Material material
	{
		get
		{
			if(curMaterial == null)
			{
				curMaterial = new Material(curShader);
				curMaterial.hideFlags = HideFlags.HideAndDontSave;
			}
			return curMaterial;
		}
	}

	void Start () {
		if(!SystemInfo.supportsImageEffects)
		{
			enabled = false;
			return;
		}

		if(null != curShader && !curShader.isSupported)
		{
			enabled = false;
		}
	}

	//对屏幕后期处理
	void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
	{
		if (curShader != null) 
		{
			material.SetFloat("_DepthPower", depthPower);
			Graphics.Blit (sourceTexture, destTexture, material);
		} else {
			Graphics.Blit (sourceTexture, destTexture);
		}
	}

	void Update () {
		//开启Unity内置的深度模式来获取当前游戏中所有对象的深度。
		//一旦开启了深度模式,我们就可以利用这些深度信息实现很多不同的效果。
		Camera.main.depthTextureMode = DepthTextureMode.Depth;
		depthPower = Mathf.Clamp (depthPower, 0f, 5);
	}

	void OnDisable()
	{
		if (curMaterial)
			DestroyImmediate (curMaterial);
	}
}


运行测试

111111.jpg

评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容