W tworzonej przeze mnie grze typu minecraft mam białe krawędzie na kostkach:
Jest to znacznie bardziej widoczne w ciemniejszych teksturach. Tekstury są konfigurowane w następujący sposób:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Jakaś pomoc?
Odpowiedzi:
Istnieją dwie możliwe przyczyny tego typu problemu, w zależności od tego, który dokładnie problem. Wymienię oba:
1. Widzisz inne kolory z tekstury wzdłuż krawędzi płytek.
Wygląda mi to na problem w tym przypadku, ponieważ wszystkie piksele krawędziowe są jednym z trzech kolorów, które są prawdopodobne w twojej teksturze: białym, czarnym i brązowym.
Jeśli używasz wielu obrazów sąsiadujących ze sobą w jednej teksturze (atlas tekstury), jak zakładam, robisz to jest nieuniknione. Dzieje się tak, ponieważ procesor GPU nie idealnie dopasowuje interpolację wzdłuż krawędzi trójkąta z interpolacją wzdłuż tekstury, a otrzymujesz małe kawałki sąsiedniej tekstury.
Istnieje wiele rzeczy, które możesz zrobić.
CLAMP[_TO_EDGE]
, ale w sposób, który jest świadomy atlasów tekstur - twoje użycie nie ma żadnego efektu, ponieważ większość twoich krawędzi płytek nie znajduje się na krawędzi tekstury.) To jest rozwiązanie, którego używam we własnym wpisie w gatunku Cubes . Nie znam żadnych szczególnych wad, z wyjątkiem tego, że wykorzystuje więcej pamięci tekstur.2. Widzisz szczeliny między płytkami.
Nie sądzę, że jest to problem w tym przypadku, ponieważ nie ma zielonego gruntu widocznego przez luki, ale włączam go dla kompletności.
Może się to zdarzyć, gdy nie podajesz dokładnie tych samych współrzędnych dla wierzchołków krawędzi zetknięcia sąsiednich płytek, co zwykle powstaje z powodu błędu zmiennoprzecinkowego. Na przykład, jeśli masz płytki o wielkości 0,6 i obliczyć prawą krawędź płytki na
x=100
z(100*0.6) + 0.6
, a lewa krawędź płytki nax=101
z(100*0.6)
, nie dostaniesz dokładnie taką samą odpowiedź, a różnica może być widoczne jako małe plamki luki.Rozwiązaniem jest upewnienie się, że arytmetyka jest spójna; niektóre sposoby na to:
index*size + size
, ale tylko(index+1)*size
.źródło