Gdy HUD nagle stanął na głowie w przeglądarce 🙃
7 listopada 2026
W wersji 2026.10.10 zrobiliśmy pod maską dwa duże kroki: gra działa teraz na Unity 6.6, a wersja przeglądarkowa startuje na WebGPU wszędzie tam, gdzie przeglądarka je oferuje, na przykład w aktualnym Chrome i Edge. W pozostałych przypadkach działa na WebGL 2 jak dawniej. Oba to sposoby, w jakie strona internetowa rozmawia z kartą graficzną. WebGL istnieje od wielu lat, WebGPU jest jego następcą i jest bliższe temu, jak działają dzisiejsze karty graficzne. Niedługo potem mój HUD stanął na głowie. 🙃
Raz zobaczone, potem nigdy więcej. Otworzyłem grę w Chrome na swoim laptopie i HUD był do góry nogami. Próbowaliśmy to odtworzyć i nie udało się. Sam też już tego nie widziałem. Na razie więc zamknęliśmy sprawę.
Potem wróciło, z dowodem fotograficznym. 19 października stało się to znowu, w świeżym świecie. Tym razem od razu wysłałem zgłoszenie błędu ze zrzutem ekranu. Tyle że sam zrzut był zepsuty: trzy kopie obok siebie, pełne pasków. Detektywistyczna robota, która za tym stoi: obraz składa się z pikseli, a każdy piksel zwykle ma trzy wartości: czerwień, zieleń i błękit. Gra oczekiwała trzech wartości na piksel, ale WebGPU dostarczało cztery, z dodatkową wartością przezroczystości. Odczytaj te same dane z czterema wartościami na piksel, a obraz staje się czytelny. Świat stoi prosto, ale cały HUD jest odbity lustrzanie: pasek szybkiego dostępu przykleja się do góry, a pytanie VEGA „Mam ci pokazać podstawy?” stoi do góry nogami. Przy okazji okazało się, że każdy zrzut ekranu z przeglądarki był zepsuty od przejścia na WebGPU. Nikt tego nie zauważył, bo do tej pory żadne zgłoszenie z przeglądarki nie przyszło ze zrzutem. 🔍
Dlaczego tylko HUD? Od poziomu grafiki „Średnie” wzwyż, z włączonym efektem wizjera, osobna kamera maluje HUD do własnego obrazu w pamięci karty graficznej. Fachowcy nazywają to teksturą renderowania. Gra nakłada potem ten obraz na świat z efektem wizjera i jego poświatą. Haczyk: systemy graficzne nie są zgodne co do tego, gdzie w takim obrazie jest „góra”. Jedne liczą wiersze od góry, inne od dołu. Zwykle silnik gry to wyrównuje. W przeglądarce na WebGPU w przypadku obrazu HUD-a czasem to nie wychodziło. Dlaczego tylko czasem, wciąż nie wiemy na pewno.
Odtworzyć? Bez szans. Żeby samodzielnie szukać błędów przeglądarki, zbudowaliśmy mały tor testowy. Pobieramy gotowy pakiet gry w danej wersji i uruchamiamy go na własnym komputerze. Potem zdalnie sterowana przeglądarka z WebGPU przeklikuje menu, uruchamia świat i robi zrzuty ekranu, na które patrzy nasza sztuczna inteligencja. Próbowaliśmy tak trzy razy, dokładnie z moim linkiem i na tym samym układzie graficznym, i trzy razy HUD stał prosto. Błąd miał tylko mój prawdziwy Chrome.
Jeśli nie da się wymusić błędu, trzeba go wykryć. Kamera HUD-a maluje więc teraz malutką magentową kropkę, o rozmiarze czterech pikseli, w lewym górnym rogu swojego obrazu. Zanim HUD zostanie nałożony na świat, shader wizjera sprawdza oba lewe rogi, żeby zobaczyć, gdzie wylądowała kropka. (Shader to mały program działający bezpośrednio na karcie graficznej.) Jeśli kropka jest na dole, shader odwraca HUD. Przy tym maskuje rogi, więc kropki nigdy nie widać. Ale dopóki błąd się ukrywa, taką naprawę trudno przetestować. Dlatego jest przełącznik testowy, który celowo stawia kropkę w złym rogu. Wtedy HUD musi stanąć na głowie i dokładnie tak się stało, tak samo jak na moim zrzucie ekranu. To dowiodło, że wykrywanie działa. ✅
Oczywista poprawka byłaby błędem. „To po prostu zawsze odwracajmy na WebGPU!” Wypróbowaliśmy to na torze testowym, zanim to wbudowaliśmy. Zepsułoby to HUD wszystkim, bo przez większość czasu stał prosto.
Trzy pułapki po drodze. WebGPU spłatało nam jeszcze kilka figli. Po pierwsze, zwykły krok kopiowania potrafi na WebGPU samodzielnie odbić obraz. Odtworzenie błędu z lustrzaną kopią więc nie zadziałało. Po drugie, nowy przełącznik, który chcieliśmy raz przekazać shaderowi, po prostu nigdy nie dotarł do przeglądarki. Po trzecie, odczytywaliśmy piksele, żeby sprawdzić kolejność wierszy, i dostawaliśmy sprzeczne odpowiedzi. Teraz shader zapisuje swój werdykt w jednym jedynym pikselu, a my go odczytujemy. Pojedynczy piksel nie ma góry ani dołu. 😄
Co z tego macie. Od wersji 2026.10.24 HUD w przeglądarce stoi prosto, a zrzuty ekranu z przeglądarki znów są prawdziwymi obrazami. Zgłoszenia błędów mają teraz też sekcję graficzną, która mówi między innymi, jak stał HUD. Następnym razem będziemy więc wiedzieć nawet bez obrazka. W tym samym pakiecie naprawiliśmy też błąd ze zgłoszeń Lyxette: zwierzę nie unosi się już nad wykopanym przez was rowem. 🐾
Jeśli kiedyś nadal zobaczycie HUD do góry nogami: w przeglądarce F2 otwiera zgłoszenie błędu. Zajrzymy do tego. 🙏
Komentarze