PostEffect - GrayScale

À¯´ÏƼ¿¡¼­ Æ÷½ºÆ®ÀÌÆåÆ®¸¦ ±¸ÇöÇغ»´Ù.
GrayScale È¿°ú¸¦ ÁÖ´Â Æ÷½ºÆ® ÀÌÆåÆ®¸¦ ¸¸µé¾î º»´Ù.

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

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class GrayCameraRenderImage : MonoBehaviour
{
    #region Variables
    public Shader curShader;
    private Material curMaterial;
    [Range(-1.0f, 1.0f)]
    public float grayScaleAmount = 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("_LuminosityAmount", grayScaleAmount);

            Graphics.Blit(sourceTexture, destTexture, material);
        }
        else
        {
            Graphics.Blit(sourceTexture, destTexture);
        }
    }
   
    /*
    void Update()
    {
        grayScaleAmount = Mathf.Clamp(grayScaleAmount, 0.01f, 1.0f);
    }
    */

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

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

[ExecuteInEditMode]

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

    #region Variables
    public Shader curShader;
    private Material curMaterial;
    [Range(-1.0f, 1.0f)]
    public float grayScaleAmount = 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¿¡¼­ ¸ÞÆ®¸®¾óÀ» ÇØÁ¦ÇÏ°í ÀÖ´Ù.
À̺κÐÀº ÀÌÇØ°¡ ¾È°£´Ù. ???
À̺¥Æ®ÀÇ ½ÇÇà ¼ø¼­´Â ´ÙÀ½°ú °°´Ù.

Reset
Awake
OnEnable
Start
Fixedupdate
yield WaitForFiexedUpdate
Update
yield null and yield WaitForSceonds
LateUpdate
OnWillRenderObject
OnGUI
yield WaitForEndOfFrame
OnDisable
OnDestroy

GrayCamera.Shader ¸¸µé±â

Shader "Custom/GrayCamera" {
    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
            #pragma fragmentoption ARB_precision_hint_fastest
            #include "UnityCG.cginc"
            
            uniform sampler2D _MainTex;
            fixed _LuminosityAmount;
            
            fixed4 frag(v2f_img i) : COLOR
            {
                fixed4 renderTex = tex2D(_MainTex, i.uv);
                
                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"
}

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

    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _LuminosityAmount ("GrayScale Amount", Range(0.0, 1.0)) = 1.0
    }

È­¸é¿¡ ·»´õ¸µ ÇÏ´Â ´ë½Å¿¡ ÅؽºÃÄ¿¡ ·»´õ¸µÇÑ´Ù.  À̹ÌÁö¸¦ _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 _LuminosityAmount;

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

            fixed4 frag(v2f_img i) : COLOR
            {
                fixed4 renderTex = tex2D(_MainTex, i.uv);
                
                float luminosity = 0.299 * renderTex.r + 0.587 * renderTex.g + 0.114 * renderTex.b;
                fixed4 finalColor = lerp(renderTex, luminosity, _LuminosityAmount);
                
                return finalColor;
            }

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

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

GrayCameraRenderImage.cs ¼Ò½º
GrayCamera.shader ¼Ò½º

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