Pergunta

É possível bombear monocromático (dados gráficos com profundidade de imagem 1 bit) textura em OpenGL?

Atualmente estou usando o seguinte:

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

Eu estou bombeá-lo com matriz quadrada de 8 bits inteiros sem sinal em modo GL_LUMINANCE (um canal 8 bit representa o brilho de todos os canais 3 e alfa cheio), mas é IMO vastamente ineficaz, porque os valores onlu na matriz são 0x00 e 0xFF.

Can I (e como) simples uso de um bit por matriz de pixels de booleanos em vez de alguma forma? Os retarda de tamanho da matriz em excesso para baixo quaisquer outras operações na matriz: (

Foi útil?

Solução

O menor textura-formato não comprimido para imagens de luminância usa 8 bits por pixel.

No entanto, 1 bit por pixel imagens podem ser comprimidos sem perda para o formato S3TC ou DXT. Este ainda não será 1 bit por pixel, mas em algum lugar entre 2 e 3 bits.

Se você realmente precisa de 1 bit por pixel você pode fazê-lo com um pequeno truque. Carregar 8 1 bit por texturas de pixel como uma de 8 bits alfa somente textura (imagem 1 é carregado para o bit 1, imagem 2 no bit 2 e assim por diante). Depois de ter feito que você pode "endereço" cada uma das sub-texturas usando o recurso de alfa-teste e um pouco de programação ambiente textura para transformar alfa em uma cor.

Esta vontade de só trabalhar se você tem 8 1 bit por texturas de pixel e complicado de acertar embora.

Outras dicas

Depois de alguma pesquisa, eu era capaz de tornar o 1-bit imagem pixel por como uma textura com o seguinte 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);

e aqui está o resultado:

enter descrição da imagem aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top