カラクリスタ

「人並みの人生」なんて失かった人の個人ブログ

【改訂版】NixOSでVRChatのアバターをアップロードする方法(GPU Offloading付き)

私は前回、VRChat関連でこんな記事を書きました:

しかし上記の記事はVRChatを始めたばかりの時に書いたものであり、今読み返すと微妙な間違い・トラブルの元も含まれていたため、今回はそこへの修正を含みつつ、今現在どのようにVRChatのアバターを改変しているかを書きたいと思います。

前提となる環境

前提となるOS環境、ソフトウェアやハードウェアは以下の通りです:

またVRChatのアバターやワールドをLinuxで取り扱うために、ALCOMでアバターやワールドのプロジェクトへ下記のLinux向けパッチを導入しています:

Linux VRChat SDK Patch Listing

ただしこのパッチについてはVRChatの利用規約に違反するため、導入などの利用は自己責任で行ってください。

GitHub - BefuddledLabs/LinuxVRChatSDKPatch

This modifies the VRChat SDK using Harmony to properly work on Linux. This is directly against the VRChat Terms of Service.

実際の作業

今回の環境構築では下記のような作業を行なっています:

  1. ALCOM経由でUnityを起動しアバター改変を行えるようにする
  2. UnityでGPU Offloadingを行ない、Unityで使うGPUをRX9070にする
  3. VRChat SDKでLinuxからアバターをアップロードできるようにする

0. 下準備

まず本作業へ入るまえに下記のようなパッケージ定義を作り、それらをシステムへインストールしておきます:

{ writeShellScriptBin, gpuId }:
writeShellScriptBin "amd-run" ''
  env \
    DRI_PRIME=${gpuId}! \
    MESA_VK_DEVICE_SELECT=${gpuId} \
    AMD_VULKAN_ICD=RADV \
    VK_ICD_FILENAMES=/run/opengl-driver/share/vulkan/icd.d/radeon_icd.x86_64.json \
    "''${@:-}"
''
{
  unityhub,
  buildFHSEnv,
  amd-run,
}:
unityhub.overrideAttrs (old: rec {
  fhsEnv = buildFHSEnv {
    pname = "${old.pname}-fhs-env";
    inherit (old) version;
    runScript = "";

    targetPkgs =
      p: with p; [
        # Unity Hub binary dependencies
        xorg.libXrandr
        xdg-utils

        # GTK filepicker
        gsettings-desktop-schemas
        hicolor-icon-theme

        # Bug Reporter dependencies
        fontconfig
        freetype
        lsb-release
      ];

    multiPkgs =
      p: with p; [
        # Unity Hub ldd dependencies
        cups
        gtk3
        expat
        libxkbcommon
        lttng-ust_2_12
        krb5
        alsa-lib
        nss
        libdrm
        libgbm
        nspr
        atk
        dbus
        at-spi2-core
        pango
        xorg.libXcomposite
        xorg.libXext
        xorg.libXdamage
        xorg.libXfixes
        xorg.libxcb
        xorg.libxshmfence
        xorg.libXScrnSaver
        xorg.libXtst

        # Unity Hub additional dependencies
        libva
        openssl
        cairo
        libnotify
        libuuid
        libsecret
        udev
        libappindicator
        wayland
        cpio
        icu
        libpulseaudio

        # Unity Editor dependencies
        libglvnd # provides ligbl
        xorg.libX11
        xorg.libXcursor
        glib
        gdk-pixbuf
        libxml2_13
        zlib
        clang
        git # for git-based packages in unity package manager

        # Unity Editor 6000 specific dependencies
        harfbuzz
        vulkan-loader

        # Unity Bug Reporter specific dependencies
        xorg.libICE
        xorg.libSM
      ];
  };

  installPhase =
    builtins.replaceStrings
      [ (toString old.fhsEnv) "--add-flags" ]
      [
        (toString fhsEnv)
        "--add-flag ${amd-run}/bin/amd-run --add-flags"
      ]
      old.installPhase;

  passthru.unity-run = fhsEnv;
})
# 以下抜粋
{ pkgs, ... }: {
  hardware.graphics = {
    enable = true;
    enable32Bit = true;
  };

  hardware.amdgpu.amdvlk = {
    enable = true;
    support32Bit.enable = true;
  };

  services.xserver.videoDrivers = [
    "i915"
    "amdgpu"
  ];

  environment.systemPackages = with pkgs; let
    amd-run = pkgs.amd-run.override { gpuId = "1002:7550"; };
    unityhub-amd = pkgs.unityhub-amd.override { inherit amd-run; };
  in [
    amd-run
    unityhub-amd
    unityhub-amd.unity-run
  ];
}

これらの定義のうち、amd-run 関連についてはGPU Offloadingのためのものですが、 passthru.unity-run = fhsEnvについてはALCOM経由でUnityを起動する際に必要なため、この追加を忘れないようにしてください。

1. ALCOMでUnityを起動できるようにする

まずUnity 2022.3.22f1をUnity hub経由でインストールします。この際にLinuxサポートはもちろんのこと、 Windowsサポートの追加やAndroidサポートの追加も忘れないようにしてください(ただしAndroidサポートについては任意です)。

次いでALCOM経由でUnityを起動するために、ALCOMを下記のように起動します:

# ALCOMをunity-fhs-env経由で起動する
$ unity-fhs-env ALCOM

# GPU Offloadingを行う際には下記のようにする
$ unity-fhs-env amd-run ALCOM

上記では unity-amd.uniry-run という形で露出させた fhsEnvunity-fhs-env というコマンド経由で利用していますが、このコマンド経由でALCOMを起動することにより、ALCOMから直接Unity Editorを起動できるようになります。

またALCOM経由でUnityを起動する場合ALCOMの方へ事前にUnity Editorを登録する必要がありますが、Unity Editorは unity-fhs-env の環境内でしか起動しないため、ALCOMへ登録する際も必ず unity-fhs-env を経由して起動させます。

2. Unity EditorでGPU Offloadingをさせる

次にUnityでのGPU Offloadingについてですが、ここまで記載した内容のうち、amd-run に関連する内容を飛ばしてなければGPU Offloadingの準備は整っています。

まずUnity Editor単体でGPU Offloadingを行なう場合には、次のように起動します:

$ unity-fhs-env amd-run ~/Applications/Programs/Unity/2022.3.22f1/Editor/Unity

上記の例のうち ~/Applications から始まるパスは私が使っているUnityへのパスで、これについては各位読み替えてください。

次いでALCOMを経由して起動するUnityをGPU Offloadingさせる場合、ALCOMを次のように起動し、その後ALCOMの Unityで開く をクリックします:

$ unity-fhs-env amd-run ALCOM

なおここで出てくる amd-run は単なるシェルスクリプトで、このスクリプトはGPU Offloadingを行なうための環境変数を設定しています:

#!/usr/bin/env bash
env \
  DRI_PRIME=1002:7550! \
  MESA_VK_DEVICE_SELECT=1002:7550 \
  AMD_VULKAN_ICD=RADV \
  VK_ICD_FILENAMES=/run/opengl-driver/share/vulkan/icd.d/radeon_icd.x86_64.json \
  "${@:-}"

私の環境ではGPU OffloadingをdGPU同士の環境で行なっていますが、これはiGPUとdGPUの組み合わせでも出来るはずなので、そこは各自応用してください。

なおGPU Offloadingについての情報は、ArchWikiの、

PRIME - ArchWiki

を参考に出来るかと思います。

3. Unityを使ってVRChatのアバターをアップロードできるようにする

とここまでの内容でVRChatへアバターをアップロードできる環境が整う……と思いきやそうでもなく、最期のステップとしてVRChat SDKのLinuxパッチを取り扱うために、Proton一式へアクセスできるパスを用意します。

なお私の場合、下記のような設定を導入することでProtonへアクセスするパスを用意しました:

# 以下抜粋
{ pkgs, ... }: {
  environment.etc."compatibilitytools.d/Proton-GE".source = pkgs.proton-ge-bin.steamcompattool;
}

この設定はLinux VRChat SDK PatchでVRChat SDKへ追加されたProton周りのための設定で、これらの設定はControl PanelのSettings パネルから行ないます。

具体的には、

  • ProtonInstalled Proton Pathproton 実行ファイルへのパス
  • VRChat ClientInstall Client Path へVRChatのゲームへのパス

を指定します。

なおこの設定の詳細についてはLinux VRChat SDK Patchのリポジトリにある How to use セクションを参照してください:

BefuddledLabs/LinuxVRChatSDKPatch・How to use

またVRChatのアバタープロジェクトでLinux VRChat SDK Patchを利用するためには、

  • https://befuddledlabs.github.io/LinuxVRChatSDKPatch/index.json

をALCOMに追加した後、Linux VRChat SDK Patch BaseLinux VRChat SDK Patch Avatarをアバターのプロジェクトに追加し、Settingsパネルでの設定を忘れないようにしてください。

その他の注意点

と、ここまで来たのならあとはWindowsでVRChatのアバターをアップロードするのと同じ要領でアバターをアップロード可能です。

ただし一点注意点として、VRChatのアバターのプロジェクトが存在するディレクトリは noexec を設定していないファイルシステム上に作る必要があり、これを怠るとVRモードでアバターの立体視が壊れます。

この辺りはどうもUnityがプロジェクトディレクトリ以下に共有ライブラリ(.soファイル)が生成されることと関連するようで、noexec が設定されたファイルシステムではこの辺りの上手く動かなくなってシェーダーのコンパイルに失敗し、結果として立体視が壊れるようです。

この辺り笑い話ですが、私は自身のアバターが左右分裂した状態で他のプレイヤーの集まるワールドへ参加していたところ、改変失敗珍百景として記念撮影されました。南無三。

なおこの注意点については、

Unity | Linux VR Adventures Wiki・Built avatar appears non-stereoscopic to me and everyone else

に書かれているので、詳細はこれを読んでください。

なおこのアバター左右分裂については、自身のホームワールドで何かしらのオブジェクトを持ち、片目ずつオブジェクトを持った手を見た時にオブジェクトを持っている位置がずれているか否かで確認できます。

以上

と言うことで今回の内容は以上です。

まぁ面倒くさいと言えば面倒くさいのですが、一応こういった手順でNixOSでもVRChatのアバター改変を行えるようになりました。

ちなみにこの環境が用意できる前はWindows VMでアバター改変をしており、これも色々と面倒だったりしたのですが、今回のこれでその辺りが解消した感じです。

ただとは言え今のところアバターが左右分裂しているか否かの確証は取れてない感じなので、たぶん今回の作業が上手く行なえていればアバタープラナリアは回避できているのかなぁ……と思ってます。