Devo usar texturas sem tamanho para uma potência de 2?

40

Nos primeiros dias do OpenGL e DirectX, os tamanhos das texturas eram exigidos para poder de dois. Isso significava que a interpolação dos valores de flutuação poderia ser feita muito rapidamente, usando deslocamento e coisas do tipo.

Desde o OpenGL 2.0 (e antes disso, por meio de uma extensão), são suportadas dimensões de textura que não são duas em duas.

As texturas com potência de duas têm vantagens de desempenho em modernas GPUs integradas e discretas? Quais são as vantagens das texturas sem poder de duas?

Uma população significativa de desktops possui placas que suportam texturas que não são de duas?

Vai
fonte
Veja esta excelente resposta a uma pergunta semelhante: Por que as imagens para texturas no iPhone precisam ter duas dimensões de potência?
Dvole

Respostas:

15

Há vantagens de desempenho em usar texturas com poder de duas em GPUs modernas integradas e discretas?

A maioria das GPUs modernas suporta texturas sem energia de duas (NPOT) e as manipula bem. Queda de desempenho é muito pouco. Mas há alguns problemas a serem considerados:

  • Ao usar a textura NPOT, ocupa mais espaço na RAM, assim como a textura POT do próximo tamanho. Tecnicamente, você desperdiça o espaço que poderia ser usado para colocar algo lá;

  • As texturas NPOT podem ser tratadas visivelmente mais lentas (no OpenGL 2.1, tive uma queda de desempenho de até 30%) em comparação com o POT do próximo tamanho;

  • GPUs mais antigas e GPUs on-board / on-chip não são tão avançadas, geralmente suportam texturas NPOT, mas o suporte é bastante lento e desajeitado;

  • GPUs ainda mais antigas podem se recusar a aceitar / exibir texturas NPOT;

  • Pode haver artefatos de borda causados ​​pela interpolação do mapa mip; sua textura de 25 x 25 pode ter uma margem preta onde os pixels foram adicionados para preenchê-lo no tamanho de 32 x 32.

PS: Não sei ao certo sobre dispositivos móveis; pode haver ainda mais restrições em relação às texturas de POT.

Quais são as vantagens das texturas sem poder de duas, se houver?

Tanto quanto eu sei, existem apenas 2 vantagens:

  • Eles ocupam menos espaço no disco rígido se não estiverem embalados (quando as áreas vazias embaladas oferecem muito pouco acréscimo)
  • Você pode economizar tempo escrevendo o conversor NPOT -> POT. Você precisará de um para a versão de lançamento, mas o uso de texturas NPOT para projetar e criar protótipos de interfaces / modelos é bom.

Existem grandes populações de usuários de desktop que não possuem placas que suportam texturas que não sejam de duas?

Tanto quanto eu sei e testei no PC - Sim. Isso inclui uma porcentagem maior de GPUs de queda de velocidade / bugs menores e uma porcentagem menor de placas que não suportam NPOT.

Kromster diz apoio Monica
fonte
6

Um uso comum de texturas sem poder de duas é para renderizar 'texturas de tamanho de tela' ou 'de meia tela' (e assim por diante) (e assim por diante) () e texturas de destino usadas para efeitos de pós-processamento.

Nesses casos, os mipmaps não são necessários, o buffer é sempre descompactado; portanto, tamanhos de textura ímpares causam menos problemas aqui

bluescrn
fonte
4

Havia limitações para texturas NPOT em hardware mais antigo. Conforme mencionado neste wiki do OpenGL , alguns hardwares mais antigos exigem que os NPOTs não possuam mipmaps, as texturas compactadas exigem o alinhamento de 4x4 pixels, mas o novo hardware deve lidar com isso perfeitamente.

Na minha experiência, alguns hardwares relativamente novos experimentam um grande impacto no desempenho se você usar texturas NPOT em vez de POTs. Não sei qual é o problema; é possível que em alguma combinação de estados de renderização, a renderização seja realmente feita em software. Portanto, a menos que você tenha boas razões, eu recomendaria ainda tentar usar os POTs o máximo possível.

Por que usar NPOTs em vez de POTs - se você tiver imagens com dimensões de NPOT, por exemplo, 1600x1200, usar uma superfície de pixel de 2048x2048 desperdiçará muita memória de vídeo.

Jari Komppa
fonte
3
Se você estiver usando formatos de textura compactados na memória (PVR ou DXT, por exemplo), a expansão para a próxima potência de dois usará significativamente menos memória de textura do que uma textura NPOT descompactada, mas menor.
Tétrada
3
Sua redação é um pouco vaga, desculpe se isso é redundante com o que você está tentando dizer - as texturas compactadas ainda exigem tamanhos de pixel em múltiplos de 4, mesmo em hardware moderno que suporta texturas NPOT.
11
Eu esperaria que o hardware atual ainda seja texturas lado a lado / swizzling nos drivers quando você os carregar. Isso altera o layout da textura para tornar o acesso mais ideal para o hardware. Os consoles (não estou incluindo o XNA nisso) exigem que você execute manualmente essa otimização de layout em sua própria cadeia de ferramentas, tenho certeza de que eles funcionam apenas no POW2.
Roger Perkins
-1

o poder de 2 texturas aumenta o desempenho em cerca de 30% para qualquer tipo de GPU, não apenas as GPUs antigas (30% mais rápida é a diferença entre uma GPU de ponta e uma média), elas consomem 30% mais RAM, mas menos vram é necessário, melhoram a qualidade por fornecendo tamanho de textura adequado para distância específica, ele funciona como anti-aliasing para texturas. O artefato de linha escura deve ser tratado pelos mecanismos de jogo e os mecanismos aaa os tratam bem

yusef ghatavi
fonte
Isso só fornece uma vantagem (já especificado) de texturas poder-de-dois, não não aborda a questão em si, razão pela qual você usaria não texturas -power-de-dois, dadas as vantagens acima.
Josh
desculpe eu não entendi a pergunta, por potência de 2 você está restrito a 2048, 1024, 512, etc, provavelmente, esta é a principal razão
yusef ghatavi
Também não potência de 2 são úteis para a textura que não precisa de mipmaps, como texturas e texturas para personagem primeira pessoa gui que sempre está perto de câmera
yusef ghatavi
-3

Minha arte de programador é apenas do tamanho correto.

Certamente simplifica minha lógica de exibição ao saber que, se eu quiser definir uma textura no canto superior esquerdo da tela, posso definir 0,0 como o canto superior esquerdo da textura e ver toda a textura no local correto. se eu tivesse que adicionar preenchimento 0alpha, posicionar a textura contra a borda da tela seria mais complexo. Além disso, é claro, que 0alpha ainda precisa ser alfa combinado, e se eu estiver olhando para texturas opacas, talvez prefira não ter um canal alfa.

DeadMG
fonte
6
Geralmente, posiciona-se polígonos, não texturas, na tela. Os polígonos podem receber os UVs necessários - eles não precisam necessariamente ir de 0 a 1; se sua textura tiver apenas 30 de largura, é bom ir para 0,9375 (outra razão pela qual as texturas POT são boas - os UVs são exatamente representáveis).