Přeskočit na obsah
Menu
← Zpět na blog

Oprava chyby 8K textu Nova UI ve WebGL

Frustrated developer comparing broken glyph rows in the browser console and Unity Editor.

14. června 2025 · přibližně 6 minut čtení

Ve zkratce

  • Text delší než přibližně 260 znaků se ve WebGL zobrazoval poškozeně.
  • Záložní renderer Nova ukládal vrcholy do jednorozměrné RGBA textury širší než limit 8192 pixelů.
  • Buffer jsme rozdělili do řádků po 8192 pixelech a stejnou šířku nastavili v shaderu.

Chyba: dlouhý text se rozpadá

Testování ukázalo, že dialogy nad přibližně 260 chars ≈ 1 024 glyphs ve WebGL ztrácely či zaměňovaly znaky asi každých 20 glyfů. Editor vypadal správně, dokud jsme nevynutili SystemSettings.UseFallbackRendering = true.

// WebGL console
Texture has out of range width (got 12800 max supported 8192)

Příčina: příliš velké a nezarovnané buffery

Pokud SSBO nejsou dostupné, Nova používá texturový záložní buffer. Jeden vrchol glyfu má 64 bajtů, tedy čtyři pixely float4. <TextBlock> s 3224 vrcholy vytvořil texturu 12896 px × 1 přesahující limit WebGL.

Po omezení šířky na 8192 pixelů shader stále předpokládal 16 384 pixelů. Zápis mířil do jednoho řádku a GPU četla jiný.

Oprava ve dvou změnách

1. Rozdělení textury bufferu

int maxEdge = 8192;
int width   = Mathf.Min(numPixels, maxEdge);
int height  = Mathf.CeilToInt((float)numPixels / width);
texture = new Texture2D(width, height, TextureFormat.RGBAFloat, false, true);

2. Sjednocení konstanty shaderu

#if defined(NOVA_FALLBACK_RENDERING)
  #if defined(UNITY_WEBGL) || defined(UNITY_EDITOR)
    #define MAX_TEXTURE_DIMENSION 8192u
  #else
    #define MAX_TEXTURE_DIMENSION 16384u
  #endif
#endif

Upravili jsme i SetData(), aby na RGBA cestách respektovalo shaderBufferStartIndex * 4. Změny za běhu už nepřepisují dřívější glyfy.

Výsledky

  • WebGL sestavení: bez artefaktů a pádů.
  • Desktopová sestavení si ponechávají SSBO cestu s 16 384 pixely.
  • Editor stále vykazuje neobvyklé chování, jehož oprava zatím není prioritou.

Co bude dál

Oprava je ve větvi develop a přijde v další alfě. Podobné problémy sdílejte na Discordu, Facebooku nebo v komentářích.

Leave a Comment

Scroll to Top