본문 바로가기
개발/Unity

Unity) 홀로그램 효과 쉐이더

by 테샤르 2024. 11. 8.

홀로그램 효과 쉐이더

 

내용

 

반응형

 

Shader "Custom/HolographyShader"
{
    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" {} // 기본 텍스처
        _NoiseTex ("Crack Pattern Texture", 2D) = "white" {} // 크랙 패턴 노이즈 텍스처
        _Color ("Base Color", Color) = (1, 1, 1, 1) // 기본 색상
        _MousePos ("Mouse Position", Vector) = (0, 0, 0, 0) // 마우스 위치
        _NoiseScale ("Noise Scale", Float) = 10.0 // 크랙 패턴 스케일
        _Iridescence ("Iridescence Strength", Float) = 1.0 // 홀로그램 반사 강도
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" }
        LOD 200
        Blend SrcAlpha OneMinusSrcAlpha // 투명도 지원
        Cull Off // 양면 렌더링

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float3 viewDir : TEXCOORD1;
                float3 normal : TEXCOORD2;
                float4 pos : SV_POSITION;
            };

            sampler2D _MainTex;
            sampler2D _NoiseTex;
            float4 _Color;
            float4 _MousePos; // 마우스 위치 속성
            float _NoiseScale;
            float _Iridescence;

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;

                // 카메라 방향 계산
                float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                o.viewDir = normalize(_WorldSpaceCameraPos - worldPos);
                o.normal = normalize(mul((float3x3)unity_ObjectToWorld, v.normal));

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // 텍스처 색상 가져오기
                fixed4 texColor = tex2D(_MainTex, i.uv) * _Color;

                // 크랙 패턴 노이즈 샘플링
                float2 noiseUV = i.uv * _NoiseScale;
                float crackPattern = tex2D(_NoiseTex, noiseUV).r;

                // 프레넬 효과 계산
                float fresnel = dot(i.viewDir, i.normal);
                fresnel = 1.0 - saturate(fresnel);

                // 마우스 위치에 따른 거리 계산
                float distanceToMouse = distance(float2(_MousePos.x, _MousePos.y), i.uv);
                
                // 홀로그램 색상: 거리 및 크랙 패턴에 기반
                float hue = fmod((fresnel * _Iridescence + crackPattern) * (1.0 - distanceToMouse), 1.0);
                fixed3 hologramColor = fixed3(
                    abs(hue * 6.0 - 3.0) - 1.0,
                    2.0 - abs(hue * 6.0 - 2.0),
                    2.0 - abs(hue * 6.0 - 4.0)
                );
                hologramColor = saturate(hologramColor);

                // 최종 색상: 크랙 패턴과 홀로그램 색상 조합
                fixed3 finalColor = texColor.rgb * (hologramColor * fresnel * crackPattern + 0.5);

                return fixed4(finalColor, texColor.a * crackPattern);
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

 

사진

 

★☆

 

반응형

댓글