Qual é a melhor maneira de mostrar imagens grandes em OpenGL
Pergunta
Eu tive esse problema algumas vezes. Digamos que eu queira exibir uma tela inicial ou algo em um contexto OpenGL (ou DirectX para que o assunto, é mais de uma coisa conceitual), agora, eu poderia ou apenas carregar uma textura 2048x2048 e esperança de que a placa gráfica vai lidar com -lo (a maioria vai hoje suponho), mas crescente com o cartão da velha escola gráfica Eu tenho essa má consciência inclinando-se sobre mim e me dizendo que eu não deveria usar texturas que grande.
O que é a forma preferida hoje em dia? É apenas para empinar aquela coisa na memória de vídeo, azulejo-lo, ou deixar que o CPU fazer o trabalho e glDrawPixels? Ou algo mais elaborado?
Solução
Se esta é uma imagem único quadro respingo sem animações, então não há nenhum dano usando glDrawPixels
. Se o desempenho é crucial e você é obrigado a usar uma textura, então a maneira correta de fazê-lo é determinar em tempo de execução, o tamanho máximo suportado textura, usando uma textura proxy.
GLint width = 0;
while ( 0 == width ) { /* use a better condition to prevent possible endless loop */
glTexImage2D(GL_PROXY_TEXTURE_2D,
0, /* mip map level */
GL_RGBA, /* internal format */
desiredWidth, /* width of image */
desiredHeight, /* height of image */
0, /* texture border */
GL_RGBA /* pixel data format, */
GL_UNSIGNED_BYTE, /* pixel data type */
NULL /* null pointer because this a proxy texture */
);
/* the queried width will NOT be 0, if the texture format is supported */
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
desiredWidth /= 2; desiredHeight /= 2;
}
Uma vez que você sabe o tamanho máximo textura apoiado por driver OpenGL do sistema, você tem pelo menos duas opções se sua imagem não se encaixa:
- Imagem azulejos : uso múltiplo quads depois de dividir a sua imagem em pedaços suportados menores. azulejos imagem para algo como uma tela inicial não deve ser muito complicado. Você pode usar glPixelStorei 's
GL_PACK_ROW_LENGTH
parâmetro para seções de carga de uma imagem maior em uma textura. - Imagem redimensionamento : redimensionar a imagem para caber o tamanho máximo suportado textura. Há ainda uma função GLU ajudante para fazer isso por você, gluScaleImage .
Outras dicas
Eu não acho que há uma função interna de OpenGL, mas você pode encontrar uma biblioteca (ou escrever a função de si mesmo) para quebrar a imagem em pedaços menores e, em seguida, imprimir para a tela os pedaços menores (128x128 telhas ou similar).
Eu tive problema com isso usando Slick2D para um jogo Java. Você pode conferir sua classe "BigImage" para idéias aqui .