XR_EXT_frame_synthesis

Name String

XR_EXT_frame_synthesis

Loại tiện ích

Phần mở rộng thực thể

Số máy lẻ đã đăng ký

212

Bản sửa đổi

1

Trạng thái phê chuẩn

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

Phần phụ thuộc của tiện ích và 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 phép ngoại suy và phép 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ế để hoạt động độc lập với XR_KHR_composition_layer_depth và cả hai 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 quá trình 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 . 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 định nghĩa 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ả về thành viên

  • type là XrStructureType của cấu trúc này.
  • next là NULL hoặc con trỏ 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 tỷ lệ diễn giải vectơ chuyển động trong motionVectorSubImage .
  • motionVectorOffset là một XrVector4f bù trừ 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 (di chuyển 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 so với 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 liên quan đến XrCompositionLayerProjection :: space của ứng dụng hiện tại.
  • depthSubImage xác định hình ảnh chiều sâu XrSwapchainSubImage sẽ được dùng để tổng hợp khung hình.
  • minDepth và maxDepth là dải giá trị độ sâu trong depthSubImage và phải nằm trong dải [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 của OpenGL, nhưng có yêu cầu ở đây 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. Ứng dụng có thể sử dụng nearZ lớn hơn farZ để cho biết các giá trị độ 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ằng motionVectorScale và motionVectorOffset 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.

Vectơ 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 hình được kết xuất thành 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ị chuẩn hoá (NDC). Trong bối cảnh này, không gian này sử dụng các quy ước kiểu Vulkan: phạm vi NDC được xác định là [-1, -1, 0] đến [1, 1, 1], khác với phạm vi NDC của OpenGL. Tuy nhiên, bản thân vectơ chuyển động không bị ràng buộc trong phạm vi này; 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 ".

Cách sử dụng hợp lệ (Ngầm ẩn)

Lưu ý

Có nhiều cách để tạo motionVectorSubImage và depthSubImage . Ví dụ: ứng dụng có thể kết xuất các vectơ chuyển động trong một lượt truyề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 vectơ chuyển động trong lượt truyề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 dùng định dạng kênh số thực 16 bit có dấu cho mỗi pixel 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 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 sự đá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 các ứ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 điện toán của mỗi khung hình. Thời gian chạy có thể yêu cầu khung hình theo 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 sẽ yêu cầu dữ liệu vectơ chuyển động 3D, vì vậy, motionVectorSubImage rgb , motionVectorScale xyz và motionVectorOffset xyz sẽ được sử 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 , 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, thể hiện chuyển động pixel 2D từ khung hình trước sang khung hình hiện tại. 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 khung hình tổng hợp.

Cấu trúc XrFrameSynthesisConfigViewEXT được định nghĩa như sau:

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

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

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

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

Cách 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, 31/1/2022 (Jian Zhang)

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