XR_EXT_frame_synthesis

이름 문자열

XR_EXT_frame_synthesis

확장 프로그램 유형

인스턴스 확장 프로그램

등록된 확장 프로그램 번호

212

버전

1

비준 상태

비준되지 않음

확장 프로그램 및 버전 종속성

OpenXR 1.0

도움을 주신 분들

Jian Zhang, Meta Platforms
Neel Bedekar, Meta Platforms
Xiang Wei, Meta Platforms
Guodong Rong, Meta Platforms
Trevor Dasch, Meta Platforms
Rémi Arnaud, Varjo
Paulo Gomes, Samsung Electronics
Bryce Hutchings, Microsoft
Rylie Pavlik, Collabora
Shuai Liu, ByteDance

개요

이 확장 프로그램은 추가 애플리케이션 제공 데이터를 기반으로 애플리케이션에서 프레임 합성 사용을 지원합니다. 애플리케이션에서 생성된 모션 벡터 이미지와 깊이 이미지는 런타임에서 고품질 프레임 외삽 및 재투영을 실행하여 새 프레임을 합성하는 데 사용될 수 있으며, 애플리케이션이 FPS 타겟 미만으로 실행되는 경우에도 원활한 환경을 제공합니다.

이 확장 프로그램은 XR_KHR_composition_layer_depth와 독립적으로 설계되었으며, 서로 다른 목적으로 동시에 사용 설정하고 사용할 수 있습니다. XrFrameSynthesisInfoEXT :: depthSubImage는 프레임 합성을 위한 전용 깊이 데이터를 사용할 수 있으며, 해상도는 XrCompositionLayerDepthInfoKHR :: subImage보다 낮을 수 있습니다 . depthSubImage의 권장 해상도는 XrFrameSynthesisConfigViewEXT를 참고하세요 .

모션 벡터 이미지 및 깊이 이미지 제출

XrFrameSynthesisInfoEXT 구조는 다음과 같이 정의됩니다.

typedef struct XrFrameSynthesisInfoEXT {
    XrStructureType                 type;
    const void*                     next;
    XrFrameSynthesisInfoFlagsEXT    layerFlags;
    XrSwapchainSubImage             motionVectorSubImage;
    XrVector4f                      motionVectorScale;
    XrVector4f                      motionVectorOffset;
    XrPosef                         appSpaceDeltaPose;
    XrSwapchainSubImage             depthSubImage;
    float                           minDepth;
    float                           maxDepth;
    float                           nearZ;
    float                           farZ;
} XrFrameSynthesisInfoEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.
  • layerFlagsXrFrameSynthesisInfoFlagsEXT의 비트마스크입니다 .
  • motionVectorSubImage는 프레임 합성에 사용할 모션 벡터 이미지 XrSwapchainSubImage를 식별합니다.
  • motionVectorScaleXrVector4f이며, motionVectorSubImage에서 모션 벡터의 해석을 확장합니다 .
  • motionVectorOffsetXrVector4f이며, motionVectorSubImage에서 모션 벡터의 해석을 오프셋합니다 .
  • appSpaceDeltaPose는 이전 프레임 이후 뷰에 영향을 미치는 증분 애플리케이션 적용 변환입니다(있는 경우). 인공 이동 (스크립팅된 이동, 순간이동 등) 환경에는 애플리케이션이 전체 XrCompositionLayerProjection :: space를 한 애플리케이션 공간 포즈에서 프레임 간의 다른 포즈로 변환하여 프레임 간의 추적된 이동보다 뷰에 더 큰 영향을 미치는 작업이 포함됩니다. 애플리케이션에 XrCompositionLayerProjection :: space 변환이 없는 경우 appSpaceDeltaPose 는 ID여야 합니다. XrPosef :: positionappSpaceDeltaPose 현재 애플리케이션 XrCompositionLayerProjection :: space를 기준으로 해야 합니다 .
  • depthSubImage는 프레임 합성에 사용할 깊이 이미지 XrSwapchainSubImage를 식별합니다.
  • minDepthmaxDepthdepthSubImage의 깊이 값 범위이며 [0.0,1.0] 범위에 있어야 합니다. 이는 OpenGL의 glDepthRange의 최솟값 및 최댓값과 유사하지만 여기서는 maxDepth ≥ minDepth 요구사항이 있습니다 .
  • nearZ는 깊이 스왑체인의 minDepth 값의 양의 거리(미터)입니다. 애플리케이션은 깊이 값이 반전되었음을 나타내기 위해 farZ보다 큰 nearZ를 사용할 수 있습니다. nearZ는 무한대일 수 있습니다.
  • farZ는 깊이 스왑체인의 maxDepth 값의 양의 거리(미터)입니다. farZ는 무한대일 수 있습니다. nearZ == farZ인 경우 런타임은 XR_ERROR_VALIDATION_FAILURE 오류를 반환해야 합니다.

투영 레이어와 함께 모션 벡터 이미지와 깊이 이미지를 제출할 때는 지정된 레이어의 각 XrCompositionLayerProjectionView 구조에 대해 XrFrameSynthesisInfoEXT 구조를 XrCompositionLayerProjectionView :: next 체인에 추가합니다.

런타임은 motionVectorScalemotionVectorOffset에 의해 수정된 motionVectorSubImage의 RGB 채널에 있는 모션 벡터 데이터를 다음과 같이 해석해야 합니다. motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz 구성요소 motionVectorSubImage a, motionVectorScale w, motionVectorOffset w는 무시됩니다.

모션 벡터는 이전 프레임의 XrFrameEndInfo ::displayTime부터 현재 프레임의 XrFrameEndInfo ::displayTime까지 픽셀의 이동을 나타냅니다. 런타임은 이 정보를 사용하여 렌더링된 프레임을 향후 프레임으로 외삽할 수 있습니다.

모션 벡터는 정규화된 기기 좌표 (NDC) 공간에서 파생되어야 하며, 이 컨텍스트에서는 Vulkan 스타일 규칙을 사용합니다. NDC 범위는 OpenGL의 NDC 범위와 다른 [-1, -1, 0] 에서 [1, 1, 1]로 정의됩니다. 하지만 모션 벡터 자체는 이 범위로 제한되지 않습니다. 값은 픽셀의 이동에 따라 다르며 NDC 공간의 경계를 벗어날 수 있습니다. 예를 들어 이전 프레임의 픽셀 NDC가 PrevNDC이고 현재 프레임의 CurrNDC이며 확장 또는 오프셋이 없다고 가정하면 모션 벡터 값은 '(CurrNDC - PrevNDC) xyz'입니다.

유효한 사용 (암시적)

부가 정보

motionVectorSubImagedepthSubImage를 생성하는 방법은 다양합니다 . 예를 들어 애플리케이션은 전용 모션 벡터 패스에서 낮은 해상도로 렌더링하거나 (권장 해상도는 XrFrameSynthesisConfigViewEXT 참고) MRT (Multiple Render Targets)를 사용하여 기본 뷰 패스에서 렌더링할 수 있습니다. 특정 접근 방식을 결정하는 것은 애플리케이션에 달려 있습니다. 픽셀 채널 형식당 부호 있는 16비트 부동 소수점은 motionVectorSubImage에 권장됩니다 .

프레임 합성 플래그

typedef XrFlags64 XrFrameSynthesisInfoFlagsEXT;

// Flag bits for XrFrameSynthesisInfoFlagsEXT
static const XrFrameSynthesisInfoFlagsEXT XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT = 0x00000001;
static const XrFrameSynthesisInfoFlagsEXT XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT = 0x00000002;

플래그 설명

  • XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT는 2D 모션 벡터 데이터가 사용됨을 나타냅니다.
  • XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT는 런타임에 애플리케이션이 각 프레임을 렌더링하는 데 추가 시간을 선호한다는 힌트를 제공하며, 런타임에서 더 많은 프레임이 합성된다는 절충안이 있습니다. 이는 CPU 및 GPU 사용률을 절약하거나 (예: 배터리 수명 증가) 각 프레임의 컴퓨팅 예산을 늘리려는 애플리케이션에 유용할 수 있습니다. 런타임은 이 플래그의 값과 관계없이 모든 간격으로 프레임을 요청할 수 있습니다.

기본적으로 런타임은 3D 모션 벡터 데이터를 예상하므로 XrFrameSynthesisInfoEXT에 설명된 대로 motionVectorSubImage rgb, motionVectorScale xyz, motionVectorOffset xyz가 사용됩니다 .

XrFrameSynthesisInfoEXT layerFlags에서 XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT가 사용 설정되면 런타임은 제출된 모션 벡터 이미지를 이전 프레임에서 현재 프레임으로의 2D 픽셀 이동을 나타내는 2D 모션 벡터 데이터로 해석합니다. 픽셀 값은 2D 모션 벡터 데이터에 대해 다음과 같이 해석됩니다. motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy 구성요소 motionVectorSubImage ba, motionVectorScale zw, motionVectorOffset zw는 무시됩니다. 3D 모션 벡터 데이터 대신 2D를 사용하면 합성된 프레임의 품질이 저하될 수 있습니다.

XrFrameSynthesisConfigViewEXT 구조는 다음과 같이 정의됩니다.

typedef struct XrFrameSynthesisConfigViewEXT {
    XrStructureType    type;
    void*              next;
    uint32_t           recommendedMotionVectorImageRectWidth;
    uint32_t           recommendedMotionVectorImageRectHeight;
} XrFrameSynthesisConfigViewEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.
  • recommendedMotionVectorImageRectWidth : 권장 모션 벡터 및 깊이 이미지 너비
  • recommendedMotionVectorImageRectHeight : 권장 모션 벡터 및 깊이 이미지 높이

이 확장 프로그램이 사용 설정되면 애플리케이션은 xrEnumerateViewConfigurationViews를 호출하여 권장 모션 벡터 이미지 해상도에 관한 정보를 가져올 때 XrViewConfigurationView :: next 체인에서 XrFrameSynthesisConfigViewEXT 구조를 전달할 수 있습니다.

유효한 사용 (암시적)

새 구조

새 열거형 상수

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • XrStructureType 확장 :

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_TYPE_FRAME_SYNTHESIS_INFO_EXT

문제

버전 기록

  • 버전 1, 2022년 1월 31일 (Jian Zhang)

    • fb_space_warp에서 변환된 초기 확장 프로그램 설명
    • 도움을 주신 분들과 협력하여 확장 프로그램 인터페이스를 개선합니다.