Not signed in
Copyright © 2026 Unity Technologies
VRChat has encountered a case where ResolveUsePasses is discovering fallback subshader passes and adding them to the results list, and then later selecting those. Making an engine change to only select passes from the targetted shader's subshaders solves the issue, and highlights that the pass was perfectly usable.
For a currently unknown reason I can't reproduce this in a standalone case naturally. The same passes will be selected with both the expected and fallback-pass being added to the shader's pass list, but the standalone happily uses the correct pass. Something in the VRChat project or user-built content is causing the discovered fallback pass to be used instead however.
You can at least force a secondary issue however by forcing selection of the found UsePass result:
This appears to be a regression from [Internal link]
Prior to this change, fallback shader passes couldn't end up being selected.
Steps to reproduce:
No standalone repro for the full issue, although I've listed a method above to force what I've seen on VRChat, which results in "Incompatible keyword states" asserts firing.
Since I can't explain the difference in pass selection yet however, I don't want to upload a misleading repro project here.
Actual results:
A fallback shader's pass is selected for UsePass, despite the targetted one being supported and usable. 'Incompatible keyword states' are also logged if a fallback pass is selected.
Expected results:
I'd expect "Synergiance/AckToon/Light/SHADOWCASTER" to not resolve to "Some/Fallback/Shader/SHADOWCASTER" based of UsePass documentation, although it seems a supportable case. It at least shouldn't result in keyword state asserts triggering however.
Reproducible with versions:
Seen on 2022.3.22f1
Not reproducible with versions:
Can’t test with versions:
Sign in to see your voted issues