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?
Respostas:
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:
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.
fonte
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
fonte
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.
fonte
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
fonte
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.
fonte