UDN
Search public documentation:

PrecomputedVisibilityKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 렌더링 > Precomputed Visibility (표시여부 미리계산) UE3 홈 > 모바일 홈 > Precomputed Visibility (표시여부 미리계산)

Precomputed Visibility (표시여부 미리계산)


문서 변경내역: Daniel Wright 작성. 홍성진 번역.

개요


(QA_APPROVED_BUILD_AUG_2010로 예정된) cl 572477부터 라이팅 빌드 도중에 표시여부를 미리계산하는 기능이 UE3에 추가됩니다.

표시여부 미리계산 기능의 가장 큰 수혜자는 hardware occlusion query(하드웨어 오클루전 퀴리)를 지원하지 않는 모바일 플랫폼이 될 것이며, 콘솔의 분할화면처럼 렌더링 쓰레드 병목현상이 생기는 상황에서의 렌더링 시간 절약 등에도 도움이 될 것입니다. 표시여부 미리계산 기능은 약간의 실행시간 메모리와 라이팅 빌드시간 증가를 비용으로 삼고, 게임내 렌더링 쓰레드 시간을 줄이는 것입니다. 동적인 오클루전 컬링 시스템은 수렴 시간이 필요한(코너를 돌거나 시야를 빠르게 돌릴 때의 퍼포먼스가 낮은) 반면, 이 기능은 동적인 오클루전 컬링 시스템이 처리하는 프리미티브 수를 줄여 렌더링 시간을 절약하는 방식을 통해 빠르게 작동합니다. 이 기술은 레벨 크기에 따라 메모리 및 연산력도 많이 필요하게 되므로 중간 크기 이하의 레벨에서만 유용합니다. 또한 대부분 정적인 환경, 플레이어 이동이 제한된 게임이나 2d 플레이 구역에서도 좋겠습니다.

알림: 표시여부 미리계산 빌드시에는 라이트매스 가 필요합니다.

게임에 표시여부 미리계산 기능 사용하도록 설정하기


게임마다 스케일이 다르기에, 표시여부 계산에 대한 파라미터도 각 게임에 맞춰 미세조정해 줘야 합니다. BaseLightmass.ini 에 있는 DevOptions.PrecomputedVisibility 부분에 있습니다. DefaultLightmass.ini 에다 DevOptions.PrecomputedVisibility 부분을 만들어서 덮어씌워 버립니다. 가장 처음 미세조정해야 할 설정은:

  • PlayAreaHeight (플레이어 영역 높이) - 표면에서부터 카메라가 올라갈 수 있는 높이. 보통 키가 가장 큰 플레이어의 눈높이 + 점프 높이 입니다. 기본값은 220 입니다.

레벨에 표시여부 미리계산 기능 사용하도록 설정하기


먼저, 레벨 플레이구역 주변으로 PrecomputedVisibilityVolume 을 하나 이상 만듭니다. 브러시 모양은 사각형이거나 축에 맞출 필요는 없으며, 어떤 모양도 좋습니다. 메모리 사용량과 빌드 시간을 최적화시키기 위해서는 가급적 플레이 구역에 꼭 맞는 경계를 설정하는 것이 좋겠습니다.

VolumeMenu.jpg

다음으로 보기->WorldInfo->PrecomputedVisibility 에서 bPrecomputeVisibility 를 켭니다. 그리고 레벨 라이팅을 빌드합니다. 카메라가 보이는 셀에 있으면, 렌더러가 가려진 걸로 판단된 오브젝트를 컬링(생략)합니다.

셀 배치


보이는 셀은 방금 놓은 PrecomputedVisibilityVolume 내의 그림자 드리우기 지오메트리 바로 위에 놓이며, 해당 볼륨 밖에 있더라도 마티네 이동 트랙을 따릅니다. 표시여부 미리계산 기능은 뷰어가 이 셀 내부에 있을 때만 작동하기에, 대부분의 비행 구간에서는 켜지지 않습니다.

아래 그림은 UDK의 DM-Sanctuary에서 녹색 볼륨 내의 표면에 있는 파랑색 표시 셀을 나타냅니다:

CellPlacementSmall.jpg

이 그림은 마티네 이동 트랙을 따라 놓인 파랑 표시 셀들을 나타냅니다:

CellPlacementCameraTrackSmall.jpg

결과물 시각화


에디터에는 뷰 하나를 다른 뷰에 대한 'occlusion parent'(오클루전 부모)로 설정하는 기능이 있습니다. 오클루전 미리보기를 통해 미리계산된 오클루전(precomputed occlusion)도 시각화시켜 볼 수 있습니다.

  1. 먼저 표시여부 미리계산용 레벨을 설정하고서 라이팅 빌드
  2. 뷰포트를 설정합니다. 1x1 수직분할이 좋습니다. 모든 뷰에 실시간 업데이트를 켜야 합니다. 원근보기 창을 플레이 영역 (내 visibility 볼륨 안, 약간 땅 근처부분)으로 이동하여 셀 내부에 위치시킵니다. 콘솔에 'stat initviews'라 쳐서 원근보기 창에 대한 통계를 켰을 때 'Statically Occluded Primitives'(정적으로 가려진 프리미티브) 값이 0 이외의 값으로 나오면 잘 돌고 있는 것입니다.
  3. 콘솔에 'ToggleOcclusion'이라 쳐서 동적인 오클루전 시스템을 끕니다. 로그에 'Occlusion queries are now disabled'(오클루전 퀴리 기능이 꺼졌습니다)라는 메시지가 뜰 겁니다. 이를 통해 미리계산된 오클루전 결과만을 볼 수 있습니다.
  4. 원근보기 창에서 뷰포트 내리펼침 메뉴를 통해 'View Culling/Occlusion'(컬링/오클루전 보기)를 선택합니다.

원근보기 창의 frustum(절두체)는 분홍 와이어프레임 뷰로 보이게 되고, 미리계산된 오클루전에 의해 컬링되지 않은 메시를 확인해 볼 수 있습니다.

이 씬에서 보면 표시여부 미리계산을 통해 프리미티브가 2487개 컬링되었음을 알 수 있으며, (아래는 '정적으로 가려진 프리미티브' 통계), 오른편의 와이어프레임에서는 전부 숨겨진 상태입니다:

OcclusionPreviewOn.jpg

아래는 똑같은 씬의 보이는 셀 밖으로 카메라를 약간 옮긴 것으로, 아무것도 가려지지 않고 있으며, 오른편의 와이어프레임에 새로생긴 메시를 볼 수 있습니다:

OcclusionPreviewOff.jpg

표시여부 세팅


Settings.jpg

관련 통계


  • 'stat initviews' 아래 '정적으로 가려진 프리미티브'를 통해 절두체 컬링이 일어난 이후 표시여부 미리계산에 의해 생략된 프리미티브가 얼마나 많은지 알아볼 수 있습니다. '가려진 프리미티브'는 표시여부 미리계산 및 동적인 오클루전 시스템 둘 다에 의해 생략되도록 결정된 프리미티브가 몇이나 되는지를 표시해 줍니다. 이 두 통계간의 차이점은 표시여부 미리계산이 놓친 것 중 동적인 오클루전 시스템이 컬링한 프리미티브 수를 표시해 줍니다. 표시여부 미리계산이 잘 돌아가면 '정적으로 가려진 프리미티브'는 '가려진 프리미티브'의 50-80% 사이가 됩니다. 표시여부 미리계산의 오브젝트 컬링이 덜한 이유는 큰 셀에 대한 정보만 저장할 뿐, 동적이거나 마스킹된 가리개(occluder)를 처리하지는 않기 때문입니다. (제한 사항 참고) 주의: 이 통계는 게임내 또는 PIE에서만 신뢰할 수 있으며, 에디터에선 디버그에 관련된 것들도 그려지기에 신뢰할 수 없습니다.
  • 'stat initviews' 아래 '오클루전 압축해제'로 표시여부 미리계산 압축을 해제하는데 걸린 시간을 알아볼 수 있습니다.
  • 'stat memory' 아래 '표시여부 미리계산 메모리'로 계산하는데 사용된 실행시간 메모리를 표시해 줍니다. 알림: 이 통계는 PIE에서는 신뢰할 수 없으며, 에디터로 체크인 하거나 게임에서 해야 합니다. PIE일 때는 PIE와 에디터 메모리 둘 다 계산되기 때문입니다.

결과


다음은 기어즈 오브 워 3 MP 레벨에 적당한 (구멍이 별로 없는 커다란 불투명) 가리개를 두고, 분할화면에서 둘 다 맵 중앙을 바라본 상태입니다:

  • 가려진 프리미티브 전체 2180개 중에서 정적으로 가려진 것은 1739개
  • Xbox 360에서 오클루전 미리계산 없이 한 경우에 비교하면 렌더링 쓰레드 시간이 2.7ms(35.4ms -> 32.7ms) 절약되었습니다. 동적인 오클루전 시스템은 시간이 좀 걸리는 반면, 표시여부 미리계산 기능은 바로 켤 수 있다는 것이 주요 장점입니다. 그래서 코너를 처음 돌거나 화면을 빠르게 돌리는 경우, 제대로 측정하기는 힘들겠습니다만 표시여부 미리계산 기능을 켰을 때의 프레임 시간이 빠를 것입니다.
  • 표시여부 미리계산 데이터 크기 627Kb
  • 새 지역으로 이동하여 해당 지역에 대해 압축해제를 할 때의 렌더링 쓰레드 버벅임(hitch)은 1ms로 아주 미미합니다.

제한 사항


현재 표시여부 미리계산 구현에는 다음과 같은 제한사항이 있습니다:

  • 이동가능 오브젝트나 가리개(occluder)를 처리하지 않습니다.
  • 불투명하지 않은 가리개는 처리하지 않습니다. 보통 마스킹된 가리개의 구멍은 감지하기 힘들기 때문입니다.
  • 표면 위에만 셀을 놓기에, 날아다니는 모드가 있는 게임에서는 별로 득이 되지 않습니다.
  • 스트리밍 레벨을 효율적으로 처리하지 못합니다. 모든 데이터는 스트리밍 레벨의 스트림인/아웃되는 곳이 아닌, 지속 레벨에 저장됩니다.
  • 정적 그림자를 드리우는 트라이앵글만 가립니다. 즉 lightmapped interpactor(라이트매핑된 보간액터)는 가리지 말아야할 때 가리고, 그림자를 드리우지 않는 이동불가 오브젝트는 정작 가려야 할 때 못가리는 등, 아직 똥오줌을 잘 못가린다는 뜻입니다.

곧 개선될 예정입니다.

표시여부 문제 버그잡이


표시여부 미리계산 버그를 잡을 때 도움이 되는 콘솔 명령 을 몇 가지 들어보자면:

  • TogglePrecomputedVisibility (표시여부 미리계산 토글) - 표시여부 미리계산된 데이터 사용을 토글합니다.
  • ShowPrecomputedVisibility (표시여부 미리계산 표시) - 표시여부 미리계산 셀의 디버그 시각화를 토글합니다.

사라지는 오브젝트가 있는 경우 TogglePrecomputedVisibility 로 나타나게 할 수 있으며, 표시여부 미리계산 기능이 문제를 유발하고 있으면 기존 PrecomputedVisibilityVolumes 를 조절하거나 새로 만들어서 지역이 제대로 덮였는지 확인해 보십시오.