Skip to main content

Shader Blocking and Fallback System

本页描述了着色器阻止系统(Shader Blocking System)及其运作方式,以及着色器作者如何与之配合,以便当用户阻止了使用某着色器的虚拟形象上的着色器时,着色器能够优雅地回退。

VRChat 2021.4.2 回退系统升级​

着色器回退的改进通过使用着色器顶部的 "Tags" 字段来实现。

Tags{"Queue"="Geometry"}

默认情况下,标签字段可能看起来像这样。

你现在可以在 VRCFallback 名称下添加不同的标签,以指定尝试使用的回退着色器:

Tags{"Queue"="Geometry" "VRCFallback"="Toon"}

某些回退标签可以组合使用,例如你可以使用 ToonCutout:

Tags{"Queue"="Geometry" "VRCFallback"="ToonCutout"}

支持的标签如下:

Unlit
VertexLit
Toon
Transparent
Cutout
Fade
Particle
Sprite
Matcap
MobileToon
DoubleSided
Hidden //(如果着色器被阻止,这将隐藏网格视图,适用于 raymarching 效果等情况)
toonstandard
toonstandardoutline

Toon 和 Unlit 还可以与 Transparent、Cutout 和 Fade 标签组合使用,以实现更精细的控制。Toon 还额外支持 "DoubleSided" 以及 "DoubleSidedCutout" 等变体。

caution

请注意,将 Transparent 或 Fade 标签与 Toon 一起使用将导致回退到 Transparent Unlit。在选择回退标签时,你可能需要考虑到这一点。

指定任何其他标签将导致回退到 Standard 着色器。

toonstandard 和 toonstandardoutline 标签是特殊的,它们不能组合使用。它们分别保证回退到 VRChat/Mobile/Toon Standard 和 VRChat/Mobile/Toon Standard (Outline) 着色器。所有同名的关键字和属性都将被复制过来。

如果未提供标签,将使用旧的回退系统,遵循着色器名称、关键字等模式。

我们现在还将所有标准着色器参数复制到回退材质中,包括以下内容:

_MainTex
_MetallicGlossMap
_SpecGlossMap
_BumpMap
_ParallaxMap
_OcclusionMap
_EmissionMap
_DetailMask
_DetailAlbedoMap
_DetailNormalMap
_Color
_EmissionColor
_SpecColor
_Cutoff
_Glossiness
_GlossMapScale
_SpecularHighlights
_GlossyReflections
_SmoothnessTextureChannel
_Metallic
_SpecularHighlights
_GlossyReflections
_BumpScale
_Parallax
_OcclusionStrength
_DetailNormalMapScale
_UVSec
_Mode
_SrcBlend
_DstBlend
_ZWrite

旧版回退系统​

当着色器被安全系统阻止时,首先会检查此列表中的内部预编译着色器之一:

预编译内部着色器
"Standard",
"Standard (Specular setup)",
"Effects/Rim",
"Effects/GlowAdditiveSimple",
"Legacy Shaders/Bumped Diffuse",
"Legacy Shaders/Bumped Specular",
"Legacy Shaders/Decal",
"Legacy Shaders/Diffuse",
"Legacy Shaders/Diffuse Detail",
"Legacy Shaders/Diffuse Fast",
"Legacy Shaders/Lightmapped/Diffuse",
"Legacy Shaders/Lightmapped/Specular",
"Legacy Shaders/Lightmapped/VertexLit",
"Legacy Shaders/Parallax Diffuse",
"Legacy Shaders/Parallax Specular",
"Legacy Shaders/Reflective/Bumped Diffuse",
"Legacy Shaders/Reflective/Bumped Specular",
"Legacy Shaders/Reflective/Bumped Unlit",
"Legacy Shaders/Reflective/Bumped VertexLit",
"Legacy Shaders/Reflective/Diffuse",
"Legacy Shaders/Reflective/Parallax Diffuse",
"Legacy Shaders/Reflective/Parallax Specular",
"Legacy Shaders/Reflective/Specular",
"Legacy Shaders/Reflective/VertexLit",
"Legacy Shaders/Self-Illum/Bumped Diffuse",
"Legacy Shaders/Self-Illum/Bumped Specular",
"Legacy Shaders/Self-Illum/Diffuse",
"Legacy Shaders/Self-Illum/Parallax Diffuse",
"Legacy Shaders/Self-Illum/Parallax Specular",
"Legacy Shaders/Self-Illum/Specular",
"Legacy Shaders/Self-Illum/VertexLit",
"Legacy Shaders/Specular",
"Legacy Shaders/Transparent/Bumped Diffuse",
"Legacy Shaders/Transparent/Bumped Specular",
"Legacy Shaders/Transparent/Cutout/Bumped Diffuse",
"Legacy Shaders/Transparent/Cutout/Bumped Specular",
"Legacy Shaders/Transparent/Cutout/Diffuse",
"Legacy Shaders/Transparent/Cutout/Soft Edge Unlit",
"Legacy Shaders/Transparent/Cutout/Specular",
"Legacy Shaders/Transparent/Cutout/VertexLit",
"Legacy Shaders/Transparent/Diffuse",
"Legacy Shaders/Transparent/Parallax Diffuse",
"Legacy Shaders/Transparent/Parallax Specular",
"Legacy Shaders/Transparent/Specular",
"Legacy Shaders/Transparent/VertexLit",
"Legacy Shaders/VertexLit",
"MatCap/Vertex/Textured Lit",
"Mobile/Bumped Diffuse",
"Mobile/Bumped Specular",
"Mobile/Bumped Specular (1 Directional Light)",
"Mobile/Diffuse",
"Mobile/Unlit (Supports Lightmap)",
"Mobile/Particles/Additive",
"Mobile/Particles/Alpha Blended",
"Mobile/Particles/Multiply",
"Mobile/Particles/VertexLit Blended",
"Particles/~Additive-Multiply",
"Particles/Additive",
"Particles/Additive (Soft)",
"Particles/Alpha Blended",
"Particles/Alpha Blended Premultiply",
"Particles/Anim Alpha Blended",
"Particles/Multiply",
"Particles/Multiply (Double)",
"Particles/VertexLit Blended",
"Sprites/Default",
"Sprites/Diffuse",
"Toon/Lit",
"Toon/Lit (Double)",
"Toon/Lit Cutout",
"Toon/Lit Cutout (Double)",
"Toon/Lit Outline",
"UI/Default",
"Unlit/FailShader",
"VRChat/UI/Default"

如果匹配到内部着色器,回退将是相同类型的新着色器,但使用内部编译的着色器。所有参数都将被复制。未包含的新版本或变体将无法工作,因为它们会被替换。

如果着色器未在内部匹配,将使用着色器的名称(不是文件名,而是着色器源代码顶部行提供的名称)来匹配某些识别特征,并替换为类似类型的回退着色器:

回退着色器名称搜索
"Unlit",
"VertexLit",
"Toon",
"Outline",
"Transparent",
"Fade",
"Cutout",
"Particle",
"Sprite",
"MatCap"

这些名称可以出现在着色器名称完整字符串中的任何位置。

此外,还会搜索一些着色器属性:

着色器属性
"_Ramp" == "Toon"
"_ALPHABLEND_ON" == "Transparent"
"_ALPHATEST_ON" == "Cutout"

所有匹配都区分大小写。

系统会尝试创建近似匹配名称的回退材质。例如,包含"Sprite"的名称会回退到 Unity 内置的"Sprites/Default"着色器。

你可以组合"Toon"和"Cutout",或"Toon"和"Outline"来制作组合着色器,但是"Transparent"和"Fade"目前没有对应的 Toon Lit 着色器,而是回退到"Unlit/Transparent"。

对"Outline"的支持是高度实验性的,如果性能受到影响,可能会被移除。 对于"Toon"着色器,会复制"_Ramp"参数(Texture2D)。 对于"MatCap"着色器,会复制"_MatCap"参数(Texture2D)。

如果着色器名称中未找到匹配项,则使用 Standard 材质。

会尝试将名为"_MainTex"和"_Color"的参数转移到后备着色器。如果两个参数都不匹配,则提供 Matcap 着色器,颜色设置为用户的等级颜色。

所有这些都可能会随着我们调整着色器后备系统而发生变化。

预览化身后备着色器​

可以通过操作菜单中的切换开关,在本地强制自己的化身使用后备着色器。要激活此选项,打开操作菜单并选择"Options" -> "Avatar" -> "Fallback Shaders"。开启后,你使用的任何化身都将在本地显示后备着色器。切换化身时该选项保持激活状态,但更换世界时会重置。此选项不影响他人查看你的化身的方式。