OpenXR 앱 모범 사례
아래 모범 사례의 예는 BasicXrApp의 OpenXRProgram.cpp 파일에서 확인할 수 있습니다. 시작 부분에 있는 Run() 함수는 초기화에서 이벤트 및 렌더링 루프로의 일반적인 OpenXR 앱 코드 흐름을 캡처합니다.
시각적 품질 및 안정성에 대한 모범 사례
이 섹션의 모범 사례에서는 OpenXR 애플리케이션에서 최상의 시각적 품질과 안정성을 얻는 방법을 설명합니다.
HoloLens 2 관련된 추가 성능 권장 사항은 아래의 HoloLens 2 성능 모범 사례 섹션을 참조하세요.
감마 올바른 렌더링
렌더링 파이프라인이 감마 올바른지 확인하려면 주의해야 합니다. 스왑 체인으로 렌더링할 때 렌더링 대상 보기 형식은 스왑 체인 형식과 일치해야 합니다. 예를 들어 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
스왑 체인 형식과 렌더링 대상 뷰 모두에 대해 입니다.
앱의 렌더링 파이프라인이 셰이더 코드에서 수동 sRGB 변환을 수행하는 경우 예외가 있습니다. 앱은 sRGB 스왑 체인 형식을 요청해야 하지만 렌더링 대상 보기에는 선형 형식을 사용합니다. 예를 들어 를 스왑 체인 형식으로 요청 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
하지만 렌더링 대상 보기로 를 사용하여 DXGI_FORMAT_B8G8R8A8_UNORM
콘텐츠가 이중 감마로 수정되지 않도록 합니다.
프로젝션 계층에 대한 깊이 버퍼 제출
프레임을 에 제출할 때 항상 확장을 사용하고 XR_KHR_composition_layer_depth
프로젝션 계층과 함께 깊이 버퍼를 제출합니다 xrEndFrame
.
HoloLens 2 하드웨어 깊이 다시 프로젝션을 사용하도록 설정하면 홀로그램 안정성이 향상됩니다.
적절한 깊이 범위 선택
HoloLens의 홀로그램 안정성을 돕기 위해 가상 콘텐츠를 scope 더 좁은 깊이 범위를 선호합니다.
예를 들어 OpenXrProgram.cpp 샘플은 0.1m~20미터를 사용합니다.
더 균일한 깊이 해상도를 위해 역방향-Z 를 사용합니다.
16비트 깊이 버퍼는 24비트 깊이 버퍼보다 깊이 해상도가 낮지만 HoloLens 2 기본 DXGI_FORMAT_D16_UNORM
설정 깊이 형식을 사용하면 프레임 속도와 성능을 향상하는 데 도움이 됩니다.
깊이 해상도를 최대한 활용하기 위해 이러한 모범 사례를 따르는 것이 더 중요해집니다.
다양한 환경 혼합 모드 준비
애플리케이션이 전 세계를 완전히 차단하는 몰입형 헤드셋에서도 실행되는 경우 API를 사용하여 xrEnumerateEnvironmentBlendModes
지원되는 환경 혼합 모드를 열거하고 렌더링 콘텐츠를 올바르게 준비해야 합니다.
예를 들어 HoloLens와 XR_ENVIRONMENT_BLEND_MODE_ADDITIVE
같은 시스템의 경우 앱은 투명을 명확한 색으로 사용해야 하고, 가 있는 XR_ENVIRONMENT_BLEND_MODE_OPAQUE
시스템의 경우 앱은 불투명한 색이나 일부 가상 공간을 백그라운드에서 렌더링해야 합니다.
애플리케이션의 루트 공간으로 바인딩되지 않은 참조 공간 선택
애플리케이션은 일반적으로 보기, 작업 및 홀로그램을 함께 연결하기 위해 일부 루트 월드 좌표 공간을 설정합니다.
확장이 지원되는 경우 를 사용하여 XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT
세계적 규모의 좌표계를 설정하여 앱이 시작되는 위치에서 사용자가 멀리(예: 5미터 떨어진) 이동할 때 원치 않는 홀로그램 드리프트를 방지할 수 있습니다.
바인딩되지 않은 공간 확장이 없는 경우 대체로 사용합니다 XR_REFERENCE_SPACE_TYPE_LOCAL
.
홀로그램을 공간 앵커와 연결
바인딩되지 않은 참조 공간을 사용할 때 해당 참조 공간에 직접 배치하는 홀로그램은 사용자가 먼 방으로 걸어간 다음 돌아올 때 표류할 수 있습니다.
홀로그램 사용자가 세계의 개별 위치에 배치하는 경우 확장 함수 를 사용하여 공간 앵커 를 xrCreateSpatialAnchorSpaceMSFT
만들고 홀로그램을 원본 위치에 배치합니다. 그러면 시간이 지남에 따라 홀로그램을 독립적으로 안정적으로 유지할 수 있습니다.
혼합 현실 캡처 지원
HoloLens 2 기본 디스플레이는 추가 환경 혼합을 사용하지만 사용자가 혼합 현실 캡처를 시작하면 앱의 렌더링 콘텐츠가 환경 비디오 스트림과 알파 혼합됩니다.
혼합 현실 캡처 비디오에서 최상의 시각적 품질을 얻으려면 프로젝션 계층layerFlags
의 에서 를 XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT
설정하는 것이 가장 좋습니다.
HoloLens 2 성능에 대한 모범 사례
하드웨어 다시 프로젝션을 지원하는 모바일 디바이스인 HoloLens 2 최적의 성능을 위해 더 엄격한 요구 사항을 가지고 있습니다. 컴퍼지션 데이터를 제출하는 방법에는 여러 가지가 있으며, 이로 인해 사후 처리에서 눈에 띄는 성능 저하가 발생합니다.
스왑 체인 형식 선택
항상 를 사용하여 xrEnumerateSwapchainFormats
지원되는 픽셀 형식을 열거하고 앱이 지원하는 런타임에서 첫 번째 색 및 깊이 픽셀 형식을 선택합니다. 런타임이 최적의 성능을 위해 선호하기 때문입니다. HoloLens 2 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
DXGI_FORMAT_D16_UNORM
및 는 일반적으로 더 나은 렌더링 성능을 달성하기 위한 첫 번째 선택입니다. 이 기본 설정은 24비트 깊이 버퍼가 성능에 미치는 영향이 적은 데스크톱 PC에서 실행되는 VR 헤드셋에서 다를 수 있습니다.
성능 경고: 기본 스왑 체인 색 형식 이외의 형식을 사용하면 런타임 후처리가 발생하므로 성능이 크게 저하됩니다.
권장 렌더링 매개 변수 및 프레임 타이밍을 사용하여 렌더링
항상 권장 보기 구성 너비/높이(recommendedImageRectWidth
및 recommendedImageRectHeight
) XrViewConfigurationView
로 렌더링하고 항상 API를 사용하여 xrLocateViews
렌더링하기 전에 권장 보기 포즈, FOV 및 기타 렌더링 매개 변수를 쿼리합니다.
포즈 및 보기를 쿼리할 때 항상 최신 xrWaitFrame
호출의 를 사용합니다XrFrameEndInfo.predictedDisplayTime
.
이를 통해 HoloLens는 렌더링을 조정하고 HoloLens를 착용하는 사람의 시각적 품질을 최적화할 수 있습니다.
단일 프로젝션 계층 사용
HoloLens 2 콘텐츠 렌더링을 위한 GPU 전원이 제한되어 있으며 단일 프로젝션 계층에 최적화된 하드웨어 작성기가 있습니다. 항상 단일 프로젝션 계층을 사용하면 애플리케이션의 프레임 속도, 홀로그램 안정성 및 시각적 품질에 도움이 될 수 있습니다.
성능 경고: 단일 보호 계층을 제외한 모든 항목을 제출하면 런타임 후처리가 발생하므로 상당한 성능 저하가 발생합니다.
텍스처 배열 및 VPRT를 사용하여 렌더링
xrSwapchain
색 스왑 체인에 를 사용하여 arraySize=2
왼쪽 및 오른쪽 눈 둘 다에 대해 하나를 만들고 깊이를 위해 하나를 만듭니다.
왼쪽 눈을 슬라이스 0으로, 오른쪽 눈을 조각 1로 렌더링합니다.
VPRT와 함께 셰이더를 사용하고 GPU 부하를 최소화하기 위해 스테레오스코픽 렌더링에 대한 인스턴스 그리기 호출을 사용합니다.
또한 런타임의 최적화를 통해 HoloLens 2 최상의 성능을 달성할 수 있습니다.
이중 와이드 렌더링 또는 눈당 별도의 스왑 체인과 같은 텍스처 배열을 사용하는 대신 런타임 후처리를 수행하면 상당한 성능 저하가 발생합니다.
쿼드 계층 방지
를 사용하여 쿼드 계층을 컴퍼지션 계층 XrCompositionLayerQuad
으로 제출하는 대신 쿼드 콘텐츠를 프로젝션 스왑 체인에 직접 렌더링합니다.
성능 경고: 쿼드 계층과 같은 단일 프로젝션 계층을 넘어 추가 계층을 제공하면 런타임 후처리가 발생하므로 성능이 크게 저하됩니다.