名前の文字列
XR_ANDROID_composition_layer_passthrough_mesh
拡張機能の種類
インスタンスの拡張
登録されている電話番号
463
リビジョン
1
拡張機能とバージョンの依存関係
最終更新日
2024-09-18
IP ステータス
既知の IP に関する申し立てはありません。
寄与者
Grant Yoshida、Google
Kevin Moule、Google
Vasiliy Baranov、Google
Peter Chen、Google
Levana Chen、Google
概要
複数の環境のブレンドモードをサポートするデバイスの場合、システムはパススルー構成を提供して、没入型ビューからユーザーに物理環境を表示する場合があります。
この拡張機能により、アプリケーションは追加のコンポジション レイヤ XrCompositionLayerPassthroughANDROID を介して、任意のジオメトリにパススルー テクスチャを投影できます。
パススルー レイヤの特性には、次のパラメータを使用します。ここで、投影は XrPassthroughLayerANDROID で表されます。
XrPosef pose;
XrVector3f scale;
float opacity;
XrPassthroughLayerANDROID layer;
全画面パススルーの場合、アプリケーションは環境のブレンドモードを使用できます。
システムの機能を確認する
アプリは、xrGetSystemProperties を呼び出すときに XrSystemPassthroughLayerPropertiesANDROID 構造を XrSystemProperties に連結することで、システムがコンポジション レイヤ パススルー メッシュを処理できるかどうかを検査できます。
typedef struct XrSystemPassthroughLayerPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsPassthroughLayer;
uint32_t maxMeshIndexCount;
uint32_t maxMeshVertexCount;
} XrSystemPassthroughLayerPropertiesANDROID;
メンバーの説明
type
は、この構造の XrStructureType です。next
はNULL
または構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。supportsPassthroughLayer
はXrBool32
で、現在のシステムが合成レイヤ パススルー メッシュをサポートしているかどうかを示します。maxMeshIndexCount
は、パススルー メッシュで受け入れられるインデックスの最大数を返すuint32_t
です。maxMeshVertexCount
は、パススルー メッシュで受け入れられる頂点の最大数を返すuint32_t
です。
supportsPassthroughLayer
が XR_FALSE
を返す場合、システムはコンポジション レイヤ パススルー メッシュをサポートしていないため、xrCreatePassthroughLayerANDROID から XR_ERROR_FEATURE_UNSUPPORTED
を受信します。supportsPassthroughLayer
が XR_FALSE
の場合、アプリケーションはコンポジション レイヤ パススルー メッシュの使用を避けるべきです。
supportsPassthroughLayer
が XR_TRUE
を返す場合、システムはコンポジション レイヤ パススルー メッシュをサポートしています。この場合、maxMeshIndexCount
と maxMeshVertexCount
はゼロ以外の数値を返します。アプリケーションは、xrCreatePassthroughLayerANDROID と xrSetPassthroughLayerMeshANDROID を呼び出すときに、パススルー メッシュを設定するための最大値として maxMeshIndexCount
と maxMeshVertexCount
を使用する必要があります。そうしないと、メッシュデータがサポートされている上限を超えていることを示す XR_ERROR_MESH_DATA_LIMIT_EXCEEDED_ANDROID
が返される可能性があります。
有効な使用方法(暗黙的)
- XrSystemPassthroughLayerPropertiesANDROID を使用する前に、
XR_ANDROID_composition_layer_passthrough_mesh
拡張機能を有効にする必要があります。 type
はXR_TYPE_SYSTEM_PASSTHROUGH_LAYER_PROPERTIES_ANDROID
にする必要がありますnext
はNULL
であるか、構造体チェーンの次の構造体への有効なポインタである必要があります。
パススルー レイヤの合成
XrCompositionLayerPassthroughANDROID には、xrEndFrame を呼び出すときにパススルー テクスチャを三角形メッシュにレンダリングするために必要な情報が含まれています。XrCompositionLayerPassthroughANDROID は、XrFrameEndInfo で使用されるベース ストラクチャ XrCompositionLayerBaseHeader のエイリアス型です。
typedef struct XrCompositionLayerPassthroughANDROID {
XrStructureType type;
const void* next;
XrCompositionLayerFlags layerFlags;
XrSpace space;
XrPosef pose;
XrVector3f scale;
float opacity;
XrPassthroughLayerANDROID layer;
} XrCompositionLayerPassthroughANDROID;
メンバーの説明
type
は、この構造の XrStructureType です。next
はNULL
または構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。layerFlags
は、レイヤに適用するフラグを記述する XrCompositionLayerFlags のビットマスクです。space
は、レイヤメッシュのpose
が時間の経過とともに評価される XrSpace です。pose
は、space
の参照フレーム内のレイヤメッシュの位置と向きを定義するXrPosef
です。scale
は、レイヤメッシュのスケールを定義するXrVector3f
です。opacity
は、パススルー テクスチャの不透明度を [0, 1] の範囲で定義するfloat
です。layer
は、xrCreatePassthroughLayerANDROID によって以前に作成された XrPassthroughLayerANDROID です。
アプリケーションは、作成された layer
と XrPassthroughLayerMeshANDROID が提供する対応するメッシュを使用して、XrCompositionLayerPassthroughANDROID 構造を作成できます。
XrCompositionLayerPassthroughANDROID へのポインタは、選択したレイヤ順でベース構造 XrCompositionLayerBaseHeader へのポインタとして xrEndFrame で送信され、パススルー レイヤを最終フレーム出力に合成するようランタイムにリクエストできます。
有効な使用方法(暗黙的)
- XrCompositionLayerPassthroughANDROID を使用する前に、
XR_ANDROID_composition_layer_passthrough_mesh
拡張機能を有効にする必要があります。 type
はXR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_ANDROID
にする必要がありますnext
はNULL
であるか、構造体チェーンの次の構造体への有効なポインタである必要があります。layerFlags
は0
または XrCompositionLayerFlagBits 値の有効な組み合わせである必要があります。space
は有効な XrSpace ハンドルである必要があります。layer
は有効な XrPassthroughLayerANDROID ハンドルである必要があります。layer
とspace
の両方が、同じ XrSession から作成、割り当て、または取得されている必要があります。
パススルー レイヤ ハンドルを作成する
XrPassthroughLayerANDROID ハンドルは、XrCompositionLayerPassthroughANDROID の動作を定義するパススルー レイヤを表します。
XR_DEFINE_HANDLE(XrPassthroughLayerANDROID)
アプリは、xrCreatePassthroughLayerANDROID を呼び出して XrPassthroughLayerANDROID ハンドルを作成できます。返された XrPassthroughLayerANDROID ハンドルは、後で API 呼び出しで使用できます。
XrResult xrCreatePassthroughLayerANDROID(
XrSession session,
const XrPassthroughLayerCreateInfoANDROID* createInfo,
XrPassthroughLayerANDROID* layer);
パラメータの説明
session
は、パススルー レイヤが作成される XrSession です。createInfo
は、初期パススルー レイヤ パラメータを指定する XrPassthroughLayerCreateInfoANDROID 構造体へのポインタです。このフィールドは、XrPassthroughLayerMeshANDROID 構造に連結して、メッシュを同時に設定することもできます。layer
は、作成された XrPassthroughLayerANDROID が返されるハンドルへのポインタです。
アプリケーションは、XrPassthroughLayerCreateInfoANDROID::vertexCapacity と XrPassthroughLayerCreateInfoANDROID::indexCapacity でパススルー メッシュ インデックスの数を指定し、xrGetSystemProperties の呼び出し時に XrSystemPassthroughLayerPropertiesANDROID::maxMeshIndexCount と XrSystemPassthroughLayerPropertiesANDROID::maxMeshVertexCount によって返される最大値以下にする必要があります。createInfo
で定義されたメッシュ インデックスの数が最大値を超えると、xrCreatePassthroughLayerANDROID は XR_ERROR_MESH_DATA_LIMIT_EXCEEDED_ANDROID
エラーを返します。
XrPassthroughLayerANDROID ハンドルは、最終的には xrDestroyPassthroughLayerANDROID 関数を使用して解放する必要があります。
有効な使用方法(暗黙的)
- xrCreatePassthroughLayerANDROID を呼び出す前に、
XR_ANDROID_composition_layer_passthrough_mesh
拡張機能を有効にする必要があります。 session
は有効な XrSession ハンドルである必要があります。createInfo
は、有効な XrPassthroughLayerCreateInfoANDROID 構造体へのポインタである必要があります。layer
は XrPassthroughLayerANDROID ハンドルへのポインタである必要があります
戻りコード
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
XrPassthroughLayerCreateInfoANDROID 構造体は次のように定義されます。
typedef struct XrPassthroughLayerCreateInfoANDROID {
XrStructureType type;
const void* next;
uint32_t vertexCapacity;
uint32_t indexCapacity;
} XrPassthroughLayerCreateInfoANDROID;
メンバーの説明
type
は、この構造の XrStructureType です。next
は NULL または構造体チェーンの次の構造体へのポインタです。XrPassthroughLayerMeshANDROID を次のチェーンで指定して、xrCreatePassthroughLayerANDROID を呼び出すときにパススルー レイヤの初期メッシュを指定できます。vertexCapacity
は、このレイヤのメッシュの頂点バッファの最大容量を表すuint32_t
です。指定されていない場合は0
です。指定する場合、このレイヤに設定されたメッシュの XrPassthroughLayerMeshANDROID::vertexCount はvertexCapacity
以下にする必要があります。indexCapacity
は、このレイヤのメッシュのインデックス バッファの最大容量を表すuint32_t
です。未指定の場合は0
です。指定する場合、このレイヤに設定されたメッシュの XrPassthroughLayerMeshANDROID::indexCount はindexCapacity
以下にする必要があります。
有効な使用方法(暗黙的)
- XrPassthroughLayerCreateInfoANDROID を使用する前に、
XR_ANDROID_composition_layer_passthrough_mesh
拡張機能を有効にする必要があります。 type
はXR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_ANDROID
にする必要がありますnext
はNULL
であるか、構造体チェーンの次の構造体を指す有効なポインタである必要があります。関連情報: XrPassthroughLayerMeshANDROID
アプリは xrDestroyPassthroughLayerANDROID 関数を使用して、パススルー レイヤと基盤となるリソースを解放できます。
XrResult xrDestroyPassthroughLayerANDROID(
XrPassthroughLayerANDROID layer);
パラメータの説明
layer
は、破棄される XrPassthroughLayerANDROID です。
有効な使用方法(暗黙的)
- xrDestroyPassthroughLayerANDROID を呼び出す前に、
XR_ANDROID_composition_layer_passthrough_mesh
拡張機能を有効にする必要があります。 layer
は有効な XrPassthroughLayerANDROID ハンドルである必要があります。
スレッドセーフ
layer
と子ハンドルへのアクセスは、外部で同期する必要がある
戻りコード
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_HANDLE_INVALID
パススルー レイヤのメッシュを設定する
アプリは xrSetPassthroughLayerMeshANDROID 関数を使用して、パススルー レイヤのメッシュを設定できます。
XrResult xrSetPassthroughLayerMeshANDROID(
XrPassthroughLayerANDROID layer,
const XrPassthroughLayerMeshANDROID* mesh);
パラメータの説明
layer
は、指定されたmesh
で更新する XrPassthroughLayerANDROID ハンドルです。mesh
は、メッシュの情報を指定する XrPassthroughLayerMeshANDROID 構造体へのポインタです。
アプリは、xrGetSystemProperties を呼び出すときに XrSystemPassthroughLayerPropertiesANDROID::maxMeshIndexCount と XrSystemPassthroughLayerPropertiesANDROID::maxMeshVertexCount によって返される最大値以下のパススルー メッシュ インデックス数を XrPassthroughLayerMeshANDROID::vertexCount と XrPassthroughLayerMeshANDROID::indexCount に指定する必要があります。xrSetPassthroughLayerMeshANDROID の mesh
で指定されたメッシュ インデックスの数が最大値を超える場合、XR_ERROR_MESH_DATA_LIMIT_EXCEEDED_ANDROID
が返されます。
xrCreatePassthroughLayerANDROID を使用して layer
を作成するときに、メッシュ バッファの容量が XrPassthroughLayerCreateInfoANDROID::vertexCapacity と XrPassthroughLayerCreateInfoANDROID::indexCapacity で指定されている場合、mesh
で定義されたメッシュ インデックスの数が容量を超えると、xrSetPassthroughLayerMeshANDROID で XR_ERROR_SIZE_INSUFFICIENT
エラーが返されます。
有効な使用方法(暗黙的)
- xrSetPassthroughLayerMeshANDROID を呼び出す前に、
XR_ANDROID_composition_layer_passthrough_mesh
拡張機能を有効にする必要があります。 layer
は有効な XrPassthroughLayerANDROID ハンドルである必要があります。mesh
は、有効な XrPassthroughLayerMeshANDROID 構造体へのポインタである必要があります。
戻りコード
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
XrPassthroughLayerMeshANDROID 構造体は次のように定義されます。
typedef struct XrPassthroughLayerMeshANDROID {
XrStructureType type;
const void* next;
XrWindingOrderANDROID windingOrder;
uint32_t vertexCount;
const XrVector3f* vertices;
uint32_t indexCount;
const uint16_t* indices;
} XrPassthroughLayerMeshANDROID;
メンバーの説明
type
は、この構造の XrStructureType です。next
はNULL
または構造体チェーンの次の構造体へのポインタです。windingOrder
はメッシュの三角形の XrWindingOrderANDROID です。これは、メッシュのレンダリング時にバックフェイス カリングに使用されます。vertexCount
は、メッシュ内の頂点の数を表すuint32_t
です。XrPassthroughLayerCreateInfoANDROID::vertexCapacity が指定されている場合、vertexCount
はvertexCapacity
以下にする必要があります。vertices
は、三角メッシュの頂点位置を含むXrVector3f
の配列へのポインタです。
indexCount
は、三角メッシュのインデックス数を表すuint32_t
です。最後のindexCount % 3
インデックス(存在する場合)は描画されません。XrPassthroughLayerCreateInfoANDROID::indexCapacity が指定されている場合、indexCount
はindexCapacity
以下にする必要があります。indices
は、三角メッシュのインデックスを含むuint16_t
の配列へのポインタです。
有効な使用方法(暗黙的)
- XrPassthroughLayerMeshANDROID を使用する前に、
XR_ANDROID_composition_layer_passthrough_mesh
拡張機能を有効にする必要があります。 type
はXR_TYPE_PASSTHROUGH_LAYER_MESH_ANDROID
にする必要がありますnext
はNULL
であるか、構造体チェーンの次の構造体への有効なポインタである必要があります。windingOrder
は有効な XrWindingOrderANDROID 値である必要があります。vertexCount
が0, vertices
でない場合、vertexCount
XrVector3f 構造の配列へのポインタである必要があります。indexCount
が0, indices
でない場合、indexCount uint16_t
値の配列へのポインタである必要があります。
XrWindingOrderANDROID 列挙型は、メッシュの三角形の巻き付け順序を識別します。これは、パススルー レイヤのメッシュをレンダリングする際のバックフェイス カリングにランタイムによって使用されます。
typedef enum XrWindingOrderANDROID {
XR_WINDING_ORDER_UNKNOWN_ANDROID = 0,
XR_WINDING_ORDER_CW_ANDROID = 1,
XR_WINDING_ORDER_CCW_ANDROID = 2
} XrWindingOrderANDROID;
列挙値の説明
XR_WINDING_ORDER_UNKNOWN_ANDROID
- メッシュの三角形の巻き付け順序が不明です。XR_WINDING_ORDER_CW_ANDROID
- メッシュの三角形の巻き順序は時計回りです。XR_WINDING_ORDER_CCW_ANDROID
— メッシュの三角形の巻き順は反時計回りです。
パススルー レイヤの合成のサンプルコード
次のサンプルコードは、パススルー レイヤを作成し、合成で使用する方法を示しています。
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));
新しいオブジェクト タイプ
新しい列挙型定数
XrObjectType 列挙型が拡張され、次のように変更されました。
XR_OBJECT_TYPE_PASSTHROUGH_LAYER_ANDROID
XrStructureType 列挙型が拡張され、次のように変更されました。
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
XrResult 列挙型が拡張され、次が追加されました。
XR_ERROR_MESH_DATA_LIMIT_EXCEEDED_ANDROID
新しい列挙型
新しい構造
- XrPassthroughLayerCreateInfoANDROID
- XrPassthroughLayerMeshANDROID
- XrCompositionLayerPassthroughANDROID
- XrSystemPassthroughLayerPropertiesANDROID
新機能
問題
変更履歴
- リビジョン 1、2024 年 9 月 11 日(Levana Chen)
- 最初の拡張機能の説明