Unity/Shader

[5.10] Alpha Blending

ljw4104 2021. 5. 10. 11:13

Blending 

 - 투명 색상을 만드는데 사용된다.

 

 

다음과 같은 그림이 있을 때, 보통 앞 쪽에 있는 것을 먼저 그린다고 생각할 것이다.

하지만 뒤 쪽의 그림을 먼저 그려야 하는 경우도 있다.

이와 같이 렌더링되는 순서를 Z-Buffer(카메라의 깊이 텍스쳐, Depth Texture)이라고 하며, 뒤의 것이 먼저 그려지는 것을 Overdraw라고 한다.

 

docs.unity3d.com/kr/530/Manual/SL-CameraDepthTexture.html

 

유니티 - 매뉴얼: 카메라의 깊이 텍스처

플랫폼 별 렌더링 차이 카메라의 깊이 텍스처 Unity에서 카메라는 깊이 또는 깊이+법선 텍스처를 생성할 수 있습니다. 이것은 최소한의 G-buffer(그래픽 버퍼) 텍스처에서 포스트 프로세싱 효과 또

docs.unity3d.com

Alpha-Blending

  • Object들을 그리는 순서가 정해져 있지 않는 것.
  • Object들이 그려질 때 마다 G Buffer를 참고해서 앞 뒤 판정을 한다. 그리고 그려질 Pixel과 그려지지 않을 Pixel을 결정한다.

Rules

  1. 불투명을 먼저, 반투명을 나중에 그린다.
  2. 모든 Object가 반투명이면, 멀리 있는 것부터 가까운 것 까지 차례대로 그린다.

 

 

다음 그림은 풀때기를 Quad에 그렸지만 그림자가 이쁘게 나오지 않는다.

Quad의 배경까지 그려지기 때문이다.

좀 이쁘진 않지만 그래도 그려지긴 한다.

Shader "Custom/Grass"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Cutoff ("Alpha CutOff", Range(0, 1)) = 0.5
        //0.5를 기준으로 0.5보다 밝은 것은 그려지지 않음.
    }
    SubShader
    {
        Tags { "RenderType"="TransparentCutout" "Queue"="AlphaTest" }
        //RenderType을 반투명으로 바꿈 / Queue: 그려지는 순서

        Cull Off

        CGPROGRAM
        #pragma surface surf Standard alphatest:_Cutoff

        sampler2D _MainTex;
        float4 _Color;

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Legacy Shaders/Transparent/Cutout/VertexLit"
}

Cutoff를 통해 Alpha부분을 잘라낼 수 있다.