Skip to main content

VRChat 着色器全局变量

VRChat 提供多个全局着色器参数,着色器创作者可以使用它们实现 VRChat 特定功能。

warning

不要在此页面记录的着色器变量之外的自定义着色器中使用 _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 时间全局变量​

_VRChatTime 全局变量提供关于时间的各种信息。你可以将它们用于时钟或动画同步。

下面列出的所有全局变量都包含无符号整数位模式,应定义为 uint。下表列出了每个变量的内容,方括号中的数字是位范围(包含,从零开始索引)。

变量内容
_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 菜单中"首选时区"设置的影响。

"当前时间"始终指本地用户的时间。也就是说,如果 Avatar 上的自定义着色器使用这些值来显示时钟,它将始终显示观察者(而非穿戴者)的本地时间。

时间值在 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();