2011-10-18 15 views
5

Załóżmy, że ładuję tablicę bajtów jako RGB z podanego pliku.Czy należy odwrócić tekstury OpenGL?

Czytałem, że OpenGL lubi przechowywać swoje tekstury "odwrócone" i widziałem programy demonstracyjne przechowujące ich odwrócone do góry nogami.

Czy w moim programie muszę odwrócić załadowany bajt macierzy RGB bajtowo lub wiersz po linii?

Odpowiedz

6

Dzieje się tak dlatego, że format Bitmap (.bmp) przechowuje linie do góry nogami. Nie jestem pewien, kto to wymyślił, ale jest to format pliku. Tak więc, tak, musisz to zrobić, jeśli używasz własnego programu ładującego .bmp. Możesz jednak użyć tego, który został już napisany, który jest dla ciebie "obrazkiem do góry nogami" "do góry nogami". Ponownie, to tylko rzecz .bmp. OpenGL działa domyślnie na nieprzeciętych obrazach.

Oto mały trick: Jeżeli nie chcesz zmieniać swój ładowacz .bmp, można powiedzieć OpenGL, aby odwrócić obraz dla Ciebie:

glMatrixMode(GL_TEXTURE); 
glLoadIdentity(); 
glScalef(1.0f, -1.0f, 1.0f); 
glMatrixMode(GL_MODELVIEW); 

To właśnie miałem na myśli z „domyślnie”. Jeśli chcesz, możesz odwrócić OpenGL do góry nogami. Działa to jednak tylko wtedy, gdy ładujesz pliki .bmp tylko tylko. Inne formaty plików poprawnie przechowują wiersze. Dlatego wolę pierwsze podejście - użyj prawdziwego programu ładującego .bmp.

Wystarczy być jasne: jeżeli wczytuje pliki .bmp, ty MUST obrócić obraz albo ręcznie przed wysłaniem go do OpenGL (co zrobić większość ładowarki .bmp), LUB wysłać obraz do unflipped OpenGL i dodaj powyższy kod przed kodem renderującym.

+0

Prawda, w rzeczywistości wszystkie odwrócone obrazy były BMP. Ale jak o tym, jak OpenGL przyjmuje współrzędne tekstury? (0,0) jest na pierwszym pikselu na ostatniej linii, czy mam rację, a (1,1) jest ostatnim pikselem w pierwszym wierszu? Czy nie muszę odwracać tablicy, żeby to było poprawne? –

+0

Cóż, to zależy! Jeśli po prostu pobierzesz surowe dane BMP i wyślesz je do OpenGL, wtedy tak, (0,0) nagle stanie się pierwszym pikselem w pierwszym wierszu. Jeśli chcesz (0,0) ponownie stać się ostatnim pikselem w pierwszym wierszu, musisz przerzucić tablicę przed wysłaniem jej do OpenGL. Alternatywą jest powyższy kod skalowania matrycy. –

+0

@catfish_deluxe_call_me_cd Nie! (0,0) to pierwszy piksel w pierwszym wierszu. Chodzi o to, że w OpenGL linie obrazu są posortowane od dołu do góry, ale początek jest nadal w pierwszym pikselu w pierwszym wierszu danych obrazu ** ** wysyłanych do OpenGL. –

Powiązane problemy