スプラットデータフォーマット
GSplatFormatは、スプラットデータがGPUテクスチャにどのように格納されるかを記述し、そのデータを読み取るために必要なシェーダーコードを生成します。テクスチャストリーム(名前とピクセルフォーマット)とスプラット属性を抽出するためのシェーダーコードを定義します。
スプラットデータフォーマットは現在ベータ版です。問題が発生した場合は、PlayCanvas Engine GitHubリポジトリで報告してください。
この機能は統合レンダリングモードが必要です。
概要
GSplatデータはストリームと呼ばれるGPUテクスチャに格納されます。各ストリームには名前とピクセルフォーマット(例:PIXELFORMAT_RGBA32F)があります。GSplatFormatはこれらのストリームと、そこからスプラット属性を読み取るシェーダーコードを定義します。
シェーダーアクセス
フォーマットは、テクスチャストリームからスプラットデータを読み取るシェーダー関数を生成します。これらの関数は、どのスプラットを読み取るかを識別するグローバルなsplat構造体を使用します。
現在のスプラットインデックス
デフォルトでは、各スプラットは自身のデータを読み取ります。別のスプラットから読み取るには、setSplat(index)を使用します:
// GLSL
setSplat(otherIndex); // 後続の読み取りのためにスプラットインデックスを設定
vec3 pos = getCenter(); // otherIndexから読み取る
// WGSL
setSplat(otherIndex);
let pos = getCenter();
ロード関数
各ストリームに対して、2つのロード関数が生成されます:
| 関数 | 説明 |
|---|---|
load{StreamName}() | 現在のsplat.uv(setSplat()で設定)から読み取る |
load{StreamName}WithIndex(index) | 指定されたインデックスから直接読み取る |
例えば、dataCenterという名前のストリームは以下を生成します:
loadDataCenter()- 現在のスプラットインデックスを使用して読み取るloadDataCenterWithIndex(index)- 指定されたインデックスから読み取る
// GLSL - 現在のスプラットを変更せずに特定のインデックスから読み取る
vec4 otherCenter = loadDataCenterWithIndex(neighborIndex);
// WGSL
let otherCenter = loadDataCenterWithIndex(neighborIndex);
これは、隣接するスプラットにアクセスしたり、複数のスプラット間でデータを比較する必要がある場合に便利です。
ロードされたリソースのフォーマット
gsplatリソース(PLY、SOG、またはLODフォーマット)をロードすると、フォーマットはファイルのデータに基づいて自動的に作成されます。手動で作成または設定する必要はありません。
フォーマットへのアクセス
リソースを通じてフォーマットにアクセスできます:
const format = entity.gsplat.resource.format;
リソースへの追加ストリームの追加
カスタムのスプラットごとのデータを格納するために、リソースのフォーマットに追加ストリームを追加できます。各ストリームには、テクスチャがどのように割り当てられるかを決定するストレージタイプがあります:
追加ストリームはLODストリーミングリソースではサポートされていません。LODリソースは必要に応じてデータを動的にロードおよびアンロードするため、カスタム追加ストリームはこれらの操作間で保持できません。
| ストレージタイプ | 説明 |
|---|---|
GSPLAT_STREAM_RESOURCE | テクスチャはこのリソースを使用するすべてのコンポーネントインスタンス間で共有される(デフォルト) |
GSPLAT_STREAM_INSTANCE | テクスチャはgsplatコンポーネントインスタンスごとに作成される |
リソースレベルのストリーム
データがリソースのすべてのインスタンスで同じ場合は、GSPLAT_STREAM_RESOURCEを使用します(またはstorageを省略します):
// すべてのインスタンス間で共有されるストリームを追加
resource.format.addExtraStreams([
{ name: 'customData', format: pc.PIXELFORMAT_RGBA8 }
]);
// 共有テクスチャにアクセス
const texture = resource.streams.getTexture('customData');
インスタンスレベルのストリーム
各コンポーネントインスタンスが独自のテクスチャデータを必要とする場合は、GSPLAT_STREAM_INSTANCEを使用します:
// インスタンスごとのストリームを追加
resource.format.addExtraStreams([
{ name: 'instanceTint', format: pc.PIXELFORMAT_RGBA8, storage: pc.GSPLAT_STREAM_INSTANCE }
]);
// コンポーネント経由でインスタンステクスチャにアクセス
const texture = entity.gsplat.getInstanceTexture('instanceTint');
if (texture) {
const data = texture.lock();
// スプラットごとのテクスチャデータを埋める...
texture.unlock();
}
一般的なストリームフォーマット:
PIXELFORMAT_RGBA8- 4バイト(例:パックされたフラグやティントカラー)PIXELFORMAT_RGBA16F- 4つのhalf float(例:カスタム属性)PIXELFORMAT_RGBA32F- 4つのfloat(例:高精度データ)
ストリームは一度追加すると削除できません。
プロシージャルスプラットのフォーマット
GSplatContainerでプロシージャルスプラットを作成する場合、フォーマットを明示的に作成して設定する必要があります。PlayCanvasは一般的なケース用のビルトインフォーマットを提供しており、独自のストリームとシェーダーコードでカスタムフォーマットを作成することもできます。
詳細についてはプロシージャルスプラットを参照してください:
- ビルトインフォーマット(
createDefaultFormat、createSimpleFormat) - カスタムストリームを持つカスタムフォーマットの作成
- カスタムデータを読み取るシェーダーコードの作成
ワークバッファフォーマット
ワークバッファには、統合レンダリング中の中間スプラットデータを格納するための独自のフォーマットがあります。コピーおよびレンダリング操作中のカスタマイズのために追加ストリームを追加できます。
詳細についてはワークバッファフォーマットを参照してください:
- ワークバッファへの追加ストリームの追加
setWorkBufferModifier()によるコピー操作のカスタマイズ- カスタムデータの書き込みと読み取り
関連項目
- GSplatFormat API
- ワークバッファフォーマット - コピー操作のカスタマイズ
- ワークバッファレンダリング - レンダリング操作のカスタマイズ
- プロシージャルスプラット - プログラムによるスプラットの作成
- 統合スプラットレンダリング