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
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
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ 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 tỷ lệ diễn giải vectơ chuyển động trongmotionVectorSubImage.motionVectorOffsetlà một XrVector4f bù trừ 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 (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 ::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 so với 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 liên quan đến XrCompositionLayerProjection ::spacecủa ứng dụng hiện tại.depthSubImagexác định hình ảnh chiều sâu XrSwapchainSubImage sẽ được dùng để tổng hợp khung hình.minDepthvàmaxDepthlà dải giá trị độ sâu trongdepthSubImagevà 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ủaglDepthRangecủa OpenGL, nhưng có yêu cầu ở đây 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. Ứng dụng có thể sử dụngnearZlớn hơnfarZđể cho biết các giá trị độ 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ằ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)
- 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à cấu trúc XrSwapchainSubImage hợp lệ -
depthSubImagephải là 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 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_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 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.
Xem giải pháp đề xuất
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
typelà XrStructureType của cấu trúc này.nextlàNULLhoặ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)
- Tiện ích
XR_EXT_frame_synthesisphải được bật trướ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, 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.