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.
