VRChat 非公式日本語ドキュメント

VRChat Shader Globals

VRChatでは、シェーダー制作者がVRChat特有の機能を実装するために利用できるグローバルシェーダーパラメーターが複数用意されています。

警告

このページで文書化されているもの以外で、カスタムシェーダー内のシェーダー変数に _VRChat プレフィックスを使用しないでください。そのプレフィックスは保護された名前空間とみなされており、文書化されていないものを含め、新しい変数がいつでも追加される可能性があります。

現在利用可能なシェーダーグローバルは以下の通りです:

変数内容
_VRChatCameraModefloat
  • 0 - 通常のレンダリング
  • 1 - VRハンドヘルドカメラでのレンダリング
  • 2 - デスクトップハンドヘルドカメラでのレンダリング
  • 3 - スクリーンショット撮影のためのレンダリング
_VRChatCameraMaskuintアクティブなカメラの cullingMask プロパティ。_VRChatCameraMode != 0 の場合に利用可能です
_VRChatMirrorModefloat
  • 0 - 通常レンダリング(鏡の中ではない)
  • 1 - VRで鏡を見ている時のレンダリング
  • 2 - デスクトップモードで鏡を見ている時のレンダリング
_VRChatFaceMirrorModefloatフェイシャルミラーレンダリング時は 1 (VRとデスクトップではカメラタイプが異なります!)、それ以外は 0
_VRChatMirrorCameraPosfloat3ミラーカメラのワールド空間位置(VRでは視点に依存しない「中央」位置)。鏡の中にレンダリングされていない場合は (0,0,0)
_VRChatScreenCameraPos/
_VRChatPhotoCameraPos
float3メインスクリーンカメラ/手持ちフォトカメラのワールド空間位置(カメラがアクティブでない場合は (0,0,0)
_VRChatScreenCameraRot/
_VRChatPhotoCameraRot
float4メインスクリーンカメラ/手持ちフォトカメラのワールド空間回転(クォータニオン)(カメラがアクティブでない場合は (0,0,0,0)

VRChat Time グローバル変数

_VRChatTime グローバル変数は、時間に関する様々な情報を提供します。時計やアニメーションの同期に使用できます。

以下に記載されているグローバル変数はすべて符号なし整数のビットパターンを含んでいるため、uintとして定義する必要があります。以下の表にそれぞれの内容を記載します。カッコ内の数字はビット範囲(0から始まるインデックス、両端を含む)です。

変数内容
_VRChatTimeUTCUnixSecondsUnixエポックからの経過時間を秒単位で表した現在のUTC時刻の下位32ビット。これは符号なし数値として扱う必要があるため、(現時点では)2038年問題は発生しません。システム時刻が1970年より前に設定されている場合、この値は未定義となります。
_VRChatTimeNetworkMsミリ秒単位の同期されたネットワーク時間です。これはUdonのNetworking.GetServerTimeInMillisecondsが返す値と同じです。技術的には符号付きの値ですが、符号なしとして扱うことも可能です。絶対値は意味のある量を表さないため、同期やオフセットの目的でのみ使用してください。この値はループします。
変数 (ビット)内容
_VRChatTimeEncoded1 (0-4)現在時刻(UTC)の「時」コンポーネント。
_VRChatTimeEncoded1 (5-10)現在の時刻(UTC)の分成分です。
_VRChatTimeEncoded1 (11-16)現在の時刻(UTCおよびローカル、共有)の秒成分です。
_VRChatTimeEncoded1 (17-21)現在の時刻(ローカル)の時成分です。
_VRChatTimeEncoded1 (22-27)現在の時刻(ローカル)の分成分です。
_VRChatTimeEncoded1 (28-31)予約済みです。
変数(ビット)内容
_VRChatTimeEncoded2 (0-9)現在の時刻(UTCおよびローカル、共有)のミリ秒成分です。
_VRChatTimeEncoded2 (10)タイムゾーンオフセットの符号ビットです。オフセットが負の場合は1になります。
_VRChatTimeEncoded2 (11-26)UTCからローカル時間までのタイムゾーンオフセット(秒単位)です。
_VRChatTimeEncoded2 (27-31)予約済みです。

UTCからのすべてのタイムゾーンオフセットおよびローカル時間の値は、VRChatメニューの「優先タイムゾーン(preferred timezone)」設定の影響を受けます。

「現在の時刻」は常にローカルユーザーの時刻を指します。つまり、アバター上のカスタムシェーダーがこれらの値を使用して時計などを表示する場合、それは常に着用者の時間ではなく、観察者のローカル時間が表示されます。

時刻の値は、プレイモード中であればVRChatクライアントおよびすべてのVRChat SDKで使用可能です。

VRChat SDKには、時間形式をデコードするためのヘルパー関数を含むヘッダーファイルが同梱されています。以下のHLSLコードスニペットは、インクルードパスと利用可能な関数の一覧です。

#include "Packages/com.vrchat.base/ShaderLibrary/VRCTime.cginc"

uint VRC_GetUTCUnixTimeInSeconds();
uint VRC_GetNetworkTimeInMilliseconds();
void VRC_GetUTCTime(out uint hours, out uint minutes, out uint seconds, out uint milliseconds);
void VRC_GetLocalTime(out uint hours, out uint minutes, out uint seconds, out uint milliseconds);
int VRC_GetTimezoneOffsetSeconds();

最終更新: