Pergunta

Eu preciso exibir imagens 2D em OpenGL usando texturas.
As dimensões da imagem não são necessariamente potências de 2.
Pensei em criar uma textura maior e restringir a exibição para a parte que eu estava usando, mas os dados de imagem serão compartilhadas com openCV então eu não quero copiar dados de um pixel de cada vez em uma textura maior.

EDIT -. Verifica-se que mesmo o mais simples Intel na placa gráfica no Windows suporta texturas nenhum poder-de-2

EDIT2 - e mesmo se você não tem tamanho arb textura, em seguida, fazer a sua imagem menor e rescaling ao tamanho da janela é muito rápido mesmo em hardware low-end

Foi útil?

Solução

Um par de extensões GL vêm à mente. Ter um olhar para GL_ARB_texture_rectangle (se você não precisa mipmapping) ou GL_ARB_texture_non_power_of_two (se você faz).

Outras dicas

Uma armadilha para evitar é que, por alguma razão, alguns cartões requerem GL_UNPACK_ALIGNMENT de vídeo para ser definido como um (glPixelStorei (GL_UNPACK_ALIGNMENT, 1);). Para não poder-de-dois da textura para ser colocado correctamente

Se eu posso apenas acrescentar para quem vem através desta na mais futuro- da documentação e tutoriais / exemplos que você encontrar na web sobre OpenGL é de muitos anos fora da data, incluindo o material nehe.gamedev, e vai levar você a acreditar que coisas como tamanhos textura não-poder-de-dois são um problema quando eles realisticamente não são, ou encorajá-lo a usar a longo desde funções OpenGL obsoletos, ou bibliotecas que não foram atualizados por uma década.

Em primeiro lugar, videocards mais modernos realmente apoiar textura dimensões que são não-quadrado e não-poder-de-dois tamanho. Mas, para o máximo de compatibilidade, usando apenas o poder de duas texturas é provavelmente recomendado.

Começar por determinar a potência mais próxima de dois que é maior para cada uma das dimensões da imagem (largura e altura) e criar uma textura de que o tamanho. Então você tem duas opções. O primeiro é fazer um redimensionamento dos dados de pixel software para ajustar a imagem, e, em seguida, o tamanho do seu quad acordo com a razão de aspecto original quando você precisa para exibi-lo. Ou, você pode simplesmente preencher parte da textura com os dados de imagem e colocar pixels transparentes no resto.

Se você quiser usar o poder de 2 texturas, criar o menor que pode levar até a sua imagem, e calcular coordenadas adequadas textura para exibir apenas a parte da textura contendo sua imagem. Por exemplo. Se sua imagem for 400x300, você pode usar uma textura de 512x512, copie sua imagem ali linha por linha, e sua textura certa coordenar seria 400,0 / 512,0, o inferior 300,0 / 512,0. Isso vai ficar melhor do que no dimensionamento de software.

Eu faço exatamente como você descreve, copiar em uma textura potência de 2 e ajustar o meu uv é em conformidade. Extensões seria bom, mas você não está garantido que eles são suportados em um computador arbitrário.

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