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
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
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc.layerFlagslà một mặt nạ bit của XrFrameSynthesisInfoFlagsEXT .motionVectorSubImagexác định hình ảnh vectơ chuyển động XrSwapchainSubImage sẽ được dùng để tổng hợp khung hình.motionVectorScalelà một XrVector4f giúp điều chỉnh cách diễn giải vectơ chuyển động trongmotionVectorSubImage.motionVectorOffsetlà một XrVector4f giúp bù đắp cho việc diễn giải vectơ chuyển động trongmotionVectorSubImage.appSpaceDeltaPoselà 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 ::spacetừ 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.appSpaceDeltaPosephải là danh tính khi không có phép biến đổi XrCompositionLayerProjection ::spacetrong ứng dụng. XrPosef ::positiontrongappSpaceDeltaPosephải tương ứng với XrCompositionLayerProjection ::spacehiện tại của ứng dụng .depthSubImagexác định hình ảnh chiều sâu XrSwapchainSubImage sẽ được dùng để tổng hợp khung hình.minDepthvàmaxDepthlà phạm vi giá trị độ sâu trongdepthSubImagevà phả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ủaglDepthRangetrong OpenGL , nhưng có yêu cầu là maxDepth ≥ minDepth .nearZlà khoảng cách dương tính bằng mét của giá trịminDepthtrong chuỗi hoán đổi độ sâu. Các ứng dụng có thể sử dụngnearZlớn hơnfarZđể cho biết các giá trị chiều sâu bị đảo ngược.nearZcó thể là vô hạn.farZlà khoảng cách dương tính bằng mét của giá trịmaxDepthtrong chuỗi hoán đổi độ sâu.farZcó thể là vô hạn. Thời gian chạy phải trả về lỗiXR_ERROR_VALIDATION_FAILUREnếunearZ==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 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.
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)
- Bạn phải bật tiện ích
XR_EXT_frame_synthesistrước khi sử dụng XrFrameSynthesisInfoEXT -
typephải làXR_TYPE_FRAME_SYNTHESIS_INFO_EXT -
nextphải làNULLhoặc một con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúc -
layerFlagsphải là0hoặc một tổ hợp hợp lệ của các giá trị XrFrameSynthesisInfoFlagBitsEXT -
motionVectorSubImagephải là một cấu trúc XrSwapchainSubImage hợp lệ -
depthSubImagephải là một cấu trúc XrSwapchainSubImage hợp lệ
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 đố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_EXTcho biết dữ liệu vectơ chuyển động 2D được sử dụng.XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXTcung 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.
Nhận độ phân giải được đề xuất
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
typelà XrStructureType của cấu trúc này.nextlàNULLhoặ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)
- Bạn phải bật tiện ích
XR_EXT_frame_synthesistrước khi sử dụng XrFrameSynthesisConfigViewEXT -
typephải làXR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXT -
nextphải làNULLhoặc một con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúc
Cấu trúc mới
Mở rộng XrCompositionLayerProjectionView :
Mở rộng XrViewConfigurationView :
Hằng số Enum mới
XR_EXT_FRAME_SYNTHESIS_EXTENSION_NAMEXR_EXT_frame_synthesis_SPEC_VERSIONMở rộng XrStructureType :
XR_TYPE_FRAME_SYNTHESIS_CONFIG_VIEW_EXTXR_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.