Alpha2Pass

2022. 7. 28. 15:00Public/Shader

속이 다 보이는 알파의 문제점

예시의 상황

  • 알파 블랜딩으로 처리된 로봇 캐릭터가 있다.
  • 파괴될때 투명해지면서 사라진다고 가정

일반적인 방법이라면 프레그먼트로 작성하는것이 일반적이나 학습을 위해서 이방법으로 적용

 

원리

첫 번째 패스는 z버퍼에는 그리되 화면에는 그리지 않는다.

즉 z 버퍼에만 그리는 패스를 사용 , variants를 최소한으로 줄이고 최대한 계산을 줄여서 만든 쉐이더이다. 

 

 

 

두 번째 패스 z버퍼를 쓰지 않고 그린다. 

 

Shader "Custom/Alpha2Pass"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags{"RenderType" = "Transparent" "Queue" = "Transparent"}
        //1st pass zwrite on, rendering off
        zwrite on
        ColorMask 0
        CGPROGRAM
        #pragma surface surf nolight noambient noforwardadd nolightmap novertexlights noshadow
        struct Input {
           float4 color:COLOR;
        };
        void surf(Input IN, inout SurfaceOutput o) {

        }
        float4 Lightingnolight(SurfaceOutput s, float3 lightDir, float atten) {

            return float4(0, 0, 0, 0);
        }
        ENDCG
        //2st pass write off, rendering on
        zwrite off
        CGPROGRAM
        #pragma surface surf Lambert alpha:fade
        sampler2D _MainTex;
        struct Input {
            float2 uv_MainTex;
        };
        void surf(Input IN,inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = 0.5;
        }
        ENDCG
    }    
    FallBack "Diffuse"
}

 

 

 

 

 

'Public > Shader' 카테고리의 다른 글

테셀레이션  (0) 2023.09.10
[ShaderGraph] ToonShader(툰쉐이더)  (0) 2023.06.19
zwrite on/off  (0) 2022.07.28
블렌드 펙터 연산 - DstColor SrcColor  (0) 2022.07.28
블렌드 펙터 연산 - DstColor Zero  (0) 2022.07.27