영상을 불러오지 못했습니다

Particle Bounding Box와 화면 각도별 컬링 문제

654 단어
3 분
Particle Bounding Box와 화면 각도별 컬링 문제

파티클이 정상 재생되다가 카메라를 특정 각도로 돌리면 갑자기 사라지는 문제가 있었다.

문제 현상#

emitter의 입자는 화면 안에 남아 있었다. 하지만 component bounds가 view frustum 밖이라고 판단되는 순간 전체 particle system이 컬링됐다. 반투명·긴 trail·넓게 퍼지는 effect에서는 실제 시각 범위와 계산된 bounds가 다를 때 이 문제가 쉽게 드러난다.

적용 범위#

UE4/UE5 프로젝트에서 Cascade UParticleSystem을 사용할 때 해당한다. Niagara는 bounds 설정 위치와 계산 방식이 다르다. system/emitter properties의 bounds를 별도로 확인한다.

원인#

renderer는 모든 particle을 매 frame 개별 확인하지 않는다. component의 bounding box로 먼저 표시 여부를 판단한다. bounds가 실제 effect보다 작거나 origin에서 벗어나 있으면 카메라 각도에 따라 effect 전체가 사라진다.

Cascade에서 파티클 bounds를 시각화한 화면
Cascade에서 파티클 bounds를 시각화한 화면

재현 및 진단#

  1. Cascade viewport에서 bounds 표시를 켠다.
  2. effect의 최대 수명 동안 입자·trail이 box 밖으로 나가는지 확인한다.
  3. level viewport에서는 카메라를 돌리며 사라지는 순간의 bounds를 비교해 본다.
  4. component scale과 parent transform이 bounds에 미치는 영향도 함께 살핀다.

해결 방법#

Particle System의 Fixed Relative Bounding Box를 켠 뒤 effect가 실제로 도달하는 최대 범위를 포함하도록 box를 설정한다.

Fixed Relative Bounding Box를 사용하지 않은 설정
Fixed Relative Bounding Box를 사용하지 않은 설정

Fixed Relative Bounding Box를 켜고 범위를 조정한 설정
Fixed Relative Bounding Box를 켜고 범위를 조정한 설정

가장 과격한 emitter 상태, 이동하는 parent와 LOD까지 포함해 필요한 범위를 측정한다. 값은 임의로 매우 크게 잡지 않는다.

검증 방법#

  • 가까운 거리와 먼 거리, 넓은 FOV와 좁은 FOV에서 카메라를 360도 회전한다.
  • effect lifetime 전체와 spawn burst 순간을 확인한다.
  • list/grid가 아닌 실제 게임의 component scale과 attachment 상태에서 시험한다.
  • stat initviews 등으로 컬링과 primitive 수가 과도하게 늘지 않는지도 살핀다.

주의점#

너무 작은 bounds는 시각 오류를 만든다. 지나치게 큰 bounds는 보이지 않는 effect까지 렌더링 후보로 남겨 성능을 해친다. 원점이나 scale이 잘못된 effect를 bounds 확대만으로 숨기지 않는다.

참고 자료#

글 공유하기

이 글이 도움이 되셨다면 다른 사람과 공유해 주세요!

Particle Bounding Box와 화면 각도별 컬링 문제
https://hon454.github.io/posts/unreal-engine-particle-bounds-culling/
작성자
Jihoon Jeon
게시일
2023-09-12
라이선스
CC BY-NC-SA 4.0
관련 게시글스마트
1
면접 오답노트: 말하지 못한 주요 개념, Net Relevancy
Unreal Engine면접에서 제대로 답하지 못한 Net Relevancy를 다시 정리한다. AActor::IsNetRelevantFor의 판정 순서와 문서와 다른 부분, Owner가 판정을 바꾸는 방식, 연관성을 잃고 되찾을 때 RelevantTimeout과 액터 파괴, BeginPlay, OnRep, RPC에 생기는 일, ForceNetRelevant와 Replication Graph, Iris에서의 주의점, Dormancy, Priority와의 차이를 다룬다.
2
언리얼 엔진의 리플리케이션 및 RPC 순서 보장
Unreal Engine프로퍼티 복제와 OnRep, RPC의 순서 보장 범위를 살펴보고, 일시적인 상태 불일치와 액터 간 준비 순서를 처리하는 방법을 예시로 정리한다.
3
[노트] Unreal Engine Skills for Claude Code
Unreal EngineEpic Games가 공개한 Claude Code 플러그인 Unreal Engine Skills for Claude Code의 스킬 3개와 SessionStart 훅을 읽고, 스킬의 트리거 설계와 문서화 규칙, 엔진 쪽 Agent Skill, 보안 경고의 범위, MCP와 스킬의 역할 분담, Claude Code용만 나온 점에 대한 생각을 정리한다.
4
언리얼 엔진 5.8 MCP로 본 게임 개발과 에이전틱 코딩의 거리
Unreal Engine언리얼 엔진 5.8 MCP를 Claude Code와 Codex로 써 보고 Epic 세션을 보며, All Toolsets에 이미 포함된 Editor Toolset, 일괄 작업과 비용, 에디터 의존성, 프로젝트 구조 지식의 필요성에 대해 생각한 점을 정리한다.
5
Night of the Dead 멀티플레이를 지금 다시 설계한다면
Unreal EngineNight of the Dead의 멀티플레이 최적화를 새 프로젝트에서 처음부터 설계한다면 바꿀 부분을 좀비의 Mass 전환, Push Model과 Fast Array와 연결별 서브오브젝트 필터를 쓰는 복제, 애플리케이션 계층의 전송 흐름 제어로 나눠 기존 코드와 비교한다.
무작위 게시글무작위

댓글

Profile Image of the Author
Jihoon Jeon
안녕하세요! 서브컬처와 자전거를 사랑하는 개발자 전지훈입니다.
공지사항
제 블로그에 오신 것을 환영합니다! 예시 공지입니다.
카테고리
태그
최신 일상
사이트 통계
게시글
73
카테고리
10
태그
143
총 단어 수
133,527
운영 일수
0일
최근 활동
0일 전
사이트 정보
빌드 플랫폼
GitHub Actions
블로그 버전
Firefly v6.16.9
라이선스
CC BY-NC-SA 4.0
목차