Ciąg znaków nazwy
XR_ANDROID_composition_layer_passthrough_mesh
Typ rozszerzenia
Rozszerzenie instancji
Zarejestrowany numer wewnętrzny
463
Weryfikacja
1
Zależności rozszerzenia i wersji
Data ostatniej modyfikacji
2024-09-18
Stan adresu IP
Brak znanych roszczeń dotyczących adresu IP.
Twórcy
Grant Yoshida, Google
Kevin Moule, Google
Vasiliy Baranov, Google
Peter Chen, Google
Levana Chen, Google
Omówienie
W przypadku urządzeń obsługujących wiele trybów mieszania środowiska system może udostępniać konfiguracje przepuszczania, aby pokazać użytkownikowi jego fizyczne otoczenie w wyświetlanym ujęciu.
To rozszerzenie umożliwia aplikacjom wyświetlanie tekstur typu passthrough na dowolnej geometrii za pomocą dodatkowej warstwy kompozytowej XrCompositionLayerPassthroughANDROID.
Właściwości warstwy przepuszczającej są określane przez te parametry, w których projekcja jest reprezentowana przez XrPassthroughLayerANDROID.
XrPosef pose;
XrVector3f scale;
float opacity;
XrPassthroughLayerANDROID layer;
W przypadku przesyłania obrazu w trybie pełnoekranowym aplikacje mogą używać trybu mieszania środowiska.
Sprawdzanie możliwości systemu
Aplikacja może sprawdzić, czy system jest w stanie stworzyć siatkę przepuszczania warstwy kompozycji, łącząc strukturę XrSystemPassthroughLayerPropertiesANDROID z XrSystemProperties podczas wywołania xrGetSystemProperties.
typedef struct XrSystemPassthroughLayerPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsPassthroughLayer;
uint32_t maxMeshIndexCount;
uint32_t maxMeshVertexCount;
} XrSystemPassthroughLayerPropertiesANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktury. Nie ma żadnych takich struktur zdefiniowanych w podstawowym OpenXR ani w tym rozszerzeniu.supportsPassthroughLayer
toXrBool32
, który wskazuje, czy bieżący system obsługuje siatkę przepuszczania warstwy kompozycji.maxMeshIndexCount
touint32_t
zwraca maksymalną liczbę indeksów, które zostaną zaakceptowane dla siatki przepuszczania.maxMeshVertexCount
touint32_t
zwraca maksymalną liczbę wierzchołków, które zostaną zaakceptowane dla siatki przelotowej.
Jeśli supportsPassthroughLayer
zwraca XR_FALSE
, system nie obsługuje siatki przekazywania warstwy kompozycji, dlatego otrzyma XR_ERROR_FEATURE_UNSUPPORTED
z xrCreatePassthroughLayerANDROID. Aplikacja nie powinna używać siatki przepuszczania warstwy kompozytowej, gdy supportsPassthroughLayer
ma wartość XR_FALSE
.
Jeśli supportsPassthroughLayer
zwraca XR_TRUE
, system obsługuje siatkę przepuszczania kompozycji warstwy. W tym przypadku maxMeshIndexCount
i maxMeshVertexCount
zwrócą liczbę niezerową. Aplikacja powinna używać wartości maxMeshIndexCount
i maxMeshVertexCount
jako maksymalnych wartości do ustawiania siatek przepuszczania podczas wywoływania funkcji xrCreatePassthroughLayerANDROID i xrSetPassthroughLayerMeshANDROID. W przeciwnym razie może zostać zwrócona wartość XR_ERROR_MESH_DATA_LIMIT_EXCEEDED_ANDROID
, aby wskazać, że dane siatki przekraczają obsługiwany limit.
Prawidłowe użycie (domyślne)
- Zanim użyjesz funkcji XrSystemPassthroughLayerPropertiesANDROID, musisz włączyć rozszerzenie
XR_ANDROID_composition_layer_passthrough_mesh
. type
musi byćXR_TYPE_SYSTEM_PASSTHROUGH_LAYER_PROPERTIES_ANDROID
next
musi byćNULL
lub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury.
Kompozycja warstwy przepuszczającej
Struktura XrCompositionLayerPassthroughANDROID zawiera informacje potrzebne do renderowania przezroczystej tekstury na siatce trójkątów podczas wywoływania funkcji xrEndFrame. XrCompositionLayerPassthroughANDROID to typ aliasu dla podstawowej struktury XrCompositionLayerBaseHeader używanej w XrFrameEndInfo.
typedef struct XrCompositionLayerPassthroughANDROID {
XrStructureType type;
const void* next;
XrCompositionLayerFlags layerFlags;
XrSpace space;
XrPosef pose;
XrVector3f scale;
float opacity;
XrPassthroughLayerANDROID layer;
} XrCompositionLayerPassthroughANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktury. W podstawowym OpenXR ani w tym rozszerzeniu nie zdefiniowano żadnych takich struktur.layerFlags
to maska bitowa XrCompositionLayerFlags, która opisuje flagi stosowane do warstwy.space
to XrSpace, w którympose
siatki warstwy jest oceniana w czasie.pose
toXrPosef
określający położenie i orientację siatki warstwy w układzie odniesieniaspace
.scale
toXrVector3f
określający skalę siatki warstwy.opacity
tofloat
określający przezroczystość tekstury w zakresie [0, 1].layer
to obiekt XrPassthroughLayerANDROID utworzony wcześniej przez funkcję xrCreatePassthroughLayerANDROID.
Aplikacja może utworzyć strukturę XrCompositionLayerPassthroughANDROID z utworzoną warstwą layer
i odpowiednimi siatkami udostępnionymi przez XrPassthroughLayerMeshANDROID.
W xrEndFrame można przesłać wskaźnik do XrCompositionLayerPassthroughANDROID jako wskaźnik do struktury podstawowej XrCompositionLayerBaseHeader w wybranym porządku warstw, aby poprosić środowisko wykonawcze o złożenie warstwy przepuszczającej do wyjścia ostatniej ramki.
Prawidłowe użycie (domyślne)
- Zanim użyjesz rozszerzenia XrCompositionLayerPassthroughANDROID, musisz włączyć rozszerzenie
XR_ANDROID_composition_layer_passthrough_mesh
. type
musi byćXR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_ANDROID
next
musi byćNULL
lub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury.layerFlags
musi być0
lub prawidłową kombinacją wartości XrCompositionLayerFlagBitsspace
musi być prawidłowym identyfikatorem XrSpacelayer
musi być prawidłowym uchwytem XrPassthroughLayerANDROID- Obie wartości
layer
ispace
muszą zostać utworzone, przypisane lub pobrane z tego samego XrSession.
Tworzenie uchwytu warstwy przelotowej
Uchwyt XrPassthroughLayerANDROID reprezentuje warstwę przelotową, która określa działanie XrCompositionLayerPassthroughANDROID.
XR_DEFINE_HANDLE(XrPassthroughLayerANDROID)
Aplikacja może utworzyć obiekt XrPassthroughLayerANDROID, wywołując funkcję xrCreatePassthroughLayerANDROID. Zwrócony obiekt XrPassthroughLayerANDROID może być następnie użyty w wywołaniach interfejsu API.
XrResult xrCreatePassthroughLayerANDROID(
XrSession session,
const XrPassthroughLayerCreateInfoANDROID* createInfo,
XrPassthroughLayerANDROID* layer);
Opisy parametrów
session
to XrSession, w której zostanie utworzona warstwa przepuszczania.createInfo
to wskaźnik do struktury XrPassthroughLayerCreateInfoANDROID, która określa początkowe parametry warstwy przepuszczającej. To pole można również połączyć z strukturą XrPassthroughLayerMeshANDROID, aby ustawić siatkę w tym samym czasie.layer
to wskaźnik do uchwytu, w którym zwracana jest utworzona XrPassthroughLayerANDROID.
Aplikacja powinna określić liczbę indeksów siatki przepuszczania w XrPassthroughLayerCreateInfoANDROID::vertexCapacity i XrPassthroughLayerCreateInfoANDROID::indexCapacity, która jest mniejsza lub równa maksymalnym wartościom zwracanym przez XrSystemPassthroughLayerPropertiesANDROID::maxMeshIndexCount i XrSystemPassthroughLayerPropertiesANDROID::maxMeshVertexCount podczas wywołania xrGetSystemProperties. xrCreatePassthroughLayerANDROID zwraca błąd XR_ERROR_MESH_DATA_LIMIT_EXCEEDED_ANDROID
, jeśli liczba indeksów siatki zdefiniowana przez createInfo
jest większa niż maksymalne wartości.
Musisz ostatecznie zwolnić uchwyt XrPassthroughLayerANDROID, używając funkcji xrDestroyPassthroughLayerANDROID
.
Prawidłowe użycie (domyślne)
- Rozszerzenie
XR_ANDROID_composition_layer_passthrough_mesh
musi być włączone przed wywołaniem funkcji xrCreatePassthroughLayerANDROID. session
musi być prawidłowym identyfikatorem XrSessioncreateInfo
musi być wskaźnikiem do prawidłowej struktury XrPassthroughLayerCreateInfoANDROIDlayer
musi być wskaźnikiem do uchwytu XrPassthroughLayerANDROID.
Kody zwrotu
XR_SUCCESS
XR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_VALIDATION_FAILURE
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_HANDLE_INVALID
XR_ERROR_INSTANCE_LOST
XR_ERROR_SESSION_LOST
XR_ERROR_OUT_OF_MEMORY
XR_ERROR_LIMIT_REACHED
XR_ERROR_SIZE_INSUFFICIENT
XR_ERROR_MESH_DATA_LIMIT_EXCEEDED_ANDROID
Struktura XrPassthroughLayerCreateInfoANDROID jest zdefiniowana w ten sposób:
typedef struct XrPassthroughLayerCreateInfoANDROID {
XrStructureType type;
const void* next;
uint32_t vertexCapacity;
uint32_t indexCapacity;
} XrPassthroughLayerCreateInfoANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
to NULL lub wskaźnik do następnej struktury w łańcuchu struktur. XrPassthroughLayerMeshANDROID może być przekazywany w kolejnych łańcuchach, aby określić początkową siatkę dla warstwy przepuszczania podczas wywoływania funkcji xrCreatePassthroughLayerANDROID.vertexCapacity
touint32_t
reprezentujący maksymalną pojemność bufora wierzchołków dla siatki tego poziomu lub0
, jeśli nie określono inaczej. Jeśli została określona, wartość XrPassthroughLayerMeshANDROID::vertexCount dowolnego zestawu siatek dla tej warstwy musi być mniejsza lub równa wartościvertexCapacity
.indexCapacity
touint32_t
reprezentujący maksymalną pojemność bufor indeksu siatki tego poziomu lub0
, jeśli nie jest określony. Jeśli został określony, liczba indeksów XrPassthroughLayerMeshANDROID::indexCount dowolnego zestawu siatek dla tej warstwy musi być mniejsza lub równaindexCapacity
.
Prawidłowe użycie (domyślne)
- Przed użyciem funkcji XrPassthroughLayerCreateInfoANDROID musi być włączone rozszerzenie
XR_ANDROID_composition_layer_passthrough_mesh
. type
musi byćXR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_ANDROID
next
musi byćNULL
lub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury. Zobacz też: XrPassthroughLayerMeshANDROID
Aplikacja może użyć funkcji xrDestroyPassthroughLayerANDROID
, aby zwolnić warstwę przepuszczania i podstawowe zasoby.
XrResult xrDestroyPassthroughLayerANDROID(
XrPassthroughLayerANDROID layer);
Opisy parametrów
layer
to XrPassthroughLayerANDROID, który ma zostać zniszczony.
Prawidłowe użycie (domyślne)
- Przed wywołaniem funkcji
xrDestroyPassthroughLayerANDROID
musi być włączone rozszerzenieXR_ANDROID_composition_layer_passthrough_mesh
layer
musi być prawidłowym uchwytem XrPassthroughLayerANDROID
Bezpieczeństwo wątków
- Dostęp do
layer
i wszystkich jego obiektów potomnych musi być zsynchronizowany zewnętrznie.
Kody zwrotu
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_HANDLE_INVALID
Ustawianie siatki warstwy przepuszczania
Aplikacja może użyć funkcji xrSetPassthroughLayerMeshANDROID, aby skonfigurować siatkę dla warstwy przelotowej.
XrResult xrSetPassthroughLayerMeshANDROID(
XrPassthroughLayerANDROID layer,
const XrPassthroughLayerMeshANDROID* mesh);
Opisy parametrów
layer
to uchwyt XrPassthroughLayerANDROID, w którym można aktualizować danemesh
.mesh
to wskaźnik do struktury XrPassthroughLayerMeshANDROID, która zawiera informacje o siatce.
Aplikacja powinna określić liczbę indeksów siatki przepuszczania w XrPassthroughLayerMeshANDROID::vertexCount i XrPassthroughLayerMeshANDROID::indexCount, która jest mniejsza bądź równa maksymalnym wartościom zwracanym przez XrSystemPassthroughLayerPropertiesANDROID::maxMeshIndexCount i XrSystemPassthroughLayerPropertiesANDROID::maxMeshVertexCount podczas wywoływania xrGetSystemProperties. Jeśli liczba indeksów siatki zwracana przez mesh
z xrSetPassthroughLayerMeshANDROID jest większa niż maksymalna liczba wartości, zwracana jest wartość XR_ERROR_MESH_DATA_LIMIT_EXCEEDED_ANDROID
.
Jeśli pojemność bufora siatki jest określona przez XrPassthroughLayerCreateInfoANDROID::vertexCapacity i XrPassthroughLayerCreateInfoANDROID::indexCapacity podczas tworzenia layer
za pomocą xrCreatePassthroughLayerANDROID, błąd XR_ERROR_SIZE_INSUFFICIENT
zostanie zwrócony w xrSetPassthroughLayerMeshANDROID, jeśli liczba indeksów siatki zdefiniowanych przez mesh
jest większa niż pojemność.
Prawidłowe użycie (domyślne)
- Rozszerzenie
XR_ANDROID_composition_layer_passthrough_mesh
musi być włączone przed wywołaniem funkcji xrSetPassthroughLayerMeshANDROID. layer
musi być prawidłowym uchwytem XrPassthroughLayerANDROIDmesh
musi być wskaźnikiem do prawidłowej struktury XrPassthroughLayerMeshANDROID
Kody zwrotu
XR_SUCCESS
XR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_VALIDATION_FAILURE
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_HANDLE_INVALID
XR_ERROR_INSTANCE_LOST
XR_ERROR_SESSION_LOST
XR_ERROR_OUT_OF_MEMORY
XR_ERROR_LIMIT_REACHED
XR_ERROR_SIZE_INSUFFICIENT
XR_ERROR_MESH_DATA_LIMIT_EXCEEDED_ANDROID
Struktura XrPassthroughLayerMeshANDROID jest zdefiniowana jako:
typedef struct XrPassthroughLayerMeshANDROID {
XrStructureType type;
const void* next;
XrWindingOrderANDROID windingOrder;
uint32_t vertexCount;
const XrVector3f* vertices;
uint32_t indexCount;
const uint16_t* indices;
} XrPassthroughLayerMeshANDROID;
Opisy członków
type
to XrStructureType tej struktury.next
toNULL
lub wskaźnik do następnej struktury w łańcuchu struktur.windingOrder
to XrWindingOrderANDROID trójkątów siatki, która będzie używana do odrzucania tylnych powierzchni podczas renderowania siatki.vertexCount
touint32_t
reprezentujący liczbę wierzchołków w siatce. Gdy parametr XrPassthroughLayerCreateInfoANDROID::vertexCapacity jest określony, parametrvertexCount
musi być mniejszy lub równy parametrowivertexCapacity
.vertices
to wskaźnik do tablicyXrVector3f
, która zawiera pozycje wierzchołków siatki trójkątnej.
indexCount
touint32_t
, czyli liczba indeksów w siatce trójkątów. OstatnieindexCount % 3
indeksów (jeśli takie istnieją) nie zostaną wylosowane. Gdy określono parametr XrPassthroughLayerCreateInfoANDROID::indexCapacity, wartośćindexCount
musi być mniejsza lub równa wartościindexCapacity
.indices
to wskaźnik do tablicyuint16_t
, która zawiera indeksy siatki trójkąta.
Prawidłowe użycie (domyślne)
- Przed użyciem rozszerzenia XrPassthroughLayerMeshANDROID musi być włączone rozszerzenie
XR_ANDROID_composition_layer_passthrough_mesh
. type
musi byćXR_TYPE_PASSTHROUGH_LAYER_MESH_ANDROID
next
musi byćNULL
lub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury.windingOrder
musi być prawidłową wartością XrWindingOrderANDROID.- Jeśli
vertexCount
nie jest0, vertices
, musi być wskaźnikiem do tablicy strukturvertexCount
XrVector3f. - Jeśli
indexCount
nie jest0, indices
, musi być wskaźnikiem do tablicy wartościindexCount uint16_t
.
Wyliczenie XrWindingOrderANDROID identyfikuje kolejność nawijania trójkątów siatki, która jest używana przez środowisko uruchomieniowe do odrzucania tylnych powierzchni podczas renderowania siatki warstwy przepuszczania.
typedef enum XrWindingOrderANDROID {
XR_WINDING_ORDER_UNKNOWN_ANDROID = 0,
XR_WINDING_ORDER_CW_ANDROID = 1,
XR_WINDING_ORDER_CCW_ANDROID = 2
} XrWindingOrderANDROID;
Opisy wyliczanych
XR_WINDING_ORDER_UNKNOWN_ANDROID
— kolejność nawinięcia trójkątów siatki jest nieznana.XR_WINDING_ORDER_CW_ANDROID
— kolejność nawinięcia trójkątów siatki jest zgodna z kierunkiem wskazówek zegara.XR_WINDING_ORDER_CCW_ANDROID
— Kolejność nawinięcia trójkątów siatki jest przeciwna do ruchu wskazówek zegara.
Przykładowy kod do tworzenia kompozycji warstwy przepuszczania
Poniższy przykładowy kod pokazuje, jak utworzyć warstwę przepuszczającą i użyć jej w kompozycji.
XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized
XrSpace space; // previously initialized
// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreatePassthroughLayerANDROID xrCreatePassthroughLayerANDROID; // previously initialized
PFN_xrDestroyPassthroughLayerANDROID xrDestroyPassthroughLayerANDROID; // previously initialized
PFN_xrSetPassthroughLayerMeshANDROID xrSetPassthroughLayerMeshANDROID; // previously initialized
// Inspect passthrough mesh system properties
XrSystemPassthroughLayerPropertiesANDROID passthroughLayerSystemProperties{
XR_TYPE_SYSTEM_PASSTHROUGH_LAYER_PROPERTIES_ANDROID};
XrSystemProperties systemProperties{
XR_TYPE_SYSTEM_PROPERTIES, &passthroughLayerSystemProperties};
CHK_XR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (!passthroughLayerSystemProperties.supportsPassthroughLayer) {
// the system does not support composite layer passthrough mesh.
return;
}
// The initial mesh for the layer.
XrPassthroughLayerMeshANDROID mesh = {
.type = XR_TYPE_PASSTHROUGH_LAYER_MESH_ANDROID,
.windingOrder = XR_WINDING_ORDER_CW_ANDROID,
.vertexCount = 4,
.vertices = {
{ 0, 0, 0 }, { 0, 1, 0 }, { 1, 1, 0 }, { 1, 0, 0 }
},
.indexCount = 6,
.indices = {
0, 1, 2,
0, 2, 3
},
};
// Create the layer. Layers are expected to persist across frames.
XrPassthroughLayerCreateInfoANDROID create_info = {
.type = XR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_ANDROID,
.next = &mesh,
.vertexCapacity = 0,
.indexCapacity = 0,
};
XrPassthroughLayerANDROID layer;
CHK_XR(xrCreatePassthroughLayerANDROID(session, &create_info, &layer));
// Create a composition layer. Composition layers are submitted per frame.
XrCompositionLayerPassthroughANDROID passthrough_layer = {
.type = XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_ANDROID,
.next = nullptr,
.layerFlags = 0,
.space = space,
.pose = {
.orientation = { 0.0f, 0.0f, 0.0f, 1.0f }
.position = { 0.0f, 0.0f, 0.0f }
},
.scale = { 1.0f, 1.0f, 1.0f },
.opacity = 1.0f,
.layer = layer
};
while (1) {
// ...
// For every frame in frame loop
// ...
// Submit composition layer in xrEndFrame.
std::vector<XrCompositionLayerBaseHeader*> layers = {
...,
&passthrough_layer,
...,
};
XrFrameEndInfo end_frame_info = { XR_TYPE_FRAME_END_INFO, nullptr };
end_frame_info.layerCount = (uint32_t)layers.size();
end_frame_info.layers = layers.data();
CHK_XR(xrEndFrame(session, &end_frame_info));
// Update the layer. Results can be seen the next time a passthrough composition
// layer is submitted.
mesh.indexCount = 9;
const uint16_t new_index_buffer[] = {
0, 1, 2,
0, 2, 3,
0, 1, 2
};
mesh.indexBuffer = &new_index_buffer[0];
CHK_XR(xrSetPassthroughLayerMeshANDROID(&layer, &mesh));
// ...
// Finish frame loop
// ...
}
// Clean up.
CHK_XR(xrDestroyPassthroughLayerANDROID(layer));
Nowe typy obiektów
Nowe stałe typu wyliczeniowego
Wyliczenie XrObjectType zostało rozszerzone o:
XR_OBJECT_TYPE_PASSTHROUGH_LAYER_ANDROID
Wyliczenie XrStructureType zostało rozszerzone o:
XR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_ANDROID
XR_TYPE_PASSTHROUGH_LAYER_MESH_ANDROID
XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_ANDROID
XR_TYPE_SYSTEM_PASSTHROUGH_LAYER_PROPERTIES_ANDROID
Wyliczenie XrResult zostało rozszerzone o:
XR_ERROR_MESH_DATA_LIMIT_EXCEEDED_ANDROID
Nowe wartości w polu enum
Nowe struktury
- XrPassthroughLayerCreateInfoANDROID
- XrPassthroughLayerMeshANDROID
- XrCompositionLayerPassthroughANDROID
- XrSystemPassthroughLayerPropertiesANDROID
Nowe funkcje
- xrCreatePassthroughLayerANDROID
xrDestroyPassthroughLayerANDROID
- xrSetPassthroughLayerMeshANDROID
Problemy
Historia wersji
- Wersja 1, 11 września 2024 r. (Levana Chen)
- Początkowy opis rozszerzenia