There has been a long standing issue with Post Processing stack v2 where bloom, tonemapping, or color grading will randomly break due to the shader keywords that these use being taken. In the worst case post processing will leave you with a grey screen, unable to interact with anything. This usually happens when the BLOOM keyword has been used by something, but the COLOR_GRADING_HDR_3D has not been used by the time you run out of keywords. This has happened numerous times in the community meetup with mine and other people's worlds. This requires people to restart the game from outside the game because it's impossible to interact with the game menu when your screen is turned grey by post processing. During the community meetup this wastes precious time to show your world when 40% of the room gets blinded and needs to restart. The community meetup hub will be updated with the keywords it was missing that were allowing post processing to break in the blinding manner, but this is still an issue outside of the community meetup.
Poiyomi made a canny in feature requests asking to add keywords to the loading screen for post processing and Standard shader. https://vrchat.canny.io/feature-requests/p/add-basic-keywords-to-loading-screen-so-no-shaders-break-ever-again His canny is still valid and it would be good to have a list of keywords that act reliably, especially for shaders where there’s so many different features like his, but the list of post processing keywords in his canny is incomplete and will still break in many worlds so I am adding the more complete list here. Additionally this is a bug, so I am making a canny in the appropriate board.
Waiting until Unity 2019.4 for shader local keywords is not a solution. It will be a year or more until 2019.4 and since the post processing stack uses normal keywords, anyone who has old shaders that pollute the global shader keyword list will still break ppv2.
Removing the keywords from the post processing shaders is not a solution either since it's not easy for the user, and most importantly, post processing volumes in the world will toggle the keywords at runtime depending on which volume you are inside and what effects it needs.
Reserving keywords ourselves is not a solution because this is an issue for people who don't know to reserve keywords. I personally have my home world set to one with post processing that uses the major keywords so this is not an issue in my play sessions. But people go into my worlds without knowing to reserve keywords and unknowingly drop into a world without tonemapping that looks completely different and wrong, or they get blinded and don’t know why so they may report my world as malicious because VRChat has not fixed the issue with post processing.
If you happen to get Unity to give you a function to clear global keywords in the LTS or you get an enterprise license to fix dozens of other longstanding issues, then clearing the global keyword cache on world load would also be a solution in most cases since the world would presumably be able to set its keywords before avatars load in.
This is slightly a tangent, but I find it dumb that you remove things specifically because world owners can’t control them (self chair flying) where the player has agency in breaking the world and the world owner still has control if they care (VRC triggers to force dismount the player and respawn them), but refuse to fix long standing issues where worlds will randomly break without player agency where it’s not viable or possible for the world owner to do anything. It’s worse than hypocrisy since one is objectively worse to have, but it’s left broken.
Performance has been an argument against adding the keywords. I haven’t seen any performance regression by having all of my keywords saturated, this is while taking editor profiles of different worlds of mine before and after saturating the keywords. This is in worlds that have 1000’s of draw calls with 100’s of different materials that use different sets of keywords. The Unity developers have stated multiple times that the issue with increasing the global keyword limit is that there is a flat cost associated with increasing the keywords because they are represented by a bitfield internally. “If you mean just plainly increasing keyword count while local keywords are developed. Well the biggest reason is that by increasing keyword count will result in performance decrease (It is not much, but it is static increase that will never go away).” https://forum.unity.com/threads/shader-keyword-limit.545491/#post-4020418 If you are concerned about log performance because of getting a bunch of log errors spit out by unity when an avatar loads with keywords that are over the limit, then that’s a logger performance issue that’s separate from this.
I have also heard “stability” cited, at this point where we consistently run into people getting blinded until they restart their client, I’d argue it’s less stable not to fix it. And I’m not sure where the stability argument came from to begin with since keywords are a very isolated system that only touch the rendering in Unity. If there’s some stability issue with using keywords how they are meant to be used, then there’s a big issue there, and it’s on Unity’s end.
Myself and tens of thousands of other people have our home worlds set to ones with the post processing stack which effectively reserves the keywords, and don’t run into issues. This is a canny for the people who don’t happen to have their home worlds set to one that uses post processing.
Finally, even if there is some issue that I have not heard about in multiple discussions over the topic with the people who could fix this, in my opinion it is a moot point. Since most of the time, most of the post processing keywords will be used in the first few minutes of being online, and if they are not used, someone else’s shader keywords will take up their slots. This is not asking you to make something happen that is not happening, this is us asking you to make something that happens most of the time instead happen all of the time reliably so that our worlds don’t break randomly out of our control and ruin the intended experience of the world or blind people until they restart. Post processing is supported by VRChat and encouraged to be used in worlds so that their lighting does not saturate, so it should not be left in this broken state when the fix would take minutes due to what I’ve heard as unfounded speculation.
This is the list of keywords that PhaxeNor uses in the community meetup hub to reserve keywords, along with a few keywords that it was missing which I have amended that fix the grey screen issue. Some of these keywords are important for Standard shader or other builtin shading, but I’ve left them since it would still be good to have some reliability. See Poiyomi’s list for more of the Standard keywords. The ones specifically important for post processing are the tonemapping, bloom, color grading, and finalpass keywords.
Please add these to the loading screen in a material. Or if you are worried about maintaining a random material in the loading screen, then call Shader.EnableKeyword() and then Shader.DisableKeyword() on each of the keywords at startup since it will do the same thing to put the keywords in the global list.
STEREO_DOUBLEWIDE
TARGET STEREO_INSTANCING_ENABLED
FXAA FXAA_LOW
FXAA_KEEP_ALPHA
TONEMAPPING_NEUTRAL
TONEMAPPING_ACES
TONEMAPPING_CUSTOM
APPLY_FORWARD_FOG
FOG_LINEAR
FOG_EXP
FOG_EXP2
BLOOM
BLOOM_LOW
AUTO_EXPOSURE
COLOR_GRADING_HDR
_ALPHABLEND_ON
_ALPHAPREMULTIPLY_ON
_ALPHATEST_ON _DETAIL_MULX2
_EMISSION
_GLOSSYREFLECTIONS_OFF
_METALLICGLOSSMAP
_NORMALMAP
_PARALLAXMAP
_SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
_SPECULARHIGHLIGHTS_OFF
COLOR_GRADING_HDR_3D
COLOR_GRADING_HDR_2D
COLOR_GRADING_LDR_2D
FINALPASS
If you’re inclined to include all the keyworded functionality in ppv2 that is not used as commonly in worlds then also include the following as well:
VIGNETTE
GRAIN
CHROMATIC_ABERRATION
CHROMATIC_ABERRATION_LOW
DISTORT