SPS1 と SPS2
SPS には SPS1 と SPS2 という2つの世代があります。本プロジェクトは 0.1.x 系(SPS1) と 0.2.x 系(SPS2) の2系統を並行してリリースしており、インストールしたバージョン系統によってどちらが動くかが決まります。
| 系統 | 本パッケージのバージョン | 相当する VRCFury のバージョン | 方式 |
|---|---|---|---|
| SPS1 | 0.1.x | 〜 1.1348.0 | Unity の点光源を使ってソケットの位置を伝える方式 |
| SPS2 | 0.2.x | 1.1349.0 以降 | 共有テクスチャを介してシェーダー間でソケットの位置を伝える方式 |
「相当する VRCFury のバージョン」は、本フォークがどの上流 VRCFury のバージョンから分岐したかを示す境界です。既存の VRCFury アバターを移行する場合、そのアバターが使っていた VRCFury のバージョンからどちらの系統に対応すればよいかの目安になります。
どちらを使うか
Section titled “どちらを使うか”新規に導入する場合は、より高機能な SPS2(0.2.x) を推奨します。SPS1(0.1.x) も引き続きリリースされており、SPS1 環境を前提とした既存のアバター・アセットとの互換性が必要な場合はそちらを利用できます。
SPS の前から使われている同種の仕組みである DPS・TPS も含めて比較すると、次のようになります。DPS と SPS1 はどちらも Unity の点光源で位置を伝える方式で、SPS2 だけが Unity のライトを使わず、Socket 側と Plug 側のシェーダーが共有テクスチャを介して位置を伝える新しい方式です。
| 観点 | DPS | SPS1(0.1.x) | SPS2(0.2.x) |
|---|---|---|---|
| Socket 位置の伝え方 | Unity の Point Light | Unity の Point Light | 共有テクスチャを介したシェーダー間の受け渡し(Unity のライトを使わない) |
| 同時に有効化できる Socket の数 | 実質1個(既定で自動排他。Dual Mode で2個まで、強い警告付き) | 実質1個(既定で自動排他。Dual Mode で2個まで、強い警告付き) | 実質無制限 |
| タグによる絞り込み | 無し | 無し | あり(Include / Exclude Tags) |
| 挿入経路 | 単純な変形 | Socket 1つへの直線的な変形のみ | Guided Path(中継地点)による複数段の経路指定に対応 |
| 挿入時のSocket側変形 | あるが設定が複雑 (Point Light 式) | ある (Contact 式・Depth Animations) | ある (Contact 式・Depth Animations。SPS1 と同じ) |
| Radius Offset | 無し | 無し | あり(Socket の太さ分だけ Plug の向かう先をオフセット) |
| 提供元 | Raliv | VRCFury(SPS) | VRCFury(SPS) |
それぞれの詳しい動作の仕組みは SPS1 の詳細・SPS2 の詳細 を参照してください。設定項目ごとの版差は Plug・Socket の各ページにも記載しています。
SPS1 / DPS 特有の制限: 同時に扱える Socket は実質1個まで
Section titled “SPS1 / DPS 特有の制限: 同時に扱える Socket は実質1個まで”上の表の「同時に有効化できる Socket の数」の背景には、DPS と SPS1 が使う Unity の点光源の仕様上の制約があります。1つのメッシュが同時に認識できる光源は最大4つまでで、Socket 1つがこのうち複数を使うため、近くに Socket が複数あったり現実の照明などの光源が多いと、Plug 側から認識できない Socket が出てきます。正しく動作させるには、VRChat 側のライト設定(Pixel Light Count を High にする等)も必要です。
SPS2 はこの点光源方式を使わないため、これらの制限はありません(同時数は実質無制限で、ライト設定にも依存しません)。
SPS1 特有の制限: Contacts の多さによる不具合
Section titled “SPS1 特有の制限: Contacts の多さによる不具合”SPS1 は、近くの Socket を探す検出処理などに VRChat の Contacts を多く使います。アバター上の Contacts が多くなると、VRChat 側の不具合により Contacts が正しく機能せず、近くに Socket があっても検出できず変形が発生しないなど、SPS がしばしば動作しないことがあります。
SPS2 では、この Socket の検出を Contacts ではなく共有テクスチャを介したシェーダー間のやり取りで行うようになったため、Contacts の使用数が大幅に減りました。SPS2 で残る Contacts は、Depth Animations(挿入の深さでアニメーションを駆動)・レガシー互換・触覚通知(OGB。触覚対応アプリ向けの接触通知で、OSC 経由でアプリが受け取ります)といった用途に限られ、この問題が起きにくくなっています。
レガシー互換
Section titled “レガシー互換”SPS2 には Legacy Compatibility(既定で ON)という位置づけの仕組みがあり、SPS1 が使うのと同じ点光源を追加で出力できます。これにより、SPS2 の Socket は SPS1 や DPS・TPS といった旧方式のプラグ側からも、ある程度互換的に認識されるようになっています。この Legacy Compatibility を OFF にすると、SPS2 が出力する点光源は 0 になります(次の「リソース消費とパフォーマンスランク」の表を参照)。
リソース消費とパフォーマンスランク
Section titled “リソース消費とパフォーマンスランク”Plug / Socket の数に応じて、次のようなリソースが生成されます(S = Socket の数、P = Plug の数。一般的な既定設定でのおおよその目安で、実際の数は設定により増減します)。以下ではまず、これらの生成される総数を見たあと、実行中に実際に有効になる数へと話を進めます(総数と有効数は、後述のとおり SPS2 では一致しません)。
| リソース | DPS | SPS1 | SPS2 |
|---|---|---|---|
| Unity のライト(Point Light) | 2S + P | 2S | 2S(レガシー互換を OFF にすると 0) |
| VRChat Contacts(Sender + Receiver) | 0(使わない) | 約 6〜13S + 18P | 約 6〜13S + 12P |
| Mesh Renderer | 0 | 0 | S + P |
| マテリアルスロット | 0 | 0 | 2S + 2P |
この表の数は生成される総数です。たとえば SPS2 の Plug 側 Contacts は 12 個生成されますが、そのうち触覚通知(OGB)用の 8 個は既定で無効なため、実際に稼働時に有効なのは 4 個だけです。SPS1 にはこのような無効化のしくみが無いため、生成数がそのまま有効数になります。実際に有効な数の詳しい内訳は、このあとの「実際の干渉は『同時に有効な Contacts の数』で決まる」を参照してください。
- ライト: DPS は Socket に加えて Plug にもライトを出すため、3方式の中で最も多くのライトを使います。SPS1 は Socket のみ、SPS2 は既定では SPS1 と同じですが、レガシー互換を切ればライトを 0 にできます。
- Contacts: DPS は Contacts を使いません(点光源ベース)。SPS1・SPS2 は触覚通知や検出のために Contacts を使います。Socket 側の幅(6〜13)は、ハンドタッチゾーンや触覚通知(OGB)の有無で変わります。Plug 側は SPS1 が 18、SPS2 が 12 で、SPS2 は検出用の Contacts を共有テクスチャ方式へ移したぶん減っています(触覚通知や検出 Sender は両世代で共通のため、Contacts が完全に無くなるわけではありません)。それぞれの内訳は SPS1 の詳細・SPS2 の詳細 を参照してください。Depth Animations を使うと、両世代とも Contacts はさらに増えます。
- Mesh Renderer / マテリアルスロット: SPS2 は Socket・Plug ごとに専用の Mesh Renderer(マテリアル2スロット)を1つ追加します。SPS1・DPS にはこれがありません(既存マテリアルのシェーダーを差し替えるだけでスロット数は変わりません)。
- VRAM: SPS2 が位置伝達に使う共有テクスチャは、実行時にシェーダー間でデータを受け渡すための一時的なもので、アバターに保存されるテクスチャ(画像アセット)ではありません。追加のマーカー/リゾルバのマテリアルもテクスチャを参照しません。そのため、パフォーマンスランクの Texture VRAM には計上されません。
パフォーマンスランクへの影響
Section titled “パフォーマンスランクへの影響”VRChat のアバターパフォーマンスランクは、これらのリソースの量で決まります(具体的な閾値は VRChat 側の仕様によります)。
- Contacts は Avatar Dynamics(コンタクト数)に数えられます。多いほどランクが下がりやすく、SPS1 は特に Plug 側の Contacts が多いため不利で、前述の不具合も起きやすくなります。SPS2 は Plug 側の Contacts を減らしています。
- ライト は描画(Lights)の統計に数えられます。DPS が最も多く使います。
- マテリアルスロット・Mesh Renderer はそれぞれの統計に数えられます。SPS2 はこれらが Socket・Plug ごとに増えます。
つまり SPS2 は「Contacts を減らす代わりに、Mesh Renderer とマテリアルスロットが増える」という置き換えの関係にあります。どのリソースがランクに効くかは、アバターの他の要素とあわせて決まります。
実際の干渉は「同時に有効な Contacts の数」で決まる
Section titled “実際の干渉は「同時に有効な Contacts の数」で決まる”他のアバターとの干渉のしやすさは、生成された Contacts の総数よりも、実行時に同時に有効になっている Contacts の数とその**大きさ(半径)**で決まります。この点では SPS2 が大きく有利です。
- Socket の Contacts は、メニューでその Socket を ON にしている間だけ有効になります(両世代共通)。使っていない Socket の Contacts は干渉しません。
- SPS2 は、触覚通知(OGB)の Receiver を「自分のクライアントで、かつ OSC 触覚アプリを起動している間」だけ有効にするゲートを持ちます(SPS1 には無い仕組み)。このため、通常のプレイ(OSC アプリ未起動)では OGB の Receiver が無効になり、SPS2 が同時に有効化する Contacts は SPS1 より大幅に少なくなります。Socket を1つ ON にした典型ケースでは、実際に同時有効な Contacts は SPS1 が約24〜31個、SPS2 が約6個です(内訳は各詳細ページ参照)。
- SPS2 で削除された「SPS Plus」の Receiver は半径3mと大きく、干渉しやすいものでした。その削除も干渉低減に効いています。
具体的な内訳(Sender / Receiver の別や、それぞれが有効になる条件)は SPS1 の詳細・SPS2 の詳細 を参照してください。