유니티/렌더링

[유니티셰이더]홀로그램 + VCMask

듀부두부 2020. 12. 25. 00:34

 

유니티 쉐이더 스타트업 책을 읽다가 나온 홀로그램 코드에 저번 시간에 배운 내용들을 집어넣어, VCMask를 이용한 무지개빛(?)홀로그램을 만들었습니다. 책에 설명을 너무 쉽게 잘해주셔가지고 조금만 자세히 읽다보면 다양한 바리에이션으로 응용이 가능할거에요!

왼쪽 위 홀로그램은 기본 홀로그램 코드에 NormalMap과 Sin(시간)함수를 더한것입니다!

보시면 구형 오브젝트에 바둑판모양에 숫자들이 적힌(피면 오른쪽 오브젝트처럼되는)이미지에다가

아래에서 위로 올라가는 가로방향 줄모양으로 홀로그램이 만들어지고 있죠.

오른쪽 위 홀로그램은 평면 오브젝트에 VC마스크를 이용하여 다양한 색깔을 첨가한 결과물입니다.

마찬가지로 위로 올라가는 가로방향 줄무늬를 볼 수 있고, 시간흐름에 따라 색상이 바뀌는것도 포인트죠!

아래 네모모양 이미지는 오른쪽 위 오브젝트에 사용한 VCMask입니다.

오른쪽 위에있는 오브젝트가 어찌보면 최종결과물이니, 이에 대한 코드만 아래 첨부하겠습니다.

 


Shader "Eugene/hologramVCM"
{
    Properties
    {
        _BumpMap("NormalMap", 2D) = "bump"{}
        _RimPower("RimPower", float) = 3
    }
        SubShader
    {
        Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }

        CGPROGRAM
        #pragma surface surf nolight noambient alpha:fade
        
        sampler2D _BumpMap;
        float _RimPower;

        struct Input
        {
            float2 uv_BumpMap;
            float3 viewDir; 
            float3 worldPos;
            float4 color:COLOR;
        };

        void surf(Input IN, inout SurfaceOutput o)
        {
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));

            o.Emission = lerp(float3(1,0,0), float3(0,1,0), IN.color.r);
            o.Emission = lerp(o.Emission, float3(0,0,1), IN.color.g);
            o.Emission = lerp(o.Emission, float3(1,1,0), IN.color.b);

            float rim = saturate(dot(o.Normal, IN.viewDir));
            rim = pow(1-rim,_RimPower) + pow(frac(IN.worldPos.g * 3 - _Time.y), 30);
            o.Alpha = rim * sin(_Time.y); 
        }

        float4 Lightingnolight( SurfaceOutput s, float3 lightDir, float atten)
        {
            return float4(0,0,0,s.Alpha);
        }
        ENDCG
    }
    //그래픽 카드에서 쉐이더 연산을 실패했을 때 대체 쉐이더
        FallBack "Transparent/Diffuse"
}

 


 

 

셰이더 사용자가 제어할 수 있는 부분이 적은데, 원하신다면 상수값을 넣은 부분을 변수로 만들어 Properties에 올려서 사용하시면 됩니다.

-이 글은 '유니티 쉐이더 스타트업, 정종필 저'를 기반으로 작성하였습니다.