VRChat 着色器 全局变量
VRChat 提供多个全局着色器参数,着色器创作者可以使用它们实现 VRChat 特定功能。
warning
不要在此页面记录的着色器变量之外的自定义着色器中使用 _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 时间全局变量
_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();