CCK3.6とVRCSDKを共存させる

2023/9/24に、CCK3.6がリリースされました。
しかし、CCK3.6とVRCSDKが同じプロジェクトにある状態でアップロードすると、そのコンテンツが片目しか描画されない状態になるようです。
これは、VRCのコンテンツを使用する場合や、PhysBoneをDynamicBoneに変換する場合には不便です。

なので、それを回避する(CCK3.6とVRCSDKが同じプロジェクトにある状態でアップロードしても両目で描画されるようになる)ツールを作成しました。

正確には、前回の記事で紹介したErrorFixerを更新した形になります。

こちらでも配布しています。

見た目や操作はそのままですが、レンダリング関連のコードを変更する処理が追加で実行されます。

今回の変更内容によって新たに不具合が発生する場合があるため、以前の挙動に戻せるようにもしてあります。
設定ボタンから挙動が変更できます。

「エラーを修復する」のみにチェックを入れると、以前のバージョンと同じ挙動になります。
このウィンドウを閉じると設定が保存されます。


以下、技術的な話

今回書き換えたコードは以下になります。

Packages\com.vrchat.base\Editor\VRCSDK\Dependencies\VRChat\ShaderStripping\InjectStereoVariants.cs

if(shaderKeywordSet.IsEnabled(_unitySinglePassStereoKeyword))
{
    //shaderKeywordSet.Disable(_unitySinglePassStereoKeyword); // <-- コメントアウト
    //shaderKeywordSet.Enable(_stereoInstancingKeyword); // <-- コメントアウト
    newVariant.shaderKeywordSet = shaderKeywordSet;
    newVariants.Add(newVariant);
    continue;
}

// ReSharper disable once InvertIf
if(shaderKeywordSet.IsEnabled(_stereoInstancingKeyword))
{
    //shaderKeywordSet.Enable(_unitySinglePassStereoKeyword); // <-- コメントアウト
    //shaderKeywordSet.Disable(_stereoInstancingKeyword); // <-- コメントアウト
    newVariant.shaderKeywordSet = shaderKeywordSet;
    newVariants.Add(newVariant);
    // ReSharper disable once RedundantJumpStatement
    continue;
}

ShaderStrippingによって、シングルパスインスタンシングレンダリングに関するコードが削除されていたものと思われます。
Shader variant stripping - Unity マニュアル

UNITY_SINGLE_PASS_STEREOおよびSTEREO_INSTANCING_ONに関する記事
シングルパスステレオレンダリング (2 倍幅のレンダリング) - Unity マニュアル
シェーダーのVR対応 - 黒鳥のメモ
Unity の XR 向けシングルパスステレオレンダリングについて調べてみた - 凹みTips

今回の件で、ShaderVariantStrippingについて初めて知りました。
OnProcessShaderを定義することで、シェーダーに手を加えることができるんですね。
もしかしたらシングルパスインスタンシングレンダリング未対応のシェーダーでもここで対応させることができるのかもしれません。

この症状について、公式Discordで相談してみましたが、解決には至りませんでした。
CCK3.6のみでは症状は起きず、VRCSDKと共存している場合のみ発生するようで、海外の方はそのような使い方は一般的ではないため遭遇していないようでした。

しかし、CCK3.5では特に問題は起きていなかったため、謎は残ったままです。

CCK3.5とCCK3.6の差分を確認しながら検証を進めると、

Assets\ABI.CCK\Scripts\Editor\CCK_BuildUtility.csの393行、

PlayerSettings.stereoRenderingPath = StereoRenderingPath.Instancing;

この行をコメントアウトすることでも症状が改善しました。
しかし、CCK側のコードを変更したくないため、今回はVRCSDK側のコードをコメントアウトしました。

見たところ、リファクタリングの一環で、PlayerSettings周りの設定がCCK_Init.csからCCK_BuildUtility.csに移動しているようで、そのあたりが影響しているのかもしれません。

また、これは私の予想ですが、VRChat側はまだStereoRenderingPath.Instancingに対応しておらず(おそらく)、その差が関係しているのかなと思っています。

The previous version of the VRCSDK compiled shader variants for Mono and Single-Pass Stereo. Further upgrades to Unity require variants for Single-Pass Stereo Instanced, which aren't currently compiled and don't exist for uploaded content. From now on, the SDK will also compile variants for SPS-I to make future upgrades easier/possible. This is not the only measure being taken to help with future upgrades, but is still an important step.

VRChat 2022.1.2

なので、今後VRChatがStereoRenderingPath.Instancingに対応すると、解消されるかもしれません。

今回のツールを使用して不具合が発生する可能性は否めないため、発生した場合は連絡いただければと思います。

この記事が気に入ったらサポートをしてみませんか?