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

셰이더 NaN 가드

 

normalize·rcp·atan2의 0벡터/0값 NaN 전파를 일관 패턴으로 방어해 모바일 검은 화면 이슈 차단

Problem

Approach

셰이더 레벨 일관 NaN 가드

Chosen

Pros

  • 입력과 무관하게 안전, 한 곳 수정으로 광역 적용

Cons

  • 일부 함수에 분기·연산 추가

머티리얼·런타임 입력값 검증 강화

Pros

  • 셰이더 수정 없음

Cons

  • 입력 경로가 다양해 전수 방어 어려움, 근본 해결 불가

Why 셰이더 레벨 일관 NaN 가드: 셰이더 입력은 머티리얼·VFX·런타임 등 다양한 경로로 들어와 외부 검증만으로는 전수 방어가 어렵다. 셰이더 자체가 0 입력에도 안전하게 동작하도록 만드는 것이 근본 해결책.

Implementation

  1. 01

    Step 1 — 일관 가드 패턴 정의

    • 정밀도별 통일: 1e-6h (half) / 1e-6 (float)
    • 컨텍스트별 fallback: 방향 (0,0,1), 각도 0.5
    • // NaN 가드 주석으로 의도 명시

Architecture

SafeNormalize 정의:

Tradeoffs & Future Work

Tradeoffs

  • Vertex shader 가드는 vertex 수가 적어 비용 무시 가능. Fragment shader는 rcp(max(...)) ALU 패턴으로 통일해 실제 분기를 피하도록 했다.
  • 초기 구현의 if (ru > 1e-6) 전체 감싸기는 fragment 단위 분기 + 화면 중앙 픽셀 동작 회귀 두 문제를 동시에 유발 — Critical 리뷰 항목으로 분류해 우선 수정.
  • 임계값 1e-6은 일반 모바일 환경 기준. 극단적 소형 스케일 오브젝트 추가 시 튜닝 필요.