본문 바로가기

유니티/렌더링

[유니티셰이더]불 이펙트 업그레이드

반응형

 

대마왕님의 책 '유니티 쉐이더 스타트업'의 6부에서 나오는 불 예제를 후반부에 나오는 내용을 이용하여 업그레이드시켜본 소스입니다. 불을 표현하기 위한 이미지는 예제파일에 있는 불과 먼지를 그대로 이용하였고, 코드만 수정하여서 배경이미지와 함께 사용할 수 있는 불을 만들어 보았습니다.

6부에서 제작한 불 이미지를 그대로 사용하면 문제점이

1. 배경에 불 이미지가 적용된 Plane의 '진한 사각형 그림자'가 나타난다.

-> 전혀 불의 그림자라고 생각할 수 없는 이질적인 그림자가 생성됩니다.

2. 불이 왼쪽아래로 치우쳐져서 그려진다

3. 불의 위아래에 연산으로 인한 찌거기가 남는다

4. 불치고 너무 진하다(?)

이렇게 배경이미지와 6부의 불 이펙트를 함께 사용하면 정말 보기 이상한 현상들이 나타납니다.

이것들을 하나하나 바꿔보도록 합시다.


소스코드

Shader "Eugene/fireupgrade"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _MainTex2("Albedo2 (RGB)", 2D) = "black" {}        
        [Enum(UnityEngine.Rendering.BlendMode)]_SrcBlend("SrcBlend Mode", Float) = 4
        [Enum(UnityEngine.Rendering.BlendMode)]_DstBlend("DstBlend Mode", Float) = 2
    }
        SubShader
    {
        Tags { "RenderType" = "Opaque" "Queue" = "Transparent" "IgnoreProjector"="True"}
        zwrite off
        blend [_SrcBlend] [_DstBlend]
        cull off

        CGPROGRAM
        #pragma surface surf nolight keepalpha noforwardadd nolightmap noambient novertexlights noshadow

        sampler2D _MainTex;
        sampler2D _MainTex2;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_MainTex2;
        };

        void surf(Input IN, inout SurfaceOutput o)
        {            
            fixed4 d = tex2D(_MainTex2, float2(IN.uv_MainTex2.x, IN.uv_MainTex2.y - _Time.y));
            fixed4 c = tex2D(_MainTex, saturate(IN.uv_MainTex + d.r) - 0.07);

            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }

        float4 Lightingnolight(SurfaceOutput s, float3 lightDir, float atten)
        {
            return float4(s.Albedo,s.Alpha);
        }
        ENDCG
    }
        FallBack "Diffuse Shaders/Transparent/VertecLit"
}

 

이 쉐이더는 서피스 쉐이더로 작성되었는데 이펙트를 서피스 쉐이더로 작성하게되면 성능낭비가 꽤 있다고 합니다.

1. Properties

- 불 이펙트의 blend 속성을 손쉽게 변경하여 테스트하기 위해 _Srcblend와 _Dstblend를 추가하였습니다.

2. Tags ~ sampler2D 선언 전까지

- '투명한' 오브젝트처럼 처리하기 위해 다양한 옵션들을 적용하였습니다.

- 성능낭비를 줄이기 위해 쓸모없는 기능 (라이팅, 그림자 등)을 제거하였습니다.

- zwrite off로 불안전하지만 이펙트의 알파부분이 겹쳐 다른 이펙트가 가려지는 현상을 제거하였습니다.

- cull off로 이펙트가 양면으로 출력되게 설정하였습니다.

3. Tags ~ sampler2D 선언 전까지

- 연산으로 이미지의 uv값이 0~1사이의 값을 벗어나 찌꺼기가 생기는 것을 방 지하기 위해 'saturate'로 값을 0~1사이로 고정하였습니다.

- 이미지에 덧셈연산이 되어 왼쪽 아래로 밀리는 것을 막기 위해 0.07(나름 적절한값)을 넣어서 이미지의 중앙에 불 이펙트라 자리잡게 수정하였습니다. 굉장히 마음에 안드는 방법이지만 아직 다른방법을 떠오르기 힘들어서 이대로 처리하였습니다 ㅜ.

 

후기

- UV에 대해 생각해보았는데 제가 잘 이해를 못하고있는듯 합니다. 이번 연휴동안 이 내용을 제대로 파보겠습니다.

 

 

 

반응형