私は前回、VRChat関連でこんな記事を書きました:
しかし上記の記事はVRChatを始めたばかりの時に書いたものであり、今読み返すと微妙な間違い・トラブルの元も含まれていたため、今回はそこへの修正を含みつつ、今現在どのようにVRChatのアバターを改変しているかを書きたいと思います。
前提となる環境
前提となるOS環境、ソフトウェアやハードウェアは以下の通りです:
- NixOS - 60df26f
- ALCOM - v1.1.4
- Unity - 2022.3.22f1
- Sparkle eco Intel Arc 310
- 玄人志向のAMD RX 9070
また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.
実際の作業
今回の環境構築では下記のような作業を行なっています:
- ALCOM経由でUnityを起動しアバター改変を行えるようにする
- UnityでGPU Offloadingを行ない、Unityで使うGPUをRX9070にする
- 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 という形で露出させた fhsEnv を unity-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の、
を参考に出来るかと思います。
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 パネルから行ないます。
具体的には、
Proton→Installed Proton Pathへproton実行ファイルへのパスVRChat Client→Install 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 Base と Linux 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でアバター改変をしており、これも色々と面倒だったりしたのですが、今回のこれでその辺りが解消した感じです。
ただとは言え今のところアバターが左右分裂しているか否かの確証は取れてない感じなので、たぶん今回の作業が上手く行なえていればアバタープラナリアは回避できているのかなぁ……と思ってます。