Ukratko
- Simptom: tekst duži od oko 260 znakova prikazivao je neispravne glifove, ali samo na WebGL-u.
- Uzrok: Nova rezervni renderer pakovao je vrhove u jednodimenzionalnu RGBA teksturu širu od WebGL ograničenja od 8192 piksela.
- Rešenje: podelili smo bafer u redove od 8192 piksela i uskladili širinu redova u shaderu.
Greška: dugi tekst se kvari
Testiranje je pokazalo da dijalozi duži od približno 260 chars ≈ 1 024 glyphs na WebGL-u gube ili zamenjuju znakove otprilike svakih 20 glifova. Editor je izgledao ispravno dok nismo prisilno uključili SystemSettings.UseFallbackRendering = true. Tada se greška pojavila i u njemu.
// WebGL console
Texture has out of range width (got 12800 max supported 8192)
Uzrok: preveliki i neusklađeni rezervni baferi
Nova prelazi na rezervno renderiranje preko teksturnog bafera kada SSBO nije dostupan, kao na WebGL-u. Jedan vrh glifa zauzima 64 bajta, odnosno četiri float4 piksela. <TextBlock> s 3224 vrha pretvorio se u teksturu 12896 px × 1, znatno iznad WebGL ograničenja.
Nakon ograničavanja širine na 8192 piksela pojavio se drugi problem: shader je i dalje očekivao redove širine 16384 piksela, pa su izmene pisale u jedan red, a GPU čitao iz drugog.
Rešenje u dve izmene koda
1. Podelite teksturu bafera
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. Uskladite konstantu 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
Izmenili smo i SetData() da poštuje shaderBufferStartIndex * 4 za RGBA putanje, kako izmene tokom izvršavanja više ne bi prepisivale ranije glifove.
Rezultati
- WebGL izdanje: bez artefakata i rušenja.
- Samostalna desktop izdanja zadržavaju SSBO putanju od 16384 piksela.
- Editor i dalje pokazuje neobično ponašanje, ali ta ispravka trenutno nije prioritet.
Šta sledi
Izmena je na grani develop; očekujte je u sledećoj alfi. Ako ste naišli na slične Nova UI probleme, javite nam na Discordu, Facebooku ili u komentarima.
