Z-fighting on mesh eyes while seated on a spinning (llTargetOmega) object, only at certain spin angles #424
Labels
No labels
amd
avatars
bug
builder
cannot-reproduce
crash
epic
feature
from-viewer
gl-removal
known-limitation
monitoring
parity
perf
platform
priority
critical
priority
high
priority
low
priority
medium
provenance
rendering
rt
status
in-progress
status
testing
status
up-next
triage
ui
upstream
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
sky_line/Slipstream#424
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Z-fighting on eye meshes (layered eye parts: eyeball / iris / highlight shells that sit very close together) while the avatar is sitting on an object that rotates, almost certainly via
llTargetOmega. It only shows at certain angles as the object spins, and is fine at other angles and when not seated on a spinner. Reported by the owner, 2026-10-05.Related: #418 (spinning linksets drift out of sync; the GPU target-omega path).
Why this smells like a timing/pose mismatch, not plain depth precision
Eye layers are normally offset by fractions of a millimetre. They only fight if two layers are transformed slightly differently. Sitting on a spinner is exactly when different transform paths can disagree:
GPU target omega (
llcleaninstancestore.cppcomposeOwnedPose, the "GPU TARGET OMEGA" block): the seat object spins on the GPU using phasecam_time.w - t0. Attachments are explicitly excluded ("Attachments keep the CPU-applied spin"), and so is the avatar.The seated avatar follows its parent's rotation on the CPU (LL's
applyAngularVelocityaccumulation, read at the time the skeleton is updated / the skin palette is computed).Eye meshes may mix paths:
If two layers come from different paths, or the same path evaluated at different times (CPU spin integration vs the world clock, palette from frame N-1 vs instance from frame N), they're offset by
angular_velocity × Δt × radius. That error varies with the spin angle (projection vs view direction), which would explain "only at certain angles".TAA / motion vectors: if the previous-frame transform used for reprojection differs between the layers (e.g. prev-instance rows vs skin history), the resolve can make thin layers flicker in and out. Check with TAA off.
To check
RenderVKDebugViewnormal/base views; a non-rotating seat vs a rotating one.LLWorldClock) and the same frame?getRotation() * ~getAngularVelocityRot()). That mix-up would show up as an angle-dependent offset.Fix direction
Repro
llTargetOmega(<0,0,1>, 0.5, 1.0)while wearing mesh eyes with layered shells.