Bug Reports

  • No off-topic posts
  • Don't report more than 1 issue at once
  • For isolated issues or customer support visit help.vrchat.com
Thanks for your bug report!
Avatar light shadows: world geometry and other players do not cast shadows in the local player's mirror and camera views
## Summary When an avatar has a realtime spot light with shadows enabled (culling mask = Everything), shadow casters other than the local avatar itself are missing from the light's shadow map, but ONLY in the local player's mirror and VRChat camera views. First-person view: world geometry and other players correctly cast shadows onto my avatar My own mirror reflection: their shadows are missing (only my avatar's self-shadow remains) My own VRChat camera: same as mirror Remote clients (other players' views AND their cameras): everything is correct ## Reproduction steps Wear an avatar equipped with a realtime spot light (shadows enabled, culling mask = Everything) set up to illuminate the avatar itself. Join any world that has a mirror. Stand so that a world object (a wall, a pillar) or another player is between the spot light and your avatar. First person: the occluder's shadow falls on your avatar as expected. Look into the mirror, or open the VRChat camera: the occluder's shadow is gone. Your avatar's own self-shadowing still works — notably, a Cube attached to your own avatar still casts its shadow even in the mirror/camera, so only casters outside your own avatar are lost. Another player in the instance sees all shadows correctly, both in their direct view and through their VRChat camera. ## Evidence that this is not a Unity limitation I reproduced VRChat's mirror rendering in the Unity editor (planar reflection camera with a reflected view matrix and an oblique near-plane projection, same technique as VRC mirrors) using the same spot light + Cube setup. In stock Unity, all shadow casters render into the spot light's shadow map correctly, with oblique clipping both on and off. The symptom only occurs in the VRChat client. ## Suspected mechanism The behavior is consistent with the client rewriting the culling masks of avatar lights during the local mirror/camera render passes so that only the local player's own mirror clone remains as a shadow caster — regardless of which player the light belongs to (see related report: "Culling mask for lights in avatars modified unexpectedly"). A light's culling mask determines both what it illuminates AND which objects render into its shadow map. This matches every observation above: in Player A's own mirror, A's clone still casts (shadow visible); in Player B's mirror, only B's clone casts, so A's Cube, world geometry, and other players are silently excluded. ## Related reports "Local players don't cast shadows caused by lights in avatars on cameras" (the complementary case, Tracked since 2024-01) https://feedback.vrchat.com/bug-reports/p/local-players-dont-cast-shadows-caused-by-lights-in-avatars-on-cameras-1 "Culling mask for lights in avatars modified unexpectedly" https://feedback.vrchat.com/bug-reports/p/culling-mask-for-lights-in-avatars-modified-unexpectedly ## Impact Avatar light systems that let the wearer receive shadows from the environment (occlusion by walls, props, other players) work in first person and for every remote viewer, but break in the user's own mirror and camera. This makes them unusable for self-photography and mirror checks, which are core VRChat use cases. --- ## 概要(日本語) 影を有効にしたリアルタイムスポットライト(カリングマスク Everything)を自分のアバターに 載せた場合、自分のアバター以外のシャドウキャスターがライトのシャドウマップから欠落します。 ただし欠落するのは「自分のミラー」と「自分の VRChat カメラ」の描画に限られます。 一人称視点: ワールドジオメトリや他プレイヤーの影は正しく自分のアバターに落ちる 自分のミラー: それらの影が消える(自アバターのセルフシャドウだけ残る) 自分の VRChat カメラ: ミラーと同様 他プレイヤーからはすべて正常: 直接視点も、相手のカメラ越しでも正しく見える ## 再現手順(日本語) 影有効のリアルタイムスポットライト(カリングマスク Everything、アバター自身を照らす向き)を載せたアバターを着用する。 ミラーのある任意のワールドに入り、ワールドオブジェクト(壁・柱)または他プレイヤーがライトと自分のアバターの間に来るように立つ。 一人称: 遮蔽物の影が自分のアバターに正しく落ちる。 ミラーを見る、または VRChat カメラを開く: 遮蔽物の影が消える。自アバターのセルフシャドウは残る — 特に、自分のアバターに取り付けた Cube の影はミラー/カメラでも消えないため、失われるのは「自アバター外のキャスター」だけである。 同インスタンスの他プレイヤーからは、直接視点でもカメラ越しでも、すべての影が正しく見える。 ## Unity の制限ではない根拠(日本語) VRChat のミラー描画をエディタ上で再現し(反射ビュー行列+斜めニアクリップ射影の平面反射カメラ、VRC ミラーと同じ手法)、同じスポットライト+Cube 構成で検証しました。素の Unity では斜めクリップの有無にかかわらず全キャスターが正しくシャドウマップに描画されます。 症状は VRChat クライアント上でのみ発生します。 ## 推定メカニズム(日本語) この挙動は、ローカルのミラー/カメラ描画パス中にクライアントがローカルプレイヤーの アバターライトのカリングマスクを書き換え、シャドウキャスターとしてローカルプレイヤー自身のミラークローンだけを残しているという動作と整合します(関連報告 "Culling mask for lights in avatars modified unexpectedly" 参照)。 ライトのカリングマスクは「何を照らすか」と「何をシャドウマップに描くか」の両方を決めるため、これらのパスでマスクをクローン用レイヤーに絞れば、まさにこの症状になります: 装着者自身のアバター(クローン)はキャスト/受影とも機能し続け、ワールドジオメトリと他プレイヤーは静かに除外されます。リモートクライアント上ではライトは改変されないため、そちらではすべて正常に見えることとも一致します。 ## 影響(日本語) 環境からの影(壁・小物・他プレイヤーによる遮蔽)を着用者が受けられるアバターライト製品は、一人称と全リモート視点では動作する一方、本人のミラーとカメラでは壊れます。 自撮りやミラーチェックという VRChat の中核的な用途で使えなくなります。
3
·
tracked
Manual sync does not work reliably for late joiners
Every now and then, late joiners do not receive data for manual synced variables on UdonSharpBehaviours. This can be severly breaking for some worlds! Just imagine a locked private room suddenly being accessible for a late joiner. I found one way to trigger it relatively often: put a few manual synced objects into an otherwise empty world (for example the attached InteractionCounter script). Do a Build & Test, interact with some objects to change and serialize their state Start a second client, the client receives data normally. Don't interact with anything Quit the first client without interacting with anything Start a third client. Often, this one already doesn't get any data on any of the objects. If sync still works, just repeat the process by closing the second client and starting a fourth and so on and try interacting with something again with the client that you are about to close. Or have another regular game client running in the background in a heavy world. For some reason that does seem to have a big influence, too. It is still a bit random, but that way the bug usually happens pretty fast. Note that after it happens, the player can still call RequestSerialization to properly send the data to late joiners, they just don't receive it automatically on join. Also note that it usually affects successive late joiner after it happened once. Also note that doing a RequestSerialization in OnOwnershipTransferred usually avoids that bug. Which is interesting, because it suggests that another RequestSerialization helps even before the new player joins. However, this would only take care of the cases where the actual owner leaves. From observations, I'm almost sure there are more scenarios that can trigger late join sync issues. This issue is similar to: https://feedback.vrchat.com/bug-reports/p/1553-ondeserialization-not-guaranteed-to-fire-for-late-joiners But different in the way that it is not just OnDeserialization not being called: The values of the variables do not change either.
1
·
tracked
Real-Time Enforcement Issue with Group Bans via Website/API
Hello VRChat team, I’d like to report a critical inconsistency in how group bans are handled when issued through the VRChat website or third-party tools utilizing the API (e.g., VRCX). Observed Behavior When a user is banned from a group via the website or an API-based tool, the ban does not take effect in real-time if the user is currently inside a group instance. Despite being technically banned, the user is: Not removed from the current instance Still able to interact with group members Still enjoying group-related privileges The ban only fully takes effect after the user leaves and attempts to join a new instance, at which point access is correctly denied. Why This Is a Problem This delay has serious implications for moderation: In urgent cases, moderators cannot remove problematic users in real-time. There's currently no mechanism to trigger a forced update or kick based on a group ban alone. It undermines group security, allowing banned users to linger and potentially cause further disruption. This gap in enforcement stands in contrast to other website/API actions such as avatar changes which do propagate instantly in-game. This suggests real-time updates are technically possible, but simply not implemented for group bans. Suggested Improvement To ensure consistent and secure moderation: When a user is group-banned via the website or API, the system should immediately remove (kick) them from any group-owned instance they are currently in. Implementing this would close a loophole in group moderation tools and align the behavior of group bans with the expectations of real-time enforcement. Thank you for your attention. Resolving this would greatly enhance group management capabilities and improve the overall safety of VRChat communities.
2
·
tracked
Load More