Mam silnik do gry 2D, który rysuje mapy warstwowe, rysując kafelki z obrazu zestawu klocków. Ponieważ domyślnie OpenGL może owinąć tylko całą teksturę ( GL_REPEAT
), a nie tylko jej część, każda płytka jest podzielona na osobną teksturę. Następnie regiony tego samego kafelka są renderowane obok siebie. Oto jak to wygląda, gdy działa zgodnie z przeznaczeniem:
Jednak po wprowadzeniu skalowania ułamkowego pojawiają się szwy:
Dlaczego to się dzieje? Myślałem, że było to spowodowane liniowym filtrowaniem mieszającym granice quadów, ale nadal dzieje się tak z filtrowaniem punktowym. Jedynym rozwiązaniem, jakie do tej pory znalazłem, jest zapewnienie, że całe pozycjonowanie i skalowanie odbywa się tylko przy wartościach całkowitych, i stosowanie filtrowania punktów. Może to pogorszyć jakość wizualną gry (szczególnie, że pozycjonowanie subpikseli nie działa, więc ruch nie jest tak płynny).
Rzeczy, które próbowałem / rozważałem:
- antyaliasing zmniejsza szwy, ale nie całkowicie je eliminuje
- wyłączenie mipmapowania nie ma żadnego efektu
- renderuj każdy kafelek osobno i wyciągnij krawędzie o 1px - ale jest to de-optymalizacja, ponieważ nie może już renderować obszarów kafelków za jednym razem i tworzy inne artefakty wzdłuż krawędzi obszarów przezroczystości
- dodaj obramowanie 1px wokół obrazów źródłowych i powtórz ostatnie piksele - ale wtedy nie są one już mocą dwóch, powodując problemy z kompatybilnością z systemami bez obsługi NPOT
- napisanie niestandardowego modułu cieniującego do obsługi obrazów sąsiadujących - ale co byś zrobił inaczej?
GL_REPEAT
powinien chwytać piksel z przeciwnej strony obrazu na granicach, a nie wybierać przezroczystości. - geometria jest dokładnie przylegająca, nie ma błędów zaokrąglania zmiennoprzecinkowego.
- jeśli moduł cieniujący fragmenty jest mocno zakodowany, aby zwrócić ten sam kolor, szwy znikają .
- jeśli
GL_CLAMP
zamiast tekstury ustawionoGL_REPEAT
, szwy znikają (chociaż renderowanie jest nieprawidłowe). - jeśli tekstury są ustawione na
GL_MIRRORED_REPEAT
, szwy znikają (chociaż renderowanie jest znowu nieprawidłowe). - jeśli sprawię, że tło będzie czerwone, szwy nadal będą białe. Sugeruje to, że próbuje skądś nieprzezroczystą biel, a nie przezroczystość.
Więc szwy pojawiają się tylko po GL_REPEAT
ustawieniu. Tylko z jakiegoś powodu w tym trybie na krawędziach geometrii występuje upust / wyciek / przezroczystość. Jak to możliwe? Cała tekstura jest nieprzezroczysta.
GL_NEAREST
próbkowaniem w R
kierunku współrzędnych również działają tak samo dobrze, jak tekstury tablic dla większości rzeczy w tym scenariuszu. Mipmapping nie zadziała, ale sądząc po twojej aplikacji prawdopodobnie i tak nie potrzebujesz.