✨ 파티클 및 애니메이션 차폐 컬링 (Minecraft 26.2)
바닐라 Minecraft에서는 지하의 용암 방울, 동굴 먼지, 포털 파티클, 횃불 등이 단단한 돌벽 뒤에서도 수백 개의 파티클 쿼드를 생성하여 GPU에 제출합니다. 동시에 애니메이션 블록 텍스처 아틀라스는 싱글플레이어에서 일시 중지하거나 모달 메뉴에 머무를 때조차 프레임 데이터를 GPU에 지속적으로 업로드합니다.
Camera Culling은 초고속 파티클 가시선 검사와 아틀라스 업로드 억제 기능을 제공합니다.
📋 파티클 및 애니메이션 컬링 기본 정보
| 속성 | 값 |
|---|---|
| 파티클 대상 | SingleQuadParticle.extract(QuadParticleRenderState, Camera, float) |
| 애니메이션 대상 | TextureAtlas.cycleAnimationFrames() |
| 근접 안전 거리 | 카메라 주변 4.0미터 ($16.0\text{m}^2$) |
| 최대 파티클 거리 | 64.0미터 ($4096.0\text{m}^2$) |
| 아틀라스 일시 중지 트리거 | 싱글플레이어 게임 일시 중지됨 또는 활성 레벨/플레이어 없음 |
🌪️ 파티클 차폐 파이프라인
text
(X, Y, Z)에서 생성된 파티클
│
▼
[1] 거리 <= 4m? ─────────────► 렌더링 (근접 버블)
│ 아니오
▼
[2] 거리 > 64m? ─────────────► 컬링 (원거리 컷오프)
│ 아니오
▼
[3] 솔리드 블록 내부? ───────► 컬링 (완전 밀폐됨)
│ 아니오
▼
[4] 시각 클립 레이캐스트 차단?
├── 예 ──────────────► 컬링 (차폐됨)
└── 아니오 ──────────► 렌더링 (보임)- 근접 안전 버블 (4.0m): 카메라로부터 4미터 이내에서 방출되는 파티클은 $< 0.0001\mu\text{s}$ 내에 무조건 렌더링됩니다.
- 원거리 컷오프 (64.0m): GPU 쿼드 필레이트를 보호하기 위해 64m를 초과하여 생성된 파티클은 컬링됩니다.
- 솔리드 블록 밀폐: 블록 좌표
BlockPos.containing(x, y, z)가isSolidRender() == true이면 파티클이 즉시 삭제됩니다. - 시각 클립 레이캐스트: 카메라 위치에서 파티클 벡터로
ClipContext.Block.VISUAL광선을 투사합니다. 불투명 솔리드 블록이 $> 0.35\text{m}$ 마진으로 가시선을 가로막으면 렌더링을 생략합니다.
🎬 블록 및 텍스처 아틀라스 애니메이션 동결
텍스처 아틀라스 애니메이션(애니메이션 바다 랜턴, 흐르는 물/용암, 프리즈머린, 불, 나침반, 시계)은 프레임 인덱스를 순환하는 데 GPU 대역폭을 소모합니다.
Camera Culling은 TextureAtlasMixin에서 AnimationCullingHelper.shouldPauseAtlasAnimation()을 확인합니다:
- 싱글플레이어가 일시 중지되면(
mc.isPaused() == true), 아틀라스 업로드가 동결됩니다. - 타이틀 화면, 모달 메뉴에 있거나 월드에서 연결 해제된 경우 배경 텍스처 순환이 중단됩니다.
