Qual é o tamanho ideal de textura?

12

Recentemente, adicionei um empacotador de textura ao meu projeto que compacta uma certa quantidade de texturas em uma única, como esta:

Textura embalada

Assim, por exemplo, este tem 582x1023 pixels de tamanho. O objetivo de adicionar essas texturas compactadas era obviamente melhorar o desempenho, então eu queria procurar o tamanho ideal de textura para texturas OpenGL (usando LWJGL). O que descobri foi que um tamanho máximo de textura com suporte amplo parece ser 1024x1024, de acordo com isso, por exemplo. Isso me parece estranho, porque obviamente muitas texturas soariam maiores que isso, então o que acontece com elas? Tenho certeza de que a maioria das placas gráficas suporta texturas maiores que isso. Posso razoavelmente esperar que a maioria das placas gráficas manipule, por exemplo, texturas de 4096 x 4096 (ou talvez até maiores que isso)?

Para chegar ao meu segundo ponto (espero que isso ainda conte como uma pergunta, mas se resume basicamente ao mesmo problema): as texturas devem ser dimensionadas com uma potência de 2 (256x256, 512x512, 1024x1024, 2048x2048, ..) e devem Almofada texturas compactadas menores que isso para o próximo poder de 2? De acordo com essa pergunta de 2011, não é um requisito, mas pode melhorar o desempenho e evitar pequenos erros, e este de 2012 diz que você definitivamente deve preencher as texturas. Portanto, percebo que essas perguntas já foram feitas antes, mas são razoavelmente datadas para que as respostas mudem e, além disso, cada uma delas responde parcialmente à minha pergunta. Como outros projetos / lidam com isso?

TL; DR: Quais tamanhos de texturas posso esperar para a maioria das placas gráficas? Quais são os tamanhos ideais de textura (ou existem)? Devo preencher a largura das texturas até a próxima potência de 2?

lua de mel
fonte
4
A GPU lida apenas com potências de 2. Se você não preencher manualmente suas texturas, a GPU (ou seu mecanismo de jogo preferido) faz isso por você, resultando em um pequeno atraso no tempo de execução por textura, o que pode aumentar. No entanto, não posso oferecer ajuda nos tamanhos máximo / ideal de textura.
Ketura
@ketura Ah eu vejo, obrigado. Digamos que eu tenha uma imagem de 513x10. Seria mais rápido colocar 1024x1024 e depois transferir todos esses pixels vazios ou deixar a GPU fazer isso?
Flotothemoon
4
Você não precisaria ir tão alto. 1024 x 16 funcionaria; não precisa ser QUADRADO, apenas uma potência de 2 em cada direção. Embora, nesse caso, eu consideraria seriamente se não pudesse poupar um pixel e reduzi-lo a 512x16, lol.
Ketura

Respostas:

6

Vou dar uma facada em responder a isso, apesar de YMMV. Uso a Pesquisa de hardware do Steam ( http://store.steampowered.com/hwsurvey?platform=pc ) para determinar qual é a RAM de vídeo (VRAM) disponível na maioria dos computadores. Olhando para os resultados de 13/10/2015 (hoje), quase 85% das pessoas têm 1024 MB de VRAM.

Sua pergunta é muito ampla, pois não indica o hardware de destino (console, PC, dispositivo portátil, dispositivos móveis?) Vou falar sobre PCs e você pode extrapolar para outras plataformas com base nas especificações de hardware.

Assumindo 32 bits de cor + alfa por pixel, ou seja, 4 bytes por pixel, a VRAM de 1 GB pode conter no máximo ~ 256 milhões de pixels. Isso equivale a 256 texturas de 1K por 1K. Isso pressupõe (incorretamente) que você deseja manter apenas texturas na sua VRAM, enquanto haverá várias outras coisas (por exemplo, dados de malha, se você estiver trabalhando em 3D) para as quais você precisa deixar espaço. Você provavelmente também deseja permitir mais espaço para o mapeamento mip de texturas, o que geralmente funciona melhor se suas texturas são potências de dois.

Os consoles modernos (XBOX One e PS4) têm 4-8 GB de RAM unificada, a maioria dos dispositivos portáteis e dispositivos móveis têm de 1 a 2 GB de RAM unificada, com restrições sobre o quanto você pode alocar como VRAM.

Normalmente, eu criava texturas 2K para que funcionasse na maioria dos PCs, permitindo a opção de diminuir a escala para dispositivos de ponta. Se você estiver escrevendo um jogo em 2D e quiser direcionar telas de alta resolução (4K, iPad retina, etc), poderá usar texturas 4K em segundo plano, mas para a maioria das outras partes, pode ser um exagero.

Espero que isso tenha ajudado e não tenha turvado as águas.

Vijay Varadan
fonte
Obrigado pela resposta, definitivamente ajuda. Quanto à amplitude, desculpe por isso, esqueci de incluir alguns detalhes: estou desenvolvendo para PCs em 2D. O que aconteceria se você usasse texturas maiores que o tamanho máximo de textura suportado? Não funciona ou fica mais lento?
Flotothemoon
1
Parece que minha resposta foi imediata. Verificar as postagens em outros fóruns do site Texturas em 2k são o que você deve apoiar para que seu jogo funcione na maioria dos dispositivos. O limite do tamanho da textura depende do hardware específico e da versão específica do OpenGL-ES. Não tenho certeza de qual seria a mensagem de erro específica, mas ela viria do OpenGL-ES quando você tentasse carregar a textura. Links úteis: answers.unity3d.com/questions/563094/… , forum.unity3d.com/threads/texture-sizes-and-videocards.281422 e feedback.wildfiregames.com/report/opengl/feature/…
Vijay Varadan
Quando tento carregar ou tentar vincular a textura? Ou é a mesma coisa aqui?
Flotothemoon 17/10/2015