屏幕特效——深度效果

作者:追风剑情 发布于:2016-7-17 10:21 分类:Shader

SceneDepth_Effect.shader


  1. Shader "Custom/SceneDepth_Effect" {
  2. Properties {
  3. _MainTex ("Base (RGB)", 2D) = "white" {}
  4. _DepthPower ("Depth Power", Range(1, 5)) = 1
  5. }
  6. SubShader {
  7. Pass
  8. {
  9. CGPROGRAM
  10. #pragma vertex vert_img
  11. #pragma fragment frag
  12. #pragma fragmentoption ARB_precision_hint_fastest
  13. #include "UnityCG.cginc"
  14. uniform sampler2D _MainTex;
  15. fixed _DepthPower;
  16. sampler2D _CameraDepthTexture;
  17. fixed4 frag(v2f_img i) : COLOR
  18. {
  19. float d = UNITY_SAMPLE_DEPTH( tex2D(_CameraDepthTexture, i.uv.xy) );
  20. d = pow(Linear01Depth(d), _DepthPower);
  21. return d;
  22. }
  23. ENDCG
  24. }
  25. }
  26. FallBack "Diffuse"
  27. }


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

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


TestRenderImage.cs


  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. [ExecuteInEditMode]
  5. public class TestRenderImage : MonoBehaviour {
  6.  
  7. public Shader curShader;
  8. private Material curMaterial;
  9. public float depthPower = 1.0f;
  10.  
  11. Material material
  12. {
  13. get
  14. {
  15. if(curMaterial == null)
  16. {
  17. curMaterial = new Material(curShader);
  18. curMaterial.hideFlags = HideFlags.HideAndDontSave;
  19. }
  20. return curMaterial;
  21. }
  22. }
  23.  
  24. void Start () {
  25. if(!SystemInfo.supportsImageEffects)
  26. {
  27. enabled = false;
  28. return;
  29. }
  30.  
  31. if(null != curShader && !curShader.isSupported)
  32. {
  33. enabled = false;
  34. }
  35. }
  36.  
  37. //对屏幕后期处理
  38. void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
  39. {
  40. if (curShader != null)
  41. {
  42. material.SetFloat("_DepthPower", depthPower);
  43. Graphics.Blit (sourceTexture, destTexture, material);
  44. } else {
  45. Graphics.Blit (sourceTexture, destTexture);
  46. }
  47. }
  48.  
  49. void Update () {
  50. //开启Unity内置的深度模式来获取当前游戏中所有对象的深度。
  51. //一旦开启了深度模式,我们就可以利用这些深度信息实现很多不同的效果。
  52. Camera.main.depthTextureMode = DepthTextureMode.Depth;
  53. depthPower = Mathf.Clamp (depthPower, 0f, 5);
  54. }
  55.  
  56. void OnDisable()
  57. {
  58. if (curMaterial)
  59. DestroyImmediate (curMaterial);
  60. }
  61. }


运行测试

111111.jpg

标签: Shader

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号