본문 바로가기
개발/Unity) Shader

Unity Shader) 빈티지 필름 효과 내기

by 테샤르 2025. 12. 12.

빈티지 효과 내기빈티지 필름 효과 내기

 

빈티지 필름 (약간의 빛  바래고 낡은 느낌)을 내는 효과를 간단하게 테스트 진행했다.

 

 

반응형

 

< Material 속성 >

색조(Color Tint),채도(Saturation),대비(Contrast),비네트(Vignette),정적 필름 그레인(Film Grain) 설정값을 적절히 조절해서

약간 색이 바래진 느낌과 빈티지 필름 형태의 표현이 가능하게 처리를 했다.

 

< Shader Code >

Shader "Custom/VintageFilm"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)

        // Vintage 톤
        _ColorTint ("Color Tint", Color) = (1.0, 0.95, 0.8, 1.0)
        _Saturation ("Saturation", Range(0.0, 2.0)) = 0.8
        _Contrast ("Contrast", Range(0.0, 2.0)) = 1.0

        // Vignette
        _VignetteIntensity ("Vignette Intensity", Range(0.0, 1.0)) = 0.3
        _VignetteSmoothness ("Vignette Smoothness", Range(0.1, 1.0)) = 0.5

        // Film Grain
        _GrainIntensity ("Grain Intensity", Range(0.0, 1.0)) = 0.25
        _GrainScale ("Grain Scale", Range(0.5, 10.0)) = 3.0
    }

    SubShader
    {
        Tags
        {
            "Queue"="Transparent"
            "RenderType"="Transparent"
        }

        Cull Off
        ZWrite Off
        Lighting Off
        Blend SrcAlpha OneMinusSrcAlpha

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;

            fixed4 _Color;

            fixed4 _ColorTint;
            half _Saturation;
            half _Contrast;

            half _VignetteIntensity;
            half _VignetteSmoothness;

            half _GrainIntensity;
            half _GrainScale;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float4 color : COLOR;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                fixed4 color : COLOR;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv  = TRANSFORM_TEX(v.uv, _MainTex);
                o.color = v.color * _Color;
                return o;
            }

            // 고급 필름 노이즈 함수(더 자연스러운 패턴)
            float filmNoise(float2 uv)
            {
                float2 p = uv * _GrainScale;

                // 3중 노이즈 → 진짜 필름 비슷한 패턴
                float n = (
                    sin(dot(p, float2(12.9898, 78.233))) +
                    sin(dot(p, float2(26.4217, 45.129))) +
                    sin(dot(p, float2(91.123, 12.342)))
                ) / 3.0;

                return n; // -1 ~ 1 범위로 변환은 후처리에서
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float2 uv = i.uv;

                fixed4 col = tex2D(_MainTex, uv) * i.color;

                // 1) Color Tint
                col.rgb *= _ColorTint.rgb;

                // 2) Saturation
                half luminance = dot(col.rgb, half3(0.299, 0.587, 0.114));
                col.rgb = lerp(luminance.xxx, col.rgb, _Saturation);

                // 3) Contrast
                col.rgb = (col.rgb - 0.5) * _Contrast + 0.5;

                // 4) Vignette
                float2 center = float2(0.5, 0.5);
                float dist = distance(uv, center);
                float vig = smoothstep(_VignetteSmoothness, 1.0, dist);
                col.rgb *= lerp(1.0, 1.0 - _VignetteIntensity, vig);

                // 5) Film Grain
                if (_GrainIntensity > 0.0)
                {
                    float g = filmNoise(uv);
                    g = (g * 0.5); // -0.5 ~ 0.5
                    col.rgb += g * _GrainIntensity;
                }

                col.rgb = saturate(col.rgb);
                return col;
            }
            ENDCG
        }
    }

    FallBack "Unlit/Transparent"
}

 

해당 코드는 기존의 원본과 비교를 할수있는 상태여야 충분히 효과를 볼 수 있다.

 

 

 

★★★☆☆

 

 

반응형

댓글