Rezolvarea erorii Nova de text 8K în WebGL
Depanarea glifelor: trecerea la un rând nou la fiecare 8192 de pixeli strica interfața.
14 iunie 2025 · lectură de 6 minute
Pe scurt
- Simptom: textele de peste aproximativ 260 de caractere afișau erori la câteva glife, doar în WebGL.
- Cauză: rendererul alternativ Nova împacheta vârfurile într-o textură RGBA unidimensională mai lată decât limita WebGL de 8192 de pixeli.
- Soluție: împărțirea bufferului în rânduri de 8192 de pixeli și folosirea aceleiași lățimi în shader.
Eroarea: textul lung se corupe
Testarea a arătat că dialogurile de peste aproximativ 260 de caractere ≈ 1024 de glife se corupeau pe WebGL: caracterele dispăreau sau se schimbau la fiecare aproximativ 20 de glife.
Editorul părea în regulă până când am forțat SystemSettings.UseFallbackRendering = true; atunci problema a apărut și acolo.
// WebGL console
Texture has out of range width (got 12800 max supported 8192)
Cauza: buffere alternative prea mari și nealiniate
Nova folosește un buffer de textură alternativ când SSBO nu sunt disponibile, ca în WebGL. Un vârf de glifă = 64 de octeți = 4 pixeli float4. Un TextBlock cu 3224 de vârfuri devenea o textură 12896 × 1, mult peste limită.
După limitarea lățimii la 8192 de pixeli, a apărut alt artefact: shaderul considera încă rândurile late de 16384 de pixeli. Modificările scriau într-un rând, iar GPU citea din altul.
Soluția în două commituri
1 — Împărțirea texturii bufferului
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 — Sincronizarea constantei shaderului
#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
Am ajustat și SetData() să respecte shaderBufferStartIndex * 4 pentru RGBA, ca modificările la rulare să nu suprascrie glifele anterioare.
Rezultate
✅ WebGL: fără artefacte și blocări.
✅ Versiunile desktop independente păstrează calea SSBO de 16384 de pixeli.
Editorul încă afișează comportamentul ciudat, dar corectarea lui nu este prioritară momentan.
Ce urmează
Corectura este acum pe develop și va apărea în următoarea alpha. Dacă ai întâlnit probleme similare Nova UI, scrie-ne pe Discord, pe Facebook sau în comentarii!
