본문 바로가기

유니티/렌더링

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

반응형

 

유니티 쉐이더 스타트업 책을 읽다가 나온 홀로그램 코드에 저번 시간에 배운 내용들을 집어넣어, 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에 올려서 사용하시면 됩니다.

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

반응형