XR_EXT_frame_synthesis

이름 문자열

XR_EXT_frame_synthesis

확장 프로그램 유형

인스턴스 확장 프로그램

등록된 내선 번호

212

버전

1

승인 상태

비준되지 않음

확장 프로그램 및 버전 종속 항목

OpenXR 1.0

도움을 주신 분들

지안 장, Meta Platforms
닐 베데카르, Meta Platforms
샹 웨이, Meta Platforms
궈동 롱, Meta Platforms
트레버 대시, Meta Platforms
레미 아르노, Varjo
파울로 고메스, 삼성전자
브라이스 허칭스, Microsoft
라일리 파블릭, Collabora
슈아이 리우, ByteDance

개요

이 확장 프로그램은 추가 애플리케이션 제공 데이터를 기반으로 애플리케이션에서 프레임 합성을 사용 설정할 수 있도록 지원합니다. 애플리케이션에서 생성된 모션 벡터 이미지와 깊이 이미지는 런타임에서 고품질 프레임 외삽 및 재투영을 실행하여 새 프레임을 합성하는 데 사용될 수 있으며(may), 애플리케이션이 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입니다.
  • next는 NULL 또는 구조 체인의 다음 구조에 대한 포인터입니다.
  • layerFlags는 XrFrameSynthesisInfoFlagsEXT의 비트마스크입니다.
  • motionVectorSubImage는 프레임 합성에 사용할 모션 벡터 이미지 XrSwapchainSubImage를 식별합니다.
  • motionVectorScale는 motionVectorSubImage에서 모션 벡터의 해석을 확장하는 XrVector4f입니다.
  • motionVectorOffset는 motionVectorSubImage에서 모션 벡터의 해석을 오프셋하는 XrVector4f입니다.
  • appSpaceDeltaPose는 이전 프레임 이후 뷰에 영향을 미치는 애플리케이션 적용 증분 변환입니다(있는 경우). 인공적인 이동 (스크립트된 움직임, 순간 이동 등) 경험에는 애플리케이션이 전체 XrCompositionLayerProjection :: space를 한 애플리케이션 공간 포즈에서 프레임 간의 다른 포즈로 변환하여 프레임 간의 추적된 움직임보다 더 많이 뷰에 영향을 미치는 것이 포함됩니다. 애플리케이션에 XrCompositionLayerProjection :: space 변환이 없는 경우 appSpaceDeltaPose는 ID여야 합니다. appSpaceDeltaPose의 XrPosef :: position는 현재 애플리케이션 XrCompositionLayerProjection :: space을 기준으로 해야 합니다.
  • depthSubImage는 프레임 합성에 사용할 깊이 이미지 XrSwapchainSubImage를 식별합니다.
  • minDepth 및 maxDepth은 depthSubImage의 깊이 값 범위이며 [0.0,1.0] 범위 내에 있어야 합니다. 이는 OpenGL의 glDepthRange의 최솟값 및 최댓값과 유사하지만 maxDepth ≥ minDepth라는 요구사항이 있습니다 .
  • nearZ는 깊이 스왑체인에 있는 minDepth 값의 양수 거리(미터)입니다. 애플리케이션은 farZ보다 큰 nearZ를 사용하여 깊이 값이 반전되었음을 나타낼 수 있습니다(may). nearZ는 무한할 수 있습니다.
  • farZ는 깊이 스왑체인에 있는 maxDepth 값의 양수 거리(미터)입니다. farZ는 무한할 수 있습니다. nearZ == farZ인 경우 런타임은 오류 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(must).

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

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

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

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

올바른 사용 (암시적)

참고

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

프레임 합성 플래그

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 사용률을 절약하거나 (예: 배터리 수명 연장) 각 프레임의 컴퓨팅 예산을 늘리려는 애플리케이션에 유용할 수 있습니다. 런타임은 이 플래그의 값과 관계없이 어떤 간격으로든 프레임을 요청할 수 있습니다(may).

기본적으로 런타임은 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입니다.
  • next는 NULL 또는 구조 체인의 다음 구조에 대한 포인터입니다.
  • recommendedMotionVectorImageRectWidth : 권장 모션 벡터 및 깊이 이미지 너비입니다.
  • recommendedMotionVectorImageRectHeight : 권장 모션 벡터 및 깊이 이미지 높이입니다.

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

올바른 사용 (암시적)

  • XrFrameSynthesisConfigViewEXT를 사용하기 전에 XR_EXT_frame_synthesis 확장 프로그램을 사용 설정해야 합니다.
  • type은(는) XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT여야 합니다.
  • next는 NULL 또는 구조 체인의 다음 구조에 대한 유효한 포인터여야 합니다.

새로운 구조

새 enum 상수

  • 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일 (장젠)

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