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.
