Mam dziwny problem z rysowaniem tekstury Skybox na Macu. Na iPhonie wszystko idzie dobrze. Próbowałem zmienić wartość bliskich i dalekich samolotów bez powodzenia.
Jest to skybox sześciu tekstur i dla każdej tekstury ustawiam to:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Co może być problemem?
Zrzut ekranu:
EDYTOWAĆ:
Próbowałem ustawić kolor tła na czerwony, aby upewnić się, że przecieka przez teksturę
Próbowałem również zmienić współrzędne tekstury na to:
float err_corr = 0.5 / TEXTURE_SIZE;
GLfloat vertices[24] = {
-1.0f - err_corr, -1.0f - err_corr, 1.0f + err_corr,
1.0f + err_corr, -1.0f - err_corr, 1.0f + err_corr,
-1.0f - err_corr, 1.0f + err_corr, 1.0f + err_corr,
1.0f + err_corr, 1.0f + err_corr, 1.0f + err_corr,
-1.0f - err_corr, -1.0f - err_corr, -1.0f - err_corr,
1.0f + err_corr, -1.0f - err_corr, -1.0f - err_corr,
-1.0f - err_corr, 1.0f + err_corr, -1.0f - err_corr,
1.0f + err_corr, 1.0f + err_corr, -1.0f - err_corr,
};
I pudełko jest rysowane w tej kolejności:
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};
ROZWIĄZANIE:
Rozwiązaniem jest ustawienie GL_CLAMP_TO_EDGE dla samej mapy kubatury!
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
orazglTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
wstaw „0,5f / texture_width” z lewej i prawej strony tekstury oraz „0,5f / texture_height” od góry i dołu. Widzisz artefakty próbkowania - próbniki tekstury zwykle próbkują od środka tekstur, więc po lewej i prawej stronie, u góry i na dole (przy 0 i 1 UV) dostajesz 50% tego, co texel dostaje sampler, gdy jest poza zakresem . To albo druga strona tekstury, albo domyślny kolor próbkowania.
źródło
GL_CLAMP_TO_EDGE
zestaw, który powinien sprawić, że próbki poza granicami przyjmą wartość najbliższych pikseli tekstur. To, co opisujesz, może bardzo dobrze działać, ale nie wyjaśnia, dlaczego problem istnieje.Domyślam się, że różnica między MAC a iPhone'em jest spowodowana antyaliasingiem na MAC. Moje programowanie 3D jest trochę zardzewiałe, ale myślę, że musielibyście zrobić wszystkie kwadraty częścią tej samej siatki lub coś w tym rodzaju.
Brudne rozwiązanie polegałoby na tym, że wszystkie kwadraty byłyby trochę za duże, aby nakładały się na siebie i zaciskały i odpowiednio dostosowywały współrzędne UV.
źródło
Jest to zwykły problem z mapami kubatury na starszych urządzeniach sprzętowych (lub na telefonach). Sprawdź, czy
rozszerzenie, jeśli jest dostępne na twoim sprzęcie. W takim razie. Problem można rozwiązać za pomocą go.
źródło
Czy sześć tekstur jest skonfigurowanych konkretnie jako mapa kostki, czy też każda ze ścian skybox jest renderowana osobno z własną teksturą? Słyszałem, że niektóre wczesne systemy komputerowe miały dość słabe filtrowanie, jeśli chodzi o obsługę map kubatur, ponieważ niekoniecznie filtrowały one teksturę jednej powierzchni do drugiej, gdy próbkowałeś w pobliżu krawędzi kostki. AFAIK, GPX (iPhone GPU) powinien poprawnie filtrować między krawędziami.
Przyszło mi do głowy, że spód twoich bocznych tekstur wygląda jak odcień niebieskiego do artefaktu. Czy możesz spróbować, powiedzmy, uczynić dolny rząd (lub kilka rzędów) pikseli ohydnym odcieniem magenty i zobaczyć, czy to zmieni kolor artefaktu? To może dać więcej wyobrażenia o tym, co może się dziać, a co nie.
źródło