Closed bug report

3D viewer: blue triangle artifacts around model perimeter while moving the camera — standardize background color

Caleb · 6d ago ·closed by Colby Knox

Problem

In the 3D model viewer on component wiki pages, moving/orbiting the camera causes the grey background to become infected with blue triangles around the perimeter of the model. It looks like an incomplete clear / stale framebuffer or environment-render artifact showing through at the edges of the rendered model.

Requested change

Resolve the artifacting so the perimeter landscape of the renderer is a standardized, uniform color at all times — including during camera movement. No blue triangles or other transient geometry/artifacts should appear in the background.

Acceptance criteria

  • Orbiting, panning, and zooming never produce blue triangle artifacts around the model
  • The background outside the model is one standardized color, consistent while the camera is static and while it is moving
  • Applies to all component wiki pages that embed the 3D viewer

4 Replies

Colby Knox · 4d ago

Status: I could not reproduce this in software rendering (SwiftShader), on either the old or the new bundle, with an aggressive protocol: continuous orbit, orthographic deep zoom, perspective zoom in/out during motion, scanning every frame for saturated blue pixels outside the UI gizmos. Zero hits.

Two relevant facts though:

  1. The wiki had been serving a June 11 bundle. Two skybox fixes merged July 10 (render the skybox at infinite distance so it always fills the view, and detach the environment reflection that had a near-black zenith) match this artifact class: a skybox that fails to cover the whole background during camera motion shows exactly transient wrong-color geometry at the model perimeter.
  2. That newer bundle (plus this round's fixes) is now live on prod as 20260717a.

So: please re-check on your hardware. If the blue triangles still appear, reply with the page URL, GPU, OS, and browser, because at that point it is a driver-specific rendering bug and I will need that to chase it. If it is clean, this was the stale bundle and we can close.

Colby Knox · 4d ago

Root-caused and FIXED, live on prod (bundle 20260717c). Colby caught it live on https://wiki.adom.inc/viewer/3d/component/ntx-ccx-mio-carrier: a hard gray wedge across the background that moves while orbiting.

Root cause: the background was a fixed 5000-unit skybox MESH, i.e. world geometry that has to survive the depth buffer. Boards exported in meters put the camera near plane around 0.0003, and the far plane sat at 7500 to cover the skybox, a near/far ratio of about 23 million. Real GPUs have no depth precision left at that range, so the skybox's far corners quantized past the far plane and were clipped into hard triangular seams that swept across the background with the camera. Software rendering hides it, which is why my SwiftShader hunt came up clean while every real GPU showed it. Small chip models frame differently, so it hit big boards hardest, matching both reports.

Fix: the background is no longer geometry at all. It is a screen-space gradient layer (same steel-blue gradient), which has no depth: it cannot clip, seam, or z-fight, and it is pixel-identical at every camera angle, static or moving. The far plane is now model-scaled (near/far ratio 20000 at any model size), and the ground plane got a radial fade so its square rim no longer draws a horizon line at grazing angles either.

Verified with the exact reported model: the carrier GLB's background is horizontally uniform to within 1/255 in every frame of a continuous orbit sweep, including orthographic deep zoom. Acceptance criteria met: one standardized background, static and moving, no triangles.

Caleb, if you still see anything on your hardware after a hard refresh (the bundle URL is version-stamped, so a plain reload should get 20260717c), reply here with the page and GPU.

Colby Knox · 4d ago

Addendum, also live now (bundle 20260717d): the layer z-fighting on the same page is fixed too. Colby's screenshot showed yellow copper moire fanning through the mask around the vias; the carrier GLB builds the board as four nested shells whose faces sit 10 to 40 microns apart, and at normal orbit distance the depth quantum was about 20 microns, so the layers fought.

Two changes: the dynamic near plane went from radius/1000 to radius/100 (10x depth precision at every zoom, the near plane is the entire lever here), and AABB-nested shells now get polygon-offset tiers (zOffsetUnits per nesting depth), which separates stacked layers by whole depth-buffer quanta at any camera distance in both projections. Nesting depth matches the physical stacking, so mask beats substrate and silk beats mask deterministically on any GPU.

Also fixed in the same bundle: hover tooltips no longer show meaningless exporter mesh names like =>[0:1:1:40].

Colby Knox · 4d ago

Closing: both artifact classes on this issue are fixed and live on prod (bundle 20260717e).

  1. Background wedges (the original report): the skybox mesh was far-plane clipped on real GPUs. Replaced with a screen-space gradient layer that has no depth and cannot clip, seam, or fight, verified by Colby on the carrier page.

  2. Layer z-fighting (copper moire through the mask, reported live by Colby on adom/ntx-ccx-mio-carrier): PCB exports stack the board as nested shells 10-40 microns apart. Fixed in three steps across 20260717d/e: near plane raised to radius/50 (20x depth precision vs the original), polygon-offset tiers so nested layer shells render deterministically in front of their container at any zoom in either projection, and a layer-vs-poker distinction so meshes that rise above the board (pins, pads, component bodies) lose exact depth ties to the mask instead of winning them, which keeps the mask covering the pour while pads stay visible through real mask openings.

Remaining gold visible on that carrier at certain spots matches actual exposed-copper geometry in the GLB (mask openings), not a rendering defect. If anyone still sees SHIMMERING (not static exposed copper) on any page after a reload, reopen with the page and GPU.

Log in to reply.