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?

Foi útil?

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 .

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