メインコンテンツまでスキップ

スプラットデータフォーマット

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.uvsetSplat()で設定)から読み取る
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は一般的なケース用のビルトインフォーマットを提供しており、独自のストリームとシェーダーコードでカスタムフォーマットを作成することもできます。

詳細についてはプロシージャルスプラットを参照してください:

  • ビルトインフォーマット(createDefaultFormatcreateSimpleFormat
  • カスタムストリームを持つカスタムフォーマットの作成
  • カスタムデータを読み取るシェーダーコードの作成

ワークバッファフォーマット

ワークバッファには、統合レンダリング中の中間スプラットデータを格納するための独自のフォーマットがあります。コピーおよびレンダリング操作中のカスタマイズのために追加ストリームを追加できます。

詳細についてはワークバッファフォーマットを参照してください:

  • ワークバッファへの追加ストリームの追加
  • setWorkBufferModifier()によるコピー操作のカスタマイズ
  • カスタムデータの書き込みと読み取り

関連項目