コンテンツにスキップ

SPS1 と SPS2

SPS には SPS1SPS2 という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 のバージョンからどちらの系統に対応すればよいかの目安になります。

新規に導入する場合は、より高機能な SPS2(0.2.x) を推奨します。SPS1(0.1.x) も引き続きリリースされており、SPS1 環境を前提とした既存のアバター・アセットとの互換性が必要な場合はそちらを利用できます。

SPS の前から使われている同種の仕組みである DPSTPS も含めて比較すると、次のようになります。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 の詳細 を参照してください。設定項目ごとの版差は PlugSocket の各ページにも記載しています。

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 経由でアプリが受け取ります)といった用途に限られ、この問題が起きにくくなっています。

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 の詳細 を参照してください。