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

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

댓글

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