Developer Update - 29 June 2023

We always get cool stuff out of this. The big glut of features after we launched EAC was, in fact, almost entirely jam projects that had just gotten finished getting polished up and ready for release :sweat_smile:

I’m not ENTIRELY sure on the technical bits but I believe GPU instancing only really matters if you have two materials that are very similar or even identical in a scene. That makes it much less useful for an instance full of different avatars.

As the post points out, DLSS is impossible due to the lack of motion vectors in basically all shaders in VRChat.

I’d hardly call a developer post in our forums “silent”, nor would I call an investigation into a tech finding out that it isn’t viable “discontinued”, but sure!

Transparency is really expensive on mobile SOCs with tile-based GPUs, which is what the XR2 and many mobile SOCs use.

For context, the vast majority of crash reports, analytics, and user feedback for the Quest 2 version of VRChat point to severe performance issues. These are sometimes (but not always) related to poorly optimized avatars and worlds.

As such we’re not keen on lifting or raising any of the current Quest limits until we solve our current performance issues.

It is not planned, no, but it may be worth looking into again. Last time we checked it was essentially snake oil and offered very little visual improvement over just dropping your render resolution.

Newer versions of FSR might be better, especially since it got some serious attention with its native implementation in Steam Deck’s OS.

I imagine we’ll look into it, but it isn’t a priority.

You’re right about it feeling dismissive, even VRChat on the steam deck can use a Frankenstein of FSR
Steam-Deck-Scaling-Filter
FSR is mostly if you want performance or stretching out battery life, you don’t really care about visual quality or effects as long as results are good enough

It’s super situational, and very rarely any good for Avatars - it’s not compatible with Skinned Mesh renderers. The best use case for it is worlds where there’s a large number of meshes using the same mesh and only a couple of different shader properties different, like color or smoothness.

It’s on the long list of things I’d like the SDK to advise you about, but it’s super situational. In the worst case it’s only a little slower though, so it makes sense to advise turning it on for static meshes.

1 Like

Ctrl+B Ctrl+D

I’ve been eyeing those tickets, but it’s a separate issue and I’m trying to narrow the scope to be able to get this out the door. Still, needs fixing!

Dynamic Resolution

Needs Vulkan :confused:

But on the plus side, as mentioned in a previous Dev update, working on some big performance gains that should net more of a boost (since we tend to be CPU constrained)

2 Likes

As you are working on standard lite, it would be nice someday to be able to put alpha map(PNG images) or force double side in Mobile/Quest. :purple_heart:

1 Like

These, unfortunately, are both a potentially significant performance hit :confused: The changes we’re making right now were specifically tested to make sure they don’t cause performance regressions.

1 Like

It was a odd decision now (Considering how prevalent the API is, but this is without minding many compatibility issues to take into account ofc) but I recognize Unity 2019 isn’t super great with Vulkan to begin with, but I hope VRC intends to move over towards it during the Unity upgrade. Especially for the Quest, considering the considerable amount of broad optimizations Meta has for the API if taken advantage of. (But PC would benefit quite heavily)

Unity only support FSR 1.0 in the newer URP and HDRP Scriptable Render Pipelines. VRChat uses the Built-In Render Pipeline because it predates the Scriptable Render Pipelines. Unity has not and will not be adding support for FSR to the BIRP, and just simply switching VRChat to use URP instead of BIRP would break all existing content as the materials are incompatible.

Both the SteamOS and OpenVR FSR implementations do not implement FSR properly as directed by AMD. As a result they produce a considerably worse image and degrade the quality of UI rendering. Properly integrating FSR 1.0 according to AMD’s directions requires inserting the upscaling step during post-processing. Specifically after anti-aliasing and tonemapping but before any effects that introduce noise, grain, etc. to avoid FSR’s sharpening pass affecting the noise.


AMD also specifies that upscaling should be done before rendering UI. On PC VRChat renders the Quick Menu and Main Menu separately from the avatars, world, and some UI elements like nameplates. This is to prevent the world’s post-processing from affecting the menus.

The Unity Post Processing Stack has a number of features including anti-aliasing, and various post-processing effects including tone mapping. VRChat already enables MSAA by default so most worlds don’t use the Post Processing Stack for anti-aliasing as it tends to just make things blurry so we’ll ignore that.

This means that the basic process for rendering a frame is:

  1. Render the world, avatars, and in-world UI like nameplates.
  2. Apply post-processing which involves:
    2. Apply post processing effects
    3. Apply Colour Grading & Tone Mapping
  3. Render Main Menu, Quick Menu, and HUD.

This is where we run into a few problems. AMD specifies that FSR should run after tone mapping but before any effects that add noise, but Unity runs them in the opposite order.

While it is theoretically possible to rewrite Unity’s Post Processing Stack to run these effects in a different order it would be a lot of work and this isn’t actually the biggest problem. In order to upscale using FSR we first need to render at a lower resolution until we upscale to the full resolution, and then render the rest of the frame at the full resolution. The SRPs as the name indicates allow you to “script” your render pipeline in C# either using your own custom code or Unity’s URP or HDRP packages. Since everything is done from C# it’s possible to modify the pipeline to tell it to render part of the pipeline at a lower resolution from the rest. This makes it relatively straightforward to render at a lower resolution until FSR upscales it and then render at the full resolution from that point on. This is what Unity has done to support FSR 1.0 in URP.

However Unity’s BIRP is a lot less flexible than the SRPs, and does not support rendering only part of the frame at a lower resolution. There are some ways to manually approximate the process but they come with additional overhead, had incompatibilities with the Post Processing Stack or some of the other techniques commonly used in VRChat, didn’t support DX11, or some other issue that made it unusable.

In summary there isn’t a technically feasible avenue to integrate FSR 1.0 with VRChat that produces an image of sufficient quality to justify the development time required to implement it and the trade-offs required to make it work, if it is possible to make it work at all without breaking existing content. This will still be the case following the previously mentioned engine upgrade as Unity’s implementation of FSR requires using an SRP which is incompatible with our existing content.

@splitscream In my testing prior to the the Steam Deck’s launch Steam OS FSR upscaling only applies if the application renders at less than the native 1280x800 screen resolution. VRChat always sets the rendered resolution to 1280x800 when it detects it is running on a Steam Deck so the Steam OS upscaling should never apply.

8 Likes

There is a creator WispyWoo who likes fog effects, not 100% sure on the tech, but I did observe that more recent versions of the SDK have improved shaders, I tested the toon lit and matcap lit. When I build with 3.1.10 I could see through myself, but with 3.2.1 I noticed that I did not see through myself.

Can you suggest a foggy world for me to visit?

Oh I see the first canny mentions fog and I haven’t thought to look at my shadow since updating my SDK. Can you suggest a shadowy world for me to visit? :wink:

Knowing that a camera uses a lot of resources, I don’t understand this choice. The UI of ClientSim already uses a layer order of 1000, which puts it in front of all other UI elements. To break it, you really have to do it on purpose.

Thanks for the this, I’ve been wonder if it’s possible to get FSR working in my BIRP projects and this is the best explanation I’ve seen of why it’s not a thing.

I’m still on the fence of whether or not FSR 1.x looks better than bilinear upscaling in most cases but I’m leaning towards FSR (or at least some luma sharpening) over bilinear, but is there any chance we’ll see vrperfkit or something similar whitelisted for EAC? Is whitelisting something that’s possible?

Does VRChat ignore the resolution given to it by gamescope? Like does running gamemoderun gamescope -h 640 -H 1080 -f -U -- ./"VRChat.exe" not start VRC at 640p and let gamescope upscale to 1080p?

I have broken it, not on purpose. :stuck_out_tongue:

Camera Animations and Freeze Frame please! :eye::lips::eye:

I am trying to break it with ClientSim 1.2.5 but I am unable to do so.

Edit: Having another camera on a reserverd layer for the UI seems a little bit overkill. it’s like killing a fly with a rocket launcher! They could use a shader without ZWriting and ZTesting for the same result.

I know its not unity standard, but can we get a detail smoothness and detail metallic as well in standard-lite, pretty please? It would help so much for optimizing VRAM usage.

I glossed over a bit of nuance earlier. VRChat only sets the resolution to 1280x800 if it detects that the screen resolution is 1280x800. We didn’t test external displays on Steam Deck so YMMV. Since the resolution change only happens when the screen resolution is 1280x800 your gamescope command may work as expected if you’re using a 1080p external display.

1 Like

Ayoooooooo finally improving the IK Tweaks!!!
Also damn those new texture map features look pretty cool :smiley: :+1:

Less “underutilized” and more “abused” in my experience. Was meant for worlds that are primarily for sharing avatars but it’s turned into “my world has 2 avatars that can unlock through a hidden game that takes an hour to complete, better slap the avatar tag on it for the extra clicks”

Glad it’s being remedied.

1 Like

Looking forward to the IK chest tracker improvements. :slight_smile:
Lock both always felt off when moving too much and the chest caving in.

Having the lock setting stored per-avatar would really be nice too.
Some avatars work best with head lock, others with hip lock…
but currently as it’s a global setting, having to switch back and forth for every avatar is a pain.

1 Like