被写体向けガイドライン

VRChat できれいに撮影されるためのガイドラインです。

注意事項

この記事はもともと昔のバージョンの VirtualLens 向けに書かれたもので現在の VirtualLens には影響しません。 しかし、現在の VRChat 標準カメラに似たような問題があるため参考資料として残しています。

はじめに

VRChat の標準カメラや古いバージョンの VirtualLens (v2.6.2 以前) で被写界深度シミュレーションを有効にしている場合に被写体によっては下図左のように期待と異なるボケ具合となることがあります。 多くの場合この現象は被写体のシェーダ・マテリアル設定に起因しており、場合によっては適切なマテリアル設定に修正することで問題を防いだり目立ちにくくしたりできます。 本項ではその原因と対処法について解説します。

失敗例と成功例

問題の原因

多くの場合、Fade, Transparent といった半透明シェーダを用いていることがこの問題の原因です。 利用しているシェーダが原因となるかどうかは Unity エディタ上でシェーダのプロパティを確認することで判別することができます。 シェーダのプロパティ中にある Cast shadowsyesRender queue が2500以下であればほとんどの場合問題なく動作します。 (動作を保証するものではありません。特殊なシェーダではこれらの条件を満たしていても意図しない挙動となる場合があります。)

シェーダプロパティの確認

もう少し詳しい解説

VirtualLensシリーズでは深度情報を取得するためにカメラが生成するデプステクスチャ (_CameraDepthTexture) を利用しています。 このテクスチャに深度情報が書き込まれるためには以下のような条件があります:

  • 利用するシェーダ (もしくはそのフォールバック先) がシャドウキャスティングをサポートしている
  • 描画するオブジェクトが不透明 (=レンダーキュー番号が2500以下) である

ほとんどの汎用シェーダでは前者はあまり問題にならないのですが、後者は半透明オブジェクト用のシェーダを利用する場合に問題となります。 一般に半透明オブジェクトの描画には3000番以降のレンダーキューが利用されるため、たいていの場合半透明シェーダで描画された画素の深度情報は期待されるものと異なってしまいます。

対処法

不透明シェーダに置き換える

半透明である必要がないオブジェクトの描画に半透明シェーダを用いている場合、それを不透明シェーダ (Opaque など) に置き換えることで改善されることがほとんどです。 また、メッシュを切り抜くためにアルファ値を利用している場合には TransparentCutout 系シェーダへの置き換えも検討してみてください。

以下に、いくつかの主要シェーダにおける不透明オブジェクト向けシェーダの例を示します。

半透明シェーダを用いる領域を最小限にする

表現上半透明マテリアルが避けられない部分がある場合、半透明が必要なポリゴンのみを別マテリアルとすることを検討してみてください。 例えばキャラクターの前髪を半透明にする場合、髪全体に半透明マテリアルを使用する代わりに前髪のみ別マテリアルを指定できるようにして、そこにのみ半透明マテリアルを使用することで問題を目立ちにくくすることができるようになります。