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

FParticleSystemSceneProxy의 잘못된 위치·스케일 로그 진단

708 단어
4 분
FParticleSystemSceneProxy의 잘못된 위치·스케일 로그 진단

파티클을 렌더링할 때 다음과 같이 projection 결과가 유효하지 않다는 로그가 반복됐다.

ObjectPostProjectionPositionWithW ... W: 0
ObjectNDCPosition ... inf
FParticleSystemSceneProxy::GetObjectPositionAndScale

문제 현상#

scene proxy가 particle system 위치에 view projection을 적용한 뒤 perspective divide에 사용할 W가 0이 됐다. 그 결과 normalized device coordinate가 inf가 되어 MacroUV 위치와 scale 계산이 유효하지 않았다.

적용 범위#

Cascade particle system과 MacroUV 또는 object position/scale 계산 경로에서 동일한 로그가 나타나는 UE 프로젝트를 다룬다. 원문에는 exact engine version과 최소 재현 asset이 없어 원인을 확정하지 않은 초안이다.

가능한 원인#

  • component transform에 NaN, Inf 또는 비정상적인 scale이 들어간다.
  • parent attachment가 파괴되거나 갱신되는 frame에 잘못된 world transform을 사용한다.
  • view/projection의 경계 조건에서 object position의 clip-space W가 0에 가까워진다.
  • MacroUV position 또는 radius가 effect 크기와 맞지 않는다.
  • engine version별 particle proxy 계산 버그가 있다.

원문 프로젝트에서는 component의 world Z가 정확히 0일 때 재현됐고 작은 non-zero offset을 주자 로그가 사라졌다. 다만 이는 상관관계이자 진단용 workaround일 뿐, 모든 파티클에서 Z=0이 잘못이라는 뜻은 아니다.

재현 및 진단#

  1. 로그 직전 component location, rotation, scale과 parent transform을 기록해 둔다.
  2. 각 float에 FMath::IsFinite 검사를 넣어 최초 invalid 값이 생기는 지점을 찾아낸다.
  3. world origin, Z=0, camera near plane과 큰 좌표에서 각각 비교해 본다.
  4. MacroUV를 끄거나 position/radius를 바꿔 해당 경로와의 관련성을 확인한다.
  5. 같은 asset을 새 level의 독립 component로 재현해 본다.

해결 방법#

invalid transform이 발견되면 값을 만드는 gameplay/attachment 코드를 고친다. MacroUV 설정이 실제 effect와 맞지 않다면 position과 radius를 유효한 범위로 조정한다. 작은 Z offset만으로 회피된다면 workaround의 근거와 적용 범위를 주석으로 남기고 exact engine revision의 GetObjectPositionAndScale 구현과 관련 issue를 계속 확인한다.

검증 방법#

  • 원점과 원점 밖, 여러 camera angle과 FOV에서 로그를 확인해 본다.
  • component attach/detach, pooling과 level transition을 반복한다.
  • Development와 Shipping에 가까운 render 설정에서 시각 결과를 서로 비교한다.
  • 로그가 없어졌을 뿐 아니라 particle의 크기·MacroUV가 올바른지도 살핀다.

주의점#

좌표에 임의의 epsilon을 더하면 잘못된 transform이나 projection 문제를 숨길 위험이 있다. W == 0 검사를 제거하거나 무조건 1로 바꾸면 화면 위치와 크기가 왜곡되므로 엔진을 수정하기 전에 입력값부터 추적한다.

참고 자료#

글 공유하기

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

FParticleSystemSceneProxy의 잘못된 위치·스케일 로그 진단
https://hon454.github.io/posts/unreal-engine-particle-bad-position-scale/
작성자
Jihoon Jeon
게시일
2023-11-15
라이선스
CC BY-NC-SA 4.0
관련 게시글스마트
1
Unreal Engine PIE에서 클라이언트와 서버 값을 한 줄로 비교하기
Unreal EnginePIE에서 클라이언트 코드가 같은 프로세스의 서버 월드와 서버 측 PlayerController를 찾아 위치·속도를 한 줄로 비교하는 에디터 전용 디버그 코드와, 네트워크 에뮬레이션으로 확인한 측정 결과를 정리합니다.
2
면접 오답노트: 말하지 못한 주요 개념, Net Relevancy
Unreal Engine면접에서 제대로 답하지 못한 Net Relevancy를 다시 정리한다. AActor::IsNetRelevantFor의 판정 순서와 문서와 다른 부분, Owner가 판정을 바꾸는 방식, 연관성을 잃고 되찾을 때 RelevantTimeout과 액터 파괴, BeginPlay, OnRep, RPC에 생기는 일, ForceNetRelevant와 Replication Graph, Iris에서의 주의점, Dormancy, Priority와의 차이를 다룬다.
3
언리얼 엔진의 리플리케이션 및 RPC 순서 보장
Unreal Engine프로퍼티 복제와 OnRep, RPC의 순서 보장 범위를 살펴보고, 일시적인 상태 불일치와 액터 간 준비 순서를 처리하는 방법을 예시로 정리한다.
4
[노트] Unreal Engine Skills for Claude Code
Unreal EngineEpic Games가 공개한 Claude Code 플러그인 Unreal Engine Skills for Claude Code의 스킬 3개와 SessionStart 훅을 읽고, 스킬의 트리거 설계와 문서화 규칙, 엔진 쪽 Agent Skill, 보안 경고의 범위, MCP와 스킬의 역할 분담, Claude Code용만 나온 점에 대한 생각을 정리한다.
5
언리얼 엔진 5.8 MCP로 본 게임 개발과 에이전틱 코딩의 거리
Unreal Engine언리얼 엔진 5.8 MCP를 Claude Code와 Codex로 써 보고 Epic 세션을 보며, All Toolsets에 이미 포함된 Editor Toolset, 일괄 작업과 비용, 에디터 의존성, 프로젝트 구조 지식의 필요성에 대해 생각한 점을 정리한다.
무작위 게시글무작위

댓글

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
목차