Pergunta

Eu estou tentando mover meu código de Java para C, e eu encontrou um problema ao tentar encontrar uma função em C que pode levar um array de inteiros e criar um bitmap a partir dele para OpenGL. Em Java, eu usei

bitmap = Bitmap.createBitmap( {int array name} , w, h, Config.RGB_565);

Existe uma função semelhante que eu possa usar em C, ou uma solução alternativa que eu poderia usar?

Além disso, se isso realmente importa, eu estou programando para o Android.

Obrigado!

Foi útil?

Solução

Eu não sou especificamente familiarizado com o Android, mas se eu me lembro por ligações OpenGL C corretamente não há nenhuma estrutura de Bitmap. Em vez disso a várias funções de mapa de bits (isto é glBindTexture()) apenas tomar ponteiros GLuint (o C equivalentes de uma matriz).

Em Java tudo é uma classe para que o bitmap tem uma classe associada a ela, mas a classe bitmap é principalmente apenas um invólucro (e algumas funções) para a matriz int que realmente contém a sua imagem.

OpenGL especificamente, muitas vezes ligam-se uma matriz com o glBindTexture função , e depois outras funções textura levar o nome ele é obrigado a fazer referência ao 'estado' correta para OpenGL.

Por outro lado, se você está tentando curto-circuito deste processo, você sempre pode usar glTexImage2D

Outras dicas

Eu pesquei através da documentação para BMP formato de um tempo atrás para compor esta Python implementação. Você deve ser capaz de porta isso para C com pouca dificuldade.

A função que você está procurando é simplesmente glTextImage2D(). Ele envia dados a partir de uma matriz em OpenGL. Você especifica os formatos de origem e de destino que você tem e quer, e ele faz o resto.

Use juntamente com glBindTexture() para criar um objeto textura reutilizável armazenados, assim você não precisa fazer o upload dos dados de textura antes de usá-lo cada quadro.

Aqui está o que você precisa:

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA , x_size, y_size, 0, GL_RGBA , GL_UNSIGNED_BYTE, (GLvoid *)your_data );

x_size e y_size deve ser potências de 2. Por este código que você precisa variedade de x_size y_size ints de 4 bytes (ou x_size y_size * 4 bytes). Para testar apenas tentar:

unsigned char data[32*32*4];

for( int i=0; i< sizeof(data); ++i) data[i]=rand();
// Don't forget to #include <stdlib.h>

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA , 32, 32, 0, GL_RGBA , GL_UNSIGNED_BYTE, (GLvoid *)data );

Outros formatos possíveis: GL_BGRA (por ordem de bytes diferente), GL_RGB (se você não tem alpha). Use glGenTextures / glBindTexture para lembrar textura configuração para uso posterior.

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