PostProcess는 한글로 후처리라고 하며 기본 렌더링 과정이 다 끝나고 UI렌더링 이전 까지의 렌더된 버퍼 데이터를 이용해 이펙트를 적용시키는 기술입니다.

 

 

유니티의 Postprocess v2 에셋을 이용해 기본 효과들을 사용할 수 있습니다.

(Bloom, Color grading 등)

 

이번 포스팅에서 튜토리얼하는 것은 후처리 이펙트 쉐이더를 직접 작성해서 적용하는 법입니다.

 

 

 

예시로 흑백 후처리 쉐이더를 만들었습니다.

 


후처리 쉐이더 - 흑백화면
Shader "Hidden/PP_GrayScale"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
		_Gray("Gray", Range(0,1)) = 1
    }
    SubShader
    {
        Cull Off		//! 컬링하지 않는다. 
		ZWrite Off		//! Z Buffer 사용하지 않는다.
		ZTest Always	//! ZTest 항상 위에 출력

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
				float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;
			fixed _Gray;

            fixed4 frag (v2f i) : SV_Target
            {
				 float4 fMainTex = tex2D(_MainTex, i.uv);		//! 이전 버퍼 텍스처
				 float3 fGrayTex = dot(fMainTex.rgb, float3(0.3333f, 0.3333f, 0.3333f));	//! 흑백 계산

				 float3 fResultTex = lerp(fMainTex, fGrayTex, _Gray);	
				 return float4(fResultTex, 1.0f);
            }
            ENDCG
        }
    }
}

 

쉐이더는 Vertex&Fragment 쉐이더와 구조가 동일합니다.

 

유니티에서 Image Effect Shader 파일 제작시 기본 Syntax는 위와 같습니다.

 

 

버텍스 쉐이더도 일반 쉐이더와 동일합니다.

 

 

sampler2D _MainTex에는 화면 버퍼 정보가 들어오게 됩니다.

만약 tex2D(_MainTex, i.uv)를 그대로 출력하면 화면에서는 아무 변화가 없게 됩니다.

 

여기서 UV를 한번 출력해보면 

위와 같은 화면이 출력됩니다.

마치 Quad 모델 한장을 카메라 앞에다가 붙인 것과 같은 효과입니다, 이후에 Blur효과나 굴절효과 같은 기존 쉐이더에서 이미지를 꾸기는 효과를 구현할때와 같이 UV를 조작해서 구현하면 되겠습니다.

 

 

 


후처리 적용 - C# 스크립팅
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ImageEffectAllowedInSceneView] //! Scene뷰에서 후처리 이펙트 적용
[ExecuteInEditMode]             //! 에디트모드에서 실행(게임 실행안해도 적용)
public class Cpt_PostProcess : MonoBehaviour
{
    [SerializeField]
    private Material m_pPPMaterial = null;

    [SerializeField, Range(0, 1)]
    float _Gray = 1;


    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        if (m_pPPMaterial == null) return;

        m_pPPMaterial.SetFloat("_Gray", _Gray);     //! 쉐이더 Properties값 조작

        Graphics.Blit(src, dest, m_pPPMaterial);    //! 쉐이더 적용
    }
}

 

위 스크립트를 작성하여 카메라 오브젝트에 장착합니다.

 

 

 

특별히 설명할 것은 위 함수입니다.

 

src(화면 버퍼 데이터)m_pPPMaterial쉐이더를 거처 dest결과물로 뽑아내는 기능입니다.

 

 

 

 

 


마지막으로 Post Process v2에서 커스텀 쉐이더를 추가하는 방법은 아래 링크에 튜토리얼 있습니다.

 

https://github.com/Unity-Technologies/PostProcessing/wiki/Writing-Custom-Effects

 

Unity-Technologies/PostProcessing

Post Processing Stack. Contribute to Unity-Technologies/PostProcessing development by creating an account on GitHub.

github.com

 


WRITTEN BY
CatDarkGame
Technical Artist dhwlgn12@gmail.com

,