본문으로 건너뛰기
CHOI HONGSU
1 min read

특정 스킬 파괴 오브젝트

특정 스킬로만 파괴 가능한 AO에, 파괴 불가 스킬 피격 시에도 '파괴 가능 대상'임을 인지할 수 있는 피격 연출 셰이더.

특정 스킬로만 파괴 가능한 AO에, 파괴 불가 스킬 피격 시에도 '파괴 가능 대상'임을 인지할 수 있는 피격 연출 셰이더.

Problem

게임 내 특정 AO는 지정된 스킬로만 파괴할 수 있다. 파괴 불가 스킬로 공격해도 타격감은 발생하는데, 플레이어 입장에서는 '공격이 막힌 건지, 아니면 이 오브젝트가 파괴 가능한 건지'를 구분하기 어렵다.

기획 요구사항: 파괴 불가 스킬로 공격해도 "파괴 가능 대상"임을 인지할 수 있는 시각 피드백 + 피격 누적에 따른 단계별 손상 표현

제약:

  • 텍스처 에셋 추가 최소화 — 피격 단계 수에 비례해 텍스처가 늘어나면 아트 비용·메모리 모두 문제
  • SRP Batcher 호환 필수 — cbuffer 레이아웃을 sibling shader(BG_Lit_AO 등)와 정합
  • GPU Indirect Instancing 지원 (_CUSTOM_INDIRECT 경로)

Approach

노이즈 텍스처 블렌딩

Chosen

Pros

  • 노이즈 1장으로 무한 단계 표현, 메모리 효율 최대

Cons

  • 외관이 노이즈 패턴에 의존 — 아티스트가 노이즈 선택 필요

텍스처 어레이 다중 슬라이스

Pros

  • 단계별 완전히 다른 외관 가능

Cons

  • 단계 수 × 텍스처 1장 → 에셋·메모리 비례 증가

Why 노이즈 텍스처 블렌딩: 선택: 노이즈 텍스처 블렌딩 + 첫 피격에만 2슬라이스 어레이 병용 이유: 텍스처 1장 추가만으로 단계 표현 가능. 첫 피격 전후 외관 전환(Texture Array 0→1)과 이후 누적 피격 단계(노이즈 블렌드 확장)를 역할 분리해 두 방식을 결합.

Architecture

셰이더 파라미터 3개가 각각 독립적인 역할을 담당:

파라미터변화 방식역할
_ArrayIndex0 → 1 즉시첫 피격 시 텍스처 스왑 — 깨끗한 외관 → 초기 손상 외관
_NoiseBlend0 → 1 단계적 보간노이즈 임계값 디졸브 — 균열이 점점 확산
_Hit0 → 1 → 0 tween매 피격 순간 프리컬링 플래시

노이즈 디졸브 수식:

  • _NoiseBlend = 0: 노이즈 밝은 영역만 TintColor → 엷은 균열 힌트
  • _NoiseBlend = 1: 전면 TintColor → 완전 손상 외관
  • edge width 0.05 고정으로 선명한 경계 유지

Implementation

  1. 01

    1. Texture2DArray 2슬라이스 설계

    BG_Lit_AO는 N슬라이스 어레이로 단계를 표현하지만, SkillAO는 0·1 두 슬라이스만 사용하는 설계를 의도적으로 선택.

    • Slice 0: 초기 상태 (파괴 전)
    • Slice 1: 첫 피격 후 상태 (금이 간 외관)

    첫 피격 시 _ArrayIndex 0→1 즉시 전환, 이후는 _NoiseBlend 단계 사용. 텍스처는 2장으로 고정, 피격 단계 수는 노이즈 값으로 무한 확장 가능.

    2. 노이즈 블렌딩 vs 텍스처 어레이 역할 분리

    성욱님 질문: "Noise Texture Blend는 texture array 변화 값에 대한 블렌딩 처리인가?"

    → 별개의 독립 기능. 텍스처 어레이 단계를 늘릴수록 텍스처 수가 비례해 늘어나는 문제를, 노이즈 1장으로 대체한 것.

    3. Hit Flash — HIT_BLEND_OPTIONS

    기존 BG_Lit_AO의 Hit Color에 강도 스케일(_HitIntensity) 제어를 추가. 흔들림·노이즈 연출과 시각적으로 겹쳐 너무 강해 보이는 문제를 독립 파라미터로 조절.

    4. SRP Batcher cbuffer 정합

    sibling shader(BG_Lit_AO 등)와 앞단 float4 순서를 동일하게 유지. SkillAO 고유 변수(_NoiseBlend, _NoiseTex_ST, _HitIntensity)는 cbuffer 후반부에 배치해 공통 레지스터 충돌 방지.

Tradeoffs & Future Work

Tradeoffs

  • 노이즈 패턴에 의존하므로 AO마다 노이즈 텍스처를 적합하게 선택해야 의도된 연출 가능
  • _ArrayIndex는 0·1 두 값만 전제 — 3단계 이상 외관 전환이 필요한 AO에는 별도 수정 필요