2008-11-29 14 views
9

¿Es posible bombear textura monocromática (datos gráficos con 1 bit de profundidad de imagen) en OpenGL?OpenGL y textura monocromática

Actualmente estoy usando esto:

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

estoy bombeo con matriz cuadrada de enteros sin signo de 8 bits en modo GL_LUMINANCE (un canal de 8 bits representa el brillo de los 3 canales y lleno alfa), pero es IMO muy ineficaz, porque los valores onlu en el conjunto son 0x00 y 0xFF.

¿Puedo (y cómo) utilizar una matriz de booleanos simple de un bit por píxel en vez de alguna manera? El tamaño excesivo gama ralentiza cualquier otra operación en la matriz :(

Respuesta

5

El más pequeño sin comprimir la textura de formato para las imágenes de luminancia utiliza 8 bits por píxel.

Sin embargo, 1 bit por imágenes de píxeles puede ser comprimido sin pérdida de el formato S3TC o DXT. Esto todavía no será de 1 bit por píxel, sino de entre 2 y 3 bits.

Si realmente necesita 1 bit por píxel, puede hacerlo con un pequeño truco. Cargue 8 1 bit por píxel texturas como una textura de solo 8 bits alfabéticamente (la imagen 1 se carga en el bit 1, la imagen 2 en el bit 2 y así sucesivamente). Una vez que lo haya hecho, puede "abordar" cada una de las sub-texturas usando la prueba alfa función y un poco de textura programación del entorno para convertir alfa en un color.

Esto funcionará solo si tiene 8 texturas de 1 bit por píxel y es difícil hacerlo bien.

+0

El El truco de 8 texturas suena interesante, pero no es realmente lo que estoy buscando. Estoy usando OpenGL para visualizar datos de mi aplicación, por lo que ese truco podría ralentizar el funcionamiento estándar en la matriz (sin hablar de complicaciones de programación). –

13

Después de algunas investigaciones, era capaz de hacer que la de 1 bit de imágenes de píxeles por como una textura con el siguiente código:

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

y aquí está el resultado:

enter image description here

+0

¡Agradable! ¿Ha comparado su rendimiento con la variante de 1 byte por píxel? –

+0

Parece que no puede sujetar esta textura sin que cambie de forma. Solo estaba tratando de deshacerme del sangrado transfronterizo. – Kaliber64

+0

Encontré intercambiando el formato interno a 'LUMINANCE' produce las mismas imágenes con un cuarto de la memoria. Si hay formatos más pequeños, estaría interesado. Idk cómo obtener formatos S3TC. No creo que pyOpenGL tenga esas extensiones. – Kaliber64