Unity Shader

열수철·2025년 6월 18일

1. 셰이더 구조 개요

1.1 Properties 블록

Properties {
    _MainTex          ("Texture",        2D)    = "white" {}
    _NoiseTex         ("Noise Texture",  2D)    = "white" {}
    _Color            ("Main Color",     Color) = (1,1,1,1)
    _GlowColor        ("Glow Color",     Color) = (0,0.5,1,1)
    _DissolveAmount   ("Dissolve Amount",Range(0,1)) = 0
    _StripeWidth      ("Stripe Width",   Range(1,50)) = 10
    _StripeSpeed      ("Stripe Speed",   Range(0,10)) = 1
    _StripeIntensity  ("Stripe Intensity",Range(0,1)) = 0.5
    _GlitchIntensity  ("Glitch Intensity",Range(0,1)) = 0.3
    _EdgeWidth        ("Edge Width",     Range(0,0.2))= 0.05
}
  • _MainTex: 기본 색상 텍스처
  • _NoiseTex: 디졸브 마스크 · 글리치용 노이즈 텍스처
  • _Color, _GlowColor: 메인·글로우 색상
  • _DissolveAmount: 디졸브 진행도(0~1)
  • Stripe/Glitch/Edge 관련 변수들: 줄무늬 폭·속도·강도, 글리치 강도, 엣지 폭

이 블록이 Inspector에 노출되는 UI를 정의하며, 각 이름이 CGPROGRAM 내부의 uniform 변수와 1:1 매핑됩니다.


1.2 SubShader & Pass 설정

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

    Blend    SrcAlpha OneMinusSrcAlpha
    Cull     Off
    ZWrite   On

    Pass {
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #pragma target 3.0
        #include "UnityCG.cginc"
        // … uniform, struct, 함수, vert/frag 정의 …
        ENDCG
    }
}
FallBack "Diffuse"
  • Tags

    • "RenderType"="Transparent": 투명 오브젝트로 분류
    • "Queue"="Transparent": 렌더 큐를 투명(3000+)으로 설정
  • Blend: 알파 블렌딩

  • Cull Off: 양면 렌더링

  • ZWrite On: Z-버퍼에 쓰기 (디졸브 진행 중에도 깊이 정보 유지)


1.3 CGPROGRAM 내부 흐름

  1. Uniform 선언

    • _MainTex, _NoiseTex, _Color 등 Properties에서 매핑된 변수들
  2. 구조체 정의

    • appdata: 버텍스 입력 (위치, UV, 노말)
    • v2f:VERTFRAG 전달 (클립좌표, UV, 월드Pos, 노말, 노이즈 값)
  3. 도우미 함수

    • rand(): UV 기반 랜덤값 생성
    • sampleNoise(): 노이즈 텍스처 샘플링
    • applyGlitch(): 버텍스 위치 글리치
  4. vert()

    • 노이즈 샘플 → _DissolveAmount에 따라 applyGlitch 호출 → 오프셋된 버텍스 월드·클립 변환 → UV, 월드 위치·노말 전달
  5. frag()

    • 스트라이프 패턴 생성: sin(worldPos.y * _StripeWidth + time)
    • 노이즈+스트라이프 결합 → 디졸브 마스크 dissolveNoise
    • 추가 글리치 라인, UV 왜곡, 스캔라인 효과
    • 원본 텍스처 색상 * _Color
    • step()으로 디졸브 & 엣지 마스크 분리
    • 글로우(_GlowColor) & 스트라이프 깜빡임(알파 보정)
    • 최종 알파: 1 – dissolveMask에 스트라이프 알파 변조

2. Unity에서의 기본 설정

2.1 노이즈 텍스처 준비

  • 임포트 설정

    • Wrap Mode: Repeat (스트라이프나 글리치가 타일링되게)
    • Filter Mode: Point 또는 Bilinear (취향대로)
    • Format: 그레이스케일 노이즈라면 알파 채널 이용 가능

2.2 Material 생성 & 셰이더 연결

  1. Project 창 ▶ 우클릭 ▶ Create ▶ Material
  2. 새 Material의 Shader 드롭다운에서 Custom/DigitalStripeDissolve 선택
  3. _MainTex 에 캐릭터·오브젝트 기본 텍스처 할당
  4. _NoiseTex 에 위에서 준비한 노이즈 텍스처 할당

2.3 Inspector에서 속성 조절

  • _Color / _GlowColor: 원하는 베이스·발광 색상 선택

  • Stripe / Glitch 값들

    • StripeWidth (높을수록 줄 간격 촘촘)
    • StripeSpeed (움직임 속도)
    • StripeIntensity (줄 밝기 변화)
    • GlitchIntensity (버텍스·픽셀 글리치 강도)
    • EdgeWidth (발광 엣지 폭)

2.4 디졸브 애니메이션

  • MaterialPropertyBlock 또는 매 프레임 스크립트로 _DissolveAmount 값을 0→1로 서서히 변화

  • 예시 (C#):

    IEnumerator AnimateDissolve(Material mat) {
        float t = 0;
        while (t < 1f) {
            mat.SetFloat("_DissolveAmount", t);
            t += Time.deltaTime;
            yield return null;
        }
        mat.SetFloat("_DissolveAmount", 1f);
    }

2.5 투명화/깜빡임 확인

  • Scene 뷰에서 Material을 사용하는 오브젝트가 카메라에 보이도록 배치
  • 디졸브 중간값에서 줄무늬글리치, 엣지 발광이 자연스럽게 동작하는지 체크

3. 팁 & 체크리스트

  • 노이즈 텍스처 해상도: 너무 낮으면 줄무늬 패턴에 잡음이 과도하게 섞일 수 있음
  • Cull Off 덕분에 양면 모두 디졸브 되니, 단면 오브젝트의 경우 성능 영향 주의
  • ZWrite On 설정으로 투명 객체라도 다른 투명 객체와의 깊이 순서가 다르게 보일 수 있음
  • Target 3.0: 모바일에서 낮은 GPU를 쓴다면 #pragma target 2.0을 시도해 보세요 (단 기능 일부 제한)

profile
그래픽스, 수학, 물리, 게임 만세

0개의 댓글