2008-11-29 17 views
9

Czy możliwe jest pompowanie monochromatycznej (dane graficzne z 1-bitową głębią obrazu) tekstury do OpenGL?Tekst OpenGL i monochromatyczny

ja wykorzystuje tę:

glTexImage2D(GL_TEXTURE_2D, 0, 1, game->width, game->height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, game->culture[game->phase]); 

ja pompowania z kwadratową tablicy 8 bitowych liczb całkowitych trybie GL_LUMINANCE jeden kanał (8 bitów reprezentuje jasności wszystkich kanałów 3 i pełnej alfa), ale to IMO jest bardzo nieefektywne, ponieważ wartości onlu w tablicy to 0x00 i 0xFF.

Czy mogę (iw jaki sposób) użyć zamiast tego prostego, jednobitowego macierzy bajtów? Wielkość nadmierne Tablica spowalnia innych operacji na macierzy :(

Odpowiedz

5

Najmniejsza kompresji tekstury format obrazu luminancji używa 8 bitów na piksel.

Jednakże jeden bit na piksela obrazu może być ściśnięty bez stracie To nadal nie będzie 1 bit na piksel, ale gdzieś pomiędzy 2 a 3 bitami

Jeśli naprawdę potrzebujesz 1 bit na piksel, możesz to zrobić z małą sztuczką. Załaduj 8 1 bit na piksel tekstury jako jedna 8-bitowa tekstura tylko alfa (obraz 1 zostaje wczytany do bitu 1, obrazu 2 do bitu 2 itd.) Po wykonaniu tej czynności można "zaadresować" każdą z podstruktur za pomocą testu alfa cecha i odrobina tekstury programowanie środowiska, aby zmienić alfa w kolor.

Ta wola działa tylko wtedy, gdy masz 8 bitów na piksel tekstury i jest trudna do wykonania.

+0

8 tekstur podstępnych dźwięków jest interesujących, ale tak naprawdę nie jest to, czego szukam. Używam OpenGL do wizualizacji danych z mojej aplikacji, więc taka sztuczka spowolniłaby standardową operację na macierzy (nie mówiąc o komplikacjach programistycznych). –

13

Po kilku badań, udało mi się oddać 1 bit na piksel obrazu jako tekstury z następującego kodu:

static GLubyte smiley[] = /* 16x16 smiley face */ 
{ 
    0x03, 0xc0, /*  ****  */ 
    0x0f, 0xf0, /*  ********  */ 
    0x1e, 0x78, /* **** **** */ 
    0x39, 0x9c, /* *** ** *** */ 
    0x77, 0xee, /* *** ****** *** */ 
    0x6f, 0xf6, /* ** ******** ** */ 
    0xff, 0xff, /* **************** */ 
    0xff, 0xff, /* **************** */ 
    0xff, 0xff, /* **************** */ 
    0xff, 0xff, /* **************** */ 
    0x73, 0xce, /* *** **** *** */ 
    0x73, 0xce, /* *** **** *** */ 
    0x3f, 0xfc, /* ************ */ 
    0x1f, 0xf8, /* ********** */ 
    0x0f, 0xf0, /*  ********  */ 
    0x03, 0xc0 /*  ****  */ 
}; 

float index[] = {0.0, 1.0}; 

glPixelStorei(GL_UNPACK_ALIGNMENT,1); 

glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 2, index); 
glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 2, index); 
glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 2, index); 
glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 2, index); 

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,16,16,0,GL_COLOR_INDEX,GL_BITMAP,smiley); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

i oto wynik:

enter image description here

+0

Nice! Czy porównałeś jego wydajność z wariantem 1 bajt na piksel? –

+0

Nie wydaje się, że można zacisnąć tę teksturę bez zmiany kształtu. Próbowałem po prostu pozbyć się krwawienia na granicy. – Kaliber64

+0

Znalezienie zamiany wewnętrznego formatu na "LUMINANCE" powoduje wyświetlenie tych samych efektów wizualnych z jedną czwartą pamięci. Jeśli są jakieś mniejsze formaty, byłbym zainteresowany. Idk, jak uzyskać formaty S3TC. Nie sądzę, że pyOpenGL ma te rozszerzenia. – Kaliber64