VRChat Shader Globals
VRChatでは、シェーダー制作者がVRChat特有の機能を実装するために利用できるグローバルシェーダーパラメーターが複数用意されています。
このページで文書化されているもの以外で、カスタムシェーダー内のシェーダー変数に _VRChat プレフィックスを使用しないでください。そのプレフィックスは保護された名前空間とみなされており、文書化されていないものを含め、新しい変数がいつでも追加される可能性があります。
現在利用可能なシェーダーグローバルは以下の通りです:
| 変数 | 型 | 内容 |
|---|---|---|
_VRChatCameraMode | float |
|
_VRChatCameraMask | uint | アクティブなカメラの cullingMask プロパティ。_VRChatCameraMode != 0 の場合に利用可能です |
_VRChatMirrorMode | float |
|
_VRChatFaceMirrorMode | float | フェイシャルミラーレンダリング時は 1 (VRとデスクトップではカメラタイプが異なります!)、それ以外は 0 |
_VRChatMirrorCameraPos | float3 | ミラーカメラのワールド空間位置(VRでは視点に依存しない「中央」位置)。鏡の中にレンダリングされていない場合は (0,0,0) |
_VRChatScreenCameraPos/_VRChatPhotoCameraPos | float3 | メインスクリーンカメラ/手持ちフォトカメラのワールド空間位置(カメラがアクティブでない場合は (0,0,0)) |
_VRChatScreenCameraRot/_VRChatPhotoCameraRot | float4 | メインスクリーンカメラ/手持ちフォトカメラのワールド空間回転(クォータニオン)(カメラがアクティブでない場合は (0,0,0,0)) |
VRChat Time グローバル変数
_VRChatTime グローバル変数は、時間に関する様々な情報を提供します。時計やアニメーションの同期に使用できます。
以下に記載されているグローバル変数はすべて符号なし整数のビットパターンを含んでいるため、uintとして定義する必要があります。以下の表にそれぞれの内容を記載します。カッコ内の数字はビット範囲(0から始まるインデックス、両端を含む)です。
| 変数 | 内容 |
|---|---|
_VRChatTimeUTCUnixSeconds | Unixエポックからの経過時間を秒単位で表した現在の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();
最終更新: