Preskočiť na obsah
Menu
← Späť na blog

Oprava chyby 8K textu Nova UI vo WebGL

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

14. júna 2025 · približne 6 minút čítania

V skratke

  • Text dlhší než približne 260 znakov sa vo WebGL zobrazoval poškodene.
  • Záložný renderer Nova ukladal vrcholy do jednorozmernej RGBA textúry širšej než limit 8192 pixelov.
  • Buffer sme rozdelili do riadkov po 8192 pixeloch a nastavili rovnakú šírku v shaderi.

Chyba: dlhý text sa rozpadá

Testovanie ukázalo, že dialógy nad približne 260 chars ≈ 1 024 glyphs vo WebGL strácali alebo zamieňali znaky asi každých 20 glyfov. Editor vyzeral správne, kým sme nevynútili SystemSettings.UseFallbackRendering = true.

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

Príčina: príliš veľké a nezarovnané buffery

Keď SSBO nie sú dostupné, Nova používa textúrový záložný buffer. Jeden vrchol glyfu má 64 bajtov, teda štyri pixely float4. <TextBlock> s 3224 vrcholmi vytvoril textúru 12896 px × 1, ktorá prekročila limit WebGL.

Po obmedzení šírky na 8192 pixelov shader stále predpokladal 16 384 pixelov. Zápis smeroval do jedného riadka a GPU čítala iný.

Oprava v dvoch zmenách

1. Rozdelenie textúry 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. Zjednotenie konštanty shadera

#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 sme aj SetData(), aby pri RGBA cestách rešpektovalo shaderBufferStartIndex * 4. Zmeny za behu už neprepisujú skoršie glyfy.

Výsledky

  • WebGL zostavenie: bez artefaktov a pádov.
  • Desktopové zostavenia si ponechávajú SSBO cestu s 16 384 pixelmi.
  • Editor stále vykazuje nezvyčajné správanie, ktorého oprava zatiaľ nie je prioritou.

Čo bude ďalej

Oprava je vo vetve develop a príde v ďalšej alfe. Podobné problémy môžete zdieľať na Discorde, Facebooku alebo v komentároch.

Leave a Comment

Scroll to Top