Post Effect - Depth

¾Æ·¡ À̹ÌÁö¿Í °°ÀÌ ±íÀÌ ¸ðµå¸¦ È­¸é¿¡ Ãâ·ÂÇغ¸ÀÚ.


[±íÀÌ°¡ 0.2À϶§]

SceneDepth_ImageEffect.cs ½ºÅ©¸³Æ® ÆÄÀÏ ¸¸µé±â

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class SceneDepth_ImageEffect : MonoBehaviour
{

    #region Variables
    public Shader curShader;
    private Material curMaterial;
    [Range(0.0f, 5.0f)]
    public float depthPower = 1.0f;
    #endregion
    
    #region Properties
    Material material
    {
        get
        {
            if(curMaterial == null)
            {
                curMaterial = new Material(curShader);
                curMaterial.hideFlags = HideFlags.HideAndDontSave;
            }
            return curMaterial;
        }
    }
    #endregion
    
    void Start()
    {
        if(!SystemInfo.supportsImageEffects)
        {
            enabled = false;
            return;
        }
        
        if(!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()
    {
        Camera.main.depthTextureMode = DepthTextureMode.Depth;
        depthPower = Mathf.Clamp(depthPower, 0, 5);
    }
     */
    
    void OnDisable()
    {
        if(curMaterial)
        {
            DestroyImmediate(curMaterial);
        }
    }
}

1. À¯´ÏƼ ¿¡µðÅÍ ¸ðµå¿¡¼­µµ ½ÇÇàÇϱâ À§ÇØ  ´ÙÀ½À» ¼±¾ðÇÑ´Ù.

[ExecuteInEditMode]

2. º¯¼ö¸¦ ¼±¾ðÇÑ´Ù.
¸ÞÆ®¸®¾óÀ» ÀÚüÀûÀ¸·Î »ý¼ºÇÏ°í ¼ÎÀÌ´õ¸¦ ÂüÁ¶Çϱâ À§ÇÑ º¯¼ö¸¦ Ãß°¡ÇÑ´Ù.
depthPower´Â ¼ÎÀÌ´õ·Î depthPowerÀ» ³Ñ°ÜÁÖ±â À§ÇÑ º¯¼öÀÌ´Ù.

    #region Variables
    public Shader curShader;
    private Material curMaterial;
    [Range(0.0f, 5.0f)]
    public float depthPower = 1.0f;
    #endregion

3. ¸ÅÆ®¸®¾óÀ» »ý¼ºÇÑ´Ù.
¸ÅÆ®¸®¾óÀÌ nullÀÌ¸é »ý¼ºÇÑ´Ù. °èÃþºä¿¡¼­ ¼û±â°í ÀúÀåÀÌ ÇÊ¿ä ¾ø±â ¶§¹®¿¡ HideAndDontSave·Î ¼³Á¤ÇÑ´Ù.

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

4. À̹ÌÁö ÀÌÆåÆ® Áö¿ø ¿©ºÎ¸¦ üũ ÇÑ´Ù.
À̹ÌÁö ÀÌÆåÆ®¿Í ¼ÎÀÌ´õ Áö¿øÀÌ µÇ´ÂÁö üũ ÇÏ¿© ½ºÅ©¸³Æ®¸¦ È°¼º, ºñÈ°¼ºÈ­ ÇÑ´Ù.

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

5. À̹ÌÁö¸¦ ĸÃÄÇؼ­ ³Ñ°ÜÁØ´Ù.
À¯´ÏƼ¿¡¼­´Â À̹ÌÁö¸¦ ĸÃÄÇϱâ À§ÇØ OnRenderImage( ) ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù.
¼ÎÀÌ´õ¿¡¼­´Â _MainTex·Î ¹Þ´Â´Ù.

   void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
    {
        if(curShader != null)
        {
            material.SetFloat("_LuminosityAmount", grayScaleAmount);

            Graphics.Blit(sourceTexture, destTexture, material);
        }
        else
        {
            Graphics.Blit(sourceTexture, destTexture);
        }
    }

6. »ý¼ºÇß´ø ¸ÅÆ®¸®¾óÀ» ÇØÁ¦ÇÑ´Ù.

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

OnDestroy°¡ ¾Æ´Ï¶ó OnDisable¿¡¼­ ¸ÞÆ®¸®¾óÀ» ÇØÁ¦ÇÏ°í ÀÖ´Ù.
À̺κÐÀº ÀÌÇØ°¡ ¾È°£´Ù. ???
À̺¥Æ®ÀÇ ½ÇÇà ¼ø¼­´Â ´ÙÀ½°ú °°´Ù.

SceneDepth_Shader.shader ¸¸µé±â

Shader "Custom/SceneDepth_Shader"
{
    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
            {
                //Get the colors from the RenderTexture and the uv's
                //from the v2f_img struct
                float d = UNITY_SAMPLE_DEPTH( tex2D(_CameraDepthTexture, i.uv.xy) );
                d = pow(Linear01Depth(d), _DepthPower);
                
                return d;
            }
    
            ENDCG
        }
    }
    FallBack off
}

1. ·»´õ¸µ À̹ÌÁö¿Í ±×·¹À̽ºÄÉÀÏ°ª¿ëÀ¸·Î ÇÁ·ÎÆÛƼ¸¦ ¸¸µç´Ù.

    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _DepthPower ("Depth Power", Range(1, 5)) = 1
    }


È­¸é¿¡ ·»´õ¸µ ÇÏ´Â ´ë½Å¿¡ ÅؽºÃÄ¿¡ ·»´õ¸µÇÑ´Ù.  À̹ÌÁö¸¦ _MainTex ÅؽºÃÄ¿¡ ·»´õ¸µÇÑ´Ù.

2.  Cg ¼ÎÀÌ´õ Äڵ带 »ç¿ëÇÏ¿© È­¸éÀ» ÃÖÀûÈ­ ÇÑ´Ù.
³»Àå ¼­Çǽº ¼ÎÀÌ´õ ÄÚµå ´ë½Å Cg ¼ÎÀÌ´õ ÄÚµå¿Í Cg ¼ÎÀÌ´õ ÄÚµå¿ë #pragma ¹®À» Àû¿ëÇÑ´Ù.

    SubShader {
        Pass {
            CGPROGRAM
            #pragma vertex vert_img
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest
            #include "UnityCG.cginc"

3. º¯¼ö¸¦ ¼±¾ðÇÑ´Ù.

   uniform sampler2D _MainTex;
   fixed _DepthPower;
   sampler2D _CameraDepthTexture;

4. ·»´õ¸µµÈ ÅؽºÃÄ À̹ÌÁö¿¡ È¿°ú¸¦ ÁØ´Ù.
¿©±â¼­ frag( ) ÇÔ¼ö´Â Depth¸¦ È­¸é¿¡ ±×·ÁÁÖ´Â È¿°ú¸¦ ÁÖ°í ÀÖ´Ù.

            fixed4 frag(v2f_img i) : COLOR
            {
                //Get the colors from the RenderTexture and the uv's
                //from the v2f_img struct
                float d = UNITY_SAMPLE_DEPTH( tex2D(_CameraDepthTexture, i.uv.xy) );
                d = pow(Linear01Depth(d), _DepthPower);
                
                return d;
            }

À¯´ÏƼ°¡ Á¦°øÇÏ´Â ³»Àå ÇÔ¼ö UNITY_SAMPLE_DEPTH( )¿Í Linear01Depth( )·Î ±íÀÌÁ¤º¸¸¦ ±¸ÇÒ¼ö ÀÖ´Ù.
UNITY_SAMPLE_DEPTH : ±íÀÌ Á¤º¸¸¦ °¡Á®¿Â´Ù.
Linear01Depth : °ªÀÌ 0 ~ 1 ¹üÀ§·Î °ªÀ» Á¶Á¤ÇÑ´Ù.  ÃÖÁ¾ °ªÀ» °ÅµìÁ¦°öÀ» ÇÏ¿© Ä«¸Þ¶ó À§Ä¡¿¡ ±â¹ÝÇØ ¾À ¾È¿¡¼­ 0 ~ 1 ¹üÀ§ÀÇ Áß°£ °ªÀ¸·Î À§Ä¡¸¦ Á¦¾î ÇÑ´Ù.

½ºÅ©¸³Æ® Àû¿ë

Ä«¸Þ¶ó¿¡ GrayCameraRenderImage.cs¸¦ ºÙÀδÙ.

SceneDepth_ImageEffect.cs ¼Ò½º
SceneDepth_Shader.shader ¼Ò½º

Âü°í)
À¯´ÏƼ Shader¿Í Effect Á¦ÀÛ (µµ¼­)