2008-11-29 11 views
9

Ist es möglich, monochrome (Grafikdaten mit 1 Bit Bildtiefe) Textur in OpenGL zu pumpen?OpenGL und monochrome Textur

ich dies derzeit verwenden:

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

ich es mit quadratischer Anordnung von 8-Bit Integer ohne Vorzeichen in GL_LUMINANCE Modus (ein 8-Bit-Kanal darstellt Helligkeit aller Kanäle 3 und Voll alpha) gepumpt wird, aber es ist IMO sehr ineffektiv, weil die Onlu-Werte im Array 0x00 und 0xFF sind.

Kann ich (und wie) stattdessen einfach ein Ein-Bit-Pixel-Array von Booleschen Elementen verwenden? Die übermäßige Feldgrße verlangsamt irgendwelche andere Operationen auf dem Array :(

Antwort

5

Das kleinste unkomprimierte Textur-Format für die Luminanz Bilder verwendet 8 Bits pro Pixel.

jedoch 1-Bit-pro-Pixel-Bilder kann ohne Verlust komprimiert werden, um das Format S3TC oder DXT. Dies ist immer noch nicht 1 Bit pro Pixel, sondern irgendwo zwischen 2 und 3 Bit

Wenn Sie wirklich 1 Bit pro Pixel benötigen, können Sie dies mit einem kleinen Trick tun: Laden Sie 8 1 Bit pro Pixel Texturen als eine 8-Bit Alpha-only Textur (Bild 1 wird in Bit 1 geladen, Bild 2 in Bit 2 usw.) Sobald Sie das getan haben, können Sie jede der Untertexturen mit dem Alpha-Test "ansprechen" Feature und ein bisschen Textur Umgebungsprogrammierung, um Alpha in eine Farbe zu verwandeln.

Dies wird nur funktionieren, wenn Sie 8 1 Bit pro Pixel Texturen und knifflig, um richtig zu bekommen.

+0

Die 8 Texturen Trick klingt interessant, aber es ist nicht wirklich das, wonach ich suche. Ich benutze das OpenGL, um Daten von meiner Anwendung zu visualisieren, also würde ein solcher Trick den Standardbetrieb auf dem Array verlangsamen (ganz abgesehen von Programmierkomplikationen). –

13

Nach einigen Recherchen konnte ich die 1-Bit-pro-Pixel-Bild als Textur mit dem folgenden Code machen:

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); 

und hier ist das Ergebnis:

enter image description here

+0

Schön! Haben Sie seine Leistung mit der Variante mit 1 Byte pro Pixel verglichen? –

+0

Es scheint nicht, dass Sie diese Textur klemmen können, ohne die Form zu ändern. Ich versuchte nur, die grenzüberschreitenden Blutungen loszuwerden. – Kaliber64

+0

Ich habe gefunden, das interne Format zu 'LUMINANCE' zu tauschen erzeugt die gleichen Bilder mit einem Viertel des Speichers. Wenn es irgendwelche Formate kleiner gibt würde ich interessiert sein. Wie bekomme ich S3TC-Formate? Ich glaube nicht, dass pyOpenGL diese Erweiterungen hat. – Kaliber64