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 홀로그램 안정성을 돕기 위해 가상 콘텐츠의 범위를 좁히려면 더 좁은 깊이 범위를 선호합니다. 예를 들어 OpenXrProgram.cpp 샘플은 0.1m~20미터를 사용합니다. 보다 균일한 깊이 해상도를 위해 역방향-Z 를 사용합니다. HoloLens 2 16비트 깊이 버퍼는 24비트 깊이 버퍼보다 깊이 해상도가 낮지만 기본 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_SRGBDXGI_FORMAT_D16_UNORM 일반적으로 더 나은 렌더링 성능을 얻기 위한 첫 번째 선택입니다. 이 기본 설정은 24비트 깊이 버퍼가 성능에 미치는 영향이 적은 데스크톱 PC에서 실행되는 VR 헤드셋에서 다를 수 있습니다.

성능 경고: 기본 스왑 체인 색 형식 이외의 형식을 사용하면 런타임 후처리가 발생하며, 이로 인해 상당한 성능 저하가 발생합니다.

항상 권장되는 뷰 구성 너비/높이(recommendedImageRectWidthrecommendedImageRectHeight 원본 XrViewConfigurationView)를 사용하여 렌더링하고 항상 API를 사용하여 xrLocateViews 렌더링하기 전에 권장되는 뷰 포즈, FOV 및 기타 렌더링 매개 변수를 쿼리합니다. 포즈 및 뷰를 XrFrameEndInfo.predictedDisplayTime 쿼리할 때 항상 최신 xrWaitFrame 호출에서 사용합니다. 이렇게 하면 HoloLens 렌더링을 조정하고 HoloLens 착용하는 사용자의 시각적 품질을 최적화할 수 있습니다.

단일 프로젝션 계층 사용

HoloLens 2 콘텐츠 렌더링을 위한 GPU 전원이 제한되고 단일 프로젝션 계층에 최적화된 하드웨어 작성기가 있습니다. 항상 단일 프로젝션 계층을 사용하면 애플리케이션의 프레임 속도, 홀로그램 안정성 및 시각적 품질에 도움이 될 수 있습니다.

성능 경고: 단일 보호 계층을 제외한 모든 항목을 제출하면 런타임 후처리가 발생하며, 이로 인해 상당한 성능 저하가 발생합니다.

텍스처 배열 및 VPRT를 사용하여 렌더링

xrSwapchain 색 스왑 체인을 사용하여 arraySize=2 왼쪽 및 오른쪽 눈 둘 다에 대해 하나를 만들고 깊이를 위해 하나를 만듭니다. 왼쪽 눈을 조각 0으로, 오른쪽 눈을 조각 1로 렌더링합니다. VPRT와 함께 셰이더를 사용하고 스테레오스코픽 렌더링에 대한 인스턴스 그리기 호출을 사용하여 GPU 부하를 최소화합니다. 또한 런타임의 최적화를 통해 HoloLens 2 최상의 성능을 달성할 수 있습니다. 이중 와이드 렌더링 또는 눈당 별도의 스왑 체인과 같은 텍스처 배열을 사용하는 대신 런타임 후처리가 발생하여 성능이 크게 저하됩니다.

쿼드 계층 방지

쿼드 계층을 컴퍼지션 계층으로 XrCompositionLayerQuad제출하는 대신 쿼드 콘텐츠를 프로젝션 스왑 체인으로 직접 렌더링합니다.

성능 경고: 쿼드 계층과 같은 단일 프로젝션 계층을 초과하는 추가 계층을 제공하면 런타임 후처리가 발생하므로 성능이 크게 저하됩니다.