XR_EXT_frame_synthesis

Name String

XR_EXT_frame_synthesis

Loại phần mở rộng

Tiện ích Instance

Số máy nhánh đã đăng ký

212

Bản sửa đổi

1

Trạng thái phê chuẩn

Chưa được phê chuẩn

Phần mở rộng và các phần phụ thuộc của phiên bản

OpenXR 1.0

Cộng tác viên

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

Tổng quan

Tiện ích này hỗ trợ bật tính năng tổng hợp khung hình trên các ứng dụng dựa trên dữ liệu bổ sung do ứng dụng cung cấp. Thời gian chạy có thể sử dụng hình ảnh vectơ chuyển động và hình ảnh chiều sâu do ứng dụng tạo để thực hiện ngoại suy và chiếu lại khung hình chất lượng cao nhằm tổng hợp một khung hình mới, mang lại trải nghiệm mượt mà ngay cả khi ứng dụng đang chạy dưới mục tiêu FPS.

Tiện ích này được thiết kế độc lập với XR_KHR_composition_layer_depth và cả có thể được bật và sử dụng cùng lúc cho các mục đích khác nhau. XrFrameSynthesisInfoEXT :: depthSubImage có thể sử dụng dữ liệu độ sâu dành riêng cho việc tổng hợp khung hình và độ phân giải của dữ liệu này có thể thấp hơn XrCompositionLayerDepthInfoKHR :: subImage . Hãy xem XrFrameSynthesisConfigViewEXT để biết độ phân giải đề xuất của depthSubImage .

Gửi hình ảnh vectơ chuyển động và hình ảnh chiều sâu

Cấu trúc XrFrameSynthesisInfoEXT được xác định như sau:

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;

Nội dung mô tả thành viên

  • typeXrStructureType của cấu trúc này.
  • nextNULL hoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.
  • layerFlags là một mặt nạ bit của XrFrameSynthesisInfoFlagsEXT .
  • motionVectorSubImage xác định hình ảnh vectơ chuyển động XrSwapchainSubImage sẽ được dùng để tổng hợp khung hình.
  • motionVectorScale là một XrVector4f giúp điều chỉnh cách diễn giải vectơ chuyển động trong motionVectorSubImage .
  • motionVectorOffset là một XrVector4f giúp bù đắp cho việc diễn giải vectơ chuyển động trong motionVectorSubImage .
  • appSpaceDeltaPose là phép biến đổi gia tăng do ứng dụng áp dụng (nếu có), ảnh hưởng đến khung hiển thị kể từ khung hình trước. Trải nghiệm di chuyển nhân tạo (chuyển động theo kịch bản, dịch chuyển tức thời, v.v.) liên quan đến việc ứng dụng chuyển đổi toàn bộ XrCompositionLayerProjection :: space từ tư thế không gian ứng dụng này sang tư thế khác giữa các khung hình, ảnh hưởng đến chế độ xem nhiều hơn chuyển động được theo dõi giữa các khung hình. appSpaceDeltaPose phải là danh tính khi không có phép biến đổi XrCompositionLayerProjection :: space trong ứng dụng. XrPosef :: position trong appSpaceDeltaPose phải tương ứng với XrCompositionLayerProjection :: space hiện tại của ứng dụng .
  • depthSubImage xác định hình ảnh chiều sâu XrSwapchainSubImage sẽ được dùng để tổng hợp khung hình.
  • minDepthmaxDepth là phạm vi giá trị độ sâu trong depthSubImagephải nằm trong phạm vi [0.0, 1.0] . Điều này tương tự như các giá trị tối thiểu và tối đa của glDepthRange trong OpenGL , nhưng có yêu cầu là maxDepth ≥ minDepth .
  • nearZ là khoảng cách dương tính bằng mét của giá trị minDepth trong chuỗi hoán đổi độ sâu. Các ứng dụng có thể sử dụng nearZ lớn hơn farZ để cho biết các giá trị chiều sâu bị đảo ngược. nearZ có thể là vô hạn.
  • farZ là khoảng cách dương tính bằng mét của giá trị maxDepth trong chuỗi hoán đổi độ sâu. farZ có thể là vô hạn. Thời gian chạy phải trả về lỗi XR_ERROR_VALIDATION_FAILURE nếu nearZ == farZ

Khi gửi hình ảnh vectơ chuyển động và hình ảnh chiều sâu cùng với các lớp chiếu, hãy thêm cấu trúc XrFrameSynthesisInfoEXT vào chuỗi XrCompositionLayerProjectionView :: next, cho mỗi cấu trúc XrCompositionLayerProjectionView trong lớp đã cho.

Thời gian chạy phải diễn giải dữ liệu vectơ chuyển động trong các kênh RGB của motionVectorSubImage, được sửa đổi bởi motionVectorScalemotionVectorOffset như sau: motionVector = motionVectorSubImage rgb * motionVectorScale xyz + motionVectorOffset xyz . Các thành phần motionVectorSubImage a , motionVectorScale w và motionVectorOffset w sẽ bị bỏ qua.

Véc tơ chuyển động biểu thị chuyển động của một pixel kể từ XrFrameEndInfo ::displayTime của khung hình trước cho đến XrFrameEndInfo ::displayTime của khung hình hiện tại. Thời gian chạy có thể sử dụng thông tin này để ngoại suy khung được kết xuất thành một khung hình trong tương lai.

Vectơ chuyển động phải bắt nguồn từ không gian toạ độ thiết bị được chuẩn hoá (NDC). Trong ngữ cảnh này, không gian này sử dụng các quy ước theo kiểu Vulkan: dải NDC được xác định là [-1, -1, 0] đến [1, 1, 1], khác với dải NDC của OpenGL. Tuy nhiên, bản thân vectơ chuyển động không bị giới hạn trong phạm vi này; các giá trị của vectơ chuyển động phụ thuộc vào chuyển động của pixel và có thể vượt ra ngoài ranh giới của không gian NDC. Ví dụ: giả sử NDC của một pixel trong khung hình trước là PrevNDC và CurrNDC trong khung hình hiện tại, đồng thời không có tỷ lệ hoặc độ lệch, thì giá trị vectơ chuyển động là " (CurrNDC – PrevNDC) xyz ".

Sử dụng hợp lệ (Ngầm ẩn)

Lưu ý

Có nhiều cách để tạo motionVectorSubImagedepthSubImage . Ví dụ: ứng dụng có thể kết xuất các đối tượng này trong một đường chuyền vectơ chuyển động chuyên dụng có độ phân giải thấp hơn (xem XrFrameSynthesisConfigViewEXT để biết độ phân giải được đề xuất) hoặc kết xuất các đối tượng này trong đường chuyền chế độ xem chính bằng MRT (Nhiều mục tiêu kết xuất). Ứng dụng sẽ quyết định phương pháp cụ thể. Bạn nên sử dụng các định dạng kênh số thực 16 bit có dấu cho motionVectorSubImage .

Cờ tổng hợp khung hình

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;

Nội dung mô tả cờ

  • XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT cho biết dữ liệu vectơ chuyển động 2D được sử dụng.
  • XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT cung cấp một gợi ý cho thời gian chạy rằng ứng dụng muốn có thêm thời gian để kết xuất từng khung hình, với điểm đánh đổi là thời gian chạy sẽ tổng hợp nhiều khung hình hơn. Điều này có thể hữu ích cho những ứng dụng muốn tiết kiệm mức sử dụng CPU và GPU (ví dụ: để tăng thời lượng pin) hoặc tăng ngân sách tính toán của mỗi khung hình. Thời gian chạy có thể yêu cầu các khung hình ở bất kỳ khoảng thời gian nào, bất kể giá trị của cờ này.

Theo mặc định, thời gian chạy dự kiến sẽ có dữ liệu vectơ chuyển động 3D, vì vậy , motionVectorSubImage rgb, motionVectorScale xyz và motionVectorOffset xyz sẽ được dùng như mô tả trong XrFrameSynthesisInfoEXT .

Khi XR_FRAME_SYNTHESIS_INFO_USE_2D_MOTION_VECTOR_BIT_EXT được bật trên XrFrameSynthesisInfoEXT layerFlags, thay vào đó, thời gian chạy sẽ diễn giải hình ảnh vectơ chuyển động đã gửi dưới dạng dữ liệu vectơ chuyển động 2D, biểu thị chuyển động của pixel 2D từ khung hình trước sang khung hình hiện tại. Các giá trị pixel được diễn giải như sau đối với dữ liệu vectơ chuyển động 2D: motionVector = motionVectorSubImage rg * motionVectorScale xy + motionVectorOffset xy . Các thành phần motionVectorSubImage ba , motionVectorScale zw và motionVectorOffset zw sẽ bị bỏ qua. Việc sử dụng dữ liệu vectơ chuyển động 2D thay vì 3D có thể làm giảm chất lượng của các khung hình được tổng hợp.

Cấu trúc XrFrameSynthesisConfigViewEXT được xác định như sau:

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

Nội dung mô tả thành viên

  • typeXrStructureType của cấu trúc này.
  • nextNULL hoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.
  • recommendedMotionVectorImageRectWidth : chiều rộng được đề xuất của vectơ chuyển động và hình ảnh độ sâu.
  • recommendedMotionVectorImageRectHeight : chiều cao được đề xuất của vectơ chuyển động và hình ảnh độ sâu.

Khi tiện ích này được bật, một ứng dụng có thể truyền cấu trúc XrFrameSynthesisConfigViewEXT trong chuỗi XrViewConfigurationView :: next khi gọi xrEnumerateViewConfigurationViews để thu thập thông tin về độ phân giải hình ảnh vectơ chuyển động được đề xuất.

Sử dụng hợp lệ (Ngầm ẩn)

Cấu trúc mới

Hằng số Enum mới

  • XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAME
  • XR_EXT_frame_synthesis_SPEC_VERSION
  • Mở rộng XrStructureType :

    • XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT
    • XR_TYPE_FRAME_SYNTHESIS_INFO_EXT

Vấn đề

Nhật ký phiên bản

  • Bản sửa đổi 1, ngày 31/1/2022 (Jian Zhang)

    • Nội dung mô tả ban đầu của tiện ích, được chuyển đổi từ fb_space_warp
    • Cộng tác với người đóng góp để tinh chỉnh các giao diện tiện ích.