Melhor formato de imagem (mais popular?) Para texturização [fechado]

13

Ok, estou usando C ++ com OpenGL e vou criar um carregador para carregar texturas para o meu jogo em 3D. (Mas as texturas são 2D). Quero a opção de transparência, mesmo que decida não usá-la. Preciso de qualidade decente, embora não precise ser de primeira qualidade. O que vocês sugerem para o formato (PNG, TGA, etc.). Além disso, talvez seja algo fácil de criar um carregador (não vou usar um já criado). E também, se você tiver links / dicas para ajudar com o carregador, isso seria apreciado.

Brandon oubiub
fonte

Respostas:

15

Não entendo por que você não gostaria de usar um carregador de prateleira. PNG , por exemplo, é uma boa opção para um formato, mas é complexo escrever um carregador de uso geral (e provavelmente não vale a pena escrever um que carregue apenas o subconjunto específico de formatos PNG de seu interesse).

Dado esse requisito um tanto incomum, o TGA é provavelmente a sua melhor aposta. O TGA 2.0 possui um canal alfa e é relativamente simples comparado ao PNG.


fonte
3
+1 para TGA se o OP quiser escrever o seu próprio. Eu escrevi meu próprio carregador TGA uma vez. Tão rápido e indolor.
A Comunista Duck
4
@ Duck: Indolor, desde que você faça TGAs simples sem compactação ou qualquer um dos recursos sofisticados. Se você deseja um carregador TGA totalmente compatível, achei um pouco trabalhoso. É uma espécie de formato estranho.
ZorbaTHut
1
@Zorba, compressões fáceis o suficiente. É apenas se você gosta de extensões ou não.
Deceleratedcaviar
10

O formato da textura da imagem também é uma opção de desempenho. Eu recomendo que você use texturas compactadas, tanto quanto possível. Em plataformas móveis, pode melhorar bastante o desempenho (40% ou mais), uso de memória e carregamento de tempo.

Considere uma textura 1024 * 1024:

  • RGB ou RGBA (16 bits): 2Mo (.5s para carregar no SGS)
  • RGBA (32 bits): 4Mo (1s para carregar no SGS)
  • PVRT (4bpp): 512ko (.125s para carregar no SGS)
  • ETC1 + Alpha: 1.5Mo (.4s para carregar no SGS)

Nos nossos jogos, temos ativos (texturas) em vários formatos:

  • Formato DDS para texturas DXTC (plataformas de desktop: OS X, Linux, Windows e Tegra)
  • Formato DDS para texturas ATC (GPUs Andreno)
  • Formato PVR para o formato PVRT (GPUs PowerVR)
  • Formato PKM para textura ETC1 (todos os dispositivos compatíveis com OGLES 2.0)

Por fim, usamos o formato bruto para compatibilidade, mas isso é para elementos de compatibilidade ou GUI

  • Formato PNG para textura crua. É para texturas RGBA de 16, 24 ou 32 bits (usamos um carregador licenciado pelo MIT). São texturas não compactadas.

As texturas ETC1 não possuem canal alfa, portanto, usamos um sombreador especial com duas texturas (textura rgb e textura alfa). Formato compactado é muito fácil de carregar (100 ou 200 loc).

Na área de trabalho, o DXTC (S3TC) está presente em muitos cartões. Então, você deve usá-lo.

Texturas compactadas

Pró

  • Taxa de preenchimento de textura melhorada
  • Carregamento de textura (4x ou mais)
  • Fácil de carregar

Vigarista

  • Não suportado em todas as plataformas
  • artefatos
Ellis
fonte
6
Há uma grande diferença entre as texturas compactadas na placa de vídeo (por exemplo, DXTC) e as texturas que são compactadas apenas enquanto armazenadas e devem ser descompactadas durante o carregamento (por exemplo, PNG). O carregamento do PNG será mais lento do que uma textura não compactada, pois ela deve ser descompactada primeiro. Eles são um tamanho de arquivo menor, sim, mas a quantidade de memória gráfica consumida é a mesma.
jhocking 22/09
8

Texturas são coleções de uma ou mais imagens. Isso significa que uma textura pode ser representada por um TGA ou PNG, mas nenhum formato é capaz de representar todos os recursos possíveis das texturas. Por quê?

Porque cada um só pode conter uma única imagem. Não há mipmaps. Não há texturas 3D possíveis. Sem texturas de matriz. Nenhum cubemaps. Cada um desses arquivos é apenas uma única imagem 2D. Eles podem fazer parte de uma textura, mas, a menos que você não esteja usando o mipmapping (e eu recomendo fortemente não usar mipmaps, a menos que você tenha necessidades específicas), um único arquivo de imagem nesses formatos não poderá ser uma textura.

Eles são bons formatos de imagem, mas produzem formatos de textura ruins .

O DDS é o líder dos formatos de textura, porque realmente suporta as necessidades de texturas. Ele suporta mipmaps e cubemaps. Ele suporta texturas 3D. O DDSv10 suporta texturas de matriz. Você pode empacotar uma única textura dentro de um DDS de uma maneira que não poderia com PNG ou TGA.

O DDS suporta dados de textura não compactados e compactados. Desde que o formato de textura compactado seja um dos formatos de textura DXT / BC.

O PKM é útil para empacotar imagens compactadas pelo ETC1, mas, como no PNG, não suporta recursos de textura reais.

Os arquivos PVR parecem ser o equivalente móvel do DDS (embora, por que eles não pudessem usar apenas o DDS, eu não sei). Eles suportam várias técnicas de compactação, mas não possuem recursos avançados do DDSv10, como texturas de matriz, além de suporte de textura 3D.

Portanto, o DDS vence em termos de suporte abrangente à textura.

Nicol Bolas
fonte
2
Falando exclusivamente em recursos, o TIFF suporta tudo o que o DDS faz e muito mais. Deseja uma textura com canais IR distante, IR próximo, R, G, B e UV, além do Alpha? Em ponto flutuante IEEE de 64 bits por canal? Comprimido por qualquer um de vários algoritmos (incluindo JPEG e JPEG2000) como adequado para o canal? Com várias imagens por arquivo e metadados avançados para cada uma delas? Pode fazer tudo isso e muito mais. É também o formato "nativo" do Photoshop há algum tempo. Agora, como para escrever um carregador para ele ...
Martin Sojka
Permita-me adicionar mais informações sobre o requisito de usar apenas o formato de textura DXT / BC no contêiner DDS; Parece que não é o caso. Eu já vi o Compressonator usando vários formatos de compactação e saída como .dds para todos (pode ver essa dica da saída da ajuda ao executar seu cli) e [this] (resposta) no SO dizendo que você pode usar qualquer formato de compactação (definindo FourCC diferente então nos cuidamos).
haxpor
1
@haxpor: Você pode enfiar o que quiser em um arquivo e chamá-lo de DDS. A questão é: um aplicativo que pode ler arquivos DDS normais poderá ler o seu ou precisará ser especialmente codificado para isso? O formato DDS especifica apenas os formatos de compactação DXT / BC (e suponho que o ASTC atualmente). O que acontece se você usar outro formato está entre o programa que está gravando e o programa que está lendo. Mas isso é verdade para praticamente qualquer formato de imagem.
Nicol Bolas
@NicolBolas Obrigado por resumir. Eu acho que é isso.
haxpor
5

O Khronos Group recomenda o formato de arquivo KTX para armazenar texturas para aplicativos OpenGL e OpenGL ES. Você pode usar a libktx para trabalhar com este formato.

Recursos:

  • Instanciar uma textura OpenGL a partir de um arquivo KTX
  • Descompacte uma imagem de textura compactada ETC1 quando o hardware não tiver suporte para ETC1.
  • Construa uma tabela de hash de pares de valores-chave a partir do arquivo KTX conforme a textura é carregada
  • Escreva um arquivo KTX a partir de uma matriz de imagens de origem e uma tabela de hash opcional de pares de valores-chave.
  • Construa e preencha uma tabela de hash de pares de valores-chave.
KindDragon
fonte
3

Parece que o DDS (DirectDraw Surface) é a escolha mais popular para texturas no momento. É tem diferentes formatos de pixel, transparência e compactação. É suportado no OpenGL através da extensão GL_ARB_texture_compression.

Por exemplo, há um carregador OpenGL aqui .

mrbinary
fonte
Sua resposta é redigida um pouco confusa. Não faz sentido dizer que o DDS é suportado no OpenGL. O OpenGL não lida com formatos de imagem.
Rdb
3

Há várias considerações aqui:

  1. Quão rápido você pode tirar a textura do disco e entrar na memória do sistema.
  2. Com que rapidez você pode obter a textura da memória do sistema para a GPU (via glTexImage2D no seu caso).
  3. Quanto espaço em disco e armazenamento em RAM de vídeo está no seu orçamento.
  4. Desempenho e qualidade.

O TGA é uma boa escolha, porque nos casos descompactados de 24 e 32 bits, você pode ler os dados em um único tamanho / píxeis e enviar o resultado diretamente através do glTexImage2D sem processamento adicional. É uma péssima escolha, pois pode ter o maior tamanho de arquivo e, se a E / S do disco for um gargalo, suas leituras serão lentas.

PNG é uma boa opção, pois preserva a qualidade das imagens com um tamanho de arquivo razoavelmente pequeno. É uma má escolha porque os PNGs podem demorar a descomprimir - se esse for o seu gargalo -, você sabe.

O JPG é uma boa opção, pois geralmente possui o menor tamanho de arquivo e sai do disco muito rápido (duplamente bom se você precisar enviar o arquivo pela rede). É uma má escolha devido às etapas intermediárias de descompressão de software e perda de qualidade (embora você possa ajustar as configurações de qualidade para atenuar isso). Nenhum canal alfa também.

DDS (ou outros formatos compactados) são boas opções devido ao tamanho menor do arquivo e à capacidade de incluir uma cadeia de mipmap pré-construída. Se for um formato que é nativamente suportado em hardware (e o DDS é suportado nativamente na maioria dos hardwares para PC de consumo - também já existe há muito tempo), você obtém o mesmo benefício que o TGA - um pouco, um cutucão no cabeçalho para descobrir algumas propriedades da imagem e envie os dados diretamente, sem etapas intermediárias. Texturas compactadas também tornarão o seu programa mais rápido e usarão menos RAM de vídeo. São más escolhas porque usam compactação com perdas (que às vezes pode ser realmente perceptível) e podem não ser suportadas em todo o hardware.

Se fosse eu, eu criaria suporte para todos esses 4 formatos (TGA e DDS são bastante triviais para escrever carregadores, com JPG e PNG eu usaria uma biblioteca de imagens) para que os criadores de conteúdo possam escolher o formato mais adequado em por textura.

Maximus Minimus
fonte
1
"O DDS é suportado nativamente na maioria dos hardwares de PC de consumo" O DDS é um contêiner para diferentes formatos. Você não passa um arquivo DDS para uma GPU, mas seu conteúdo!
Tara
0

E, é claro, você sempre pode usar o antigo BMP de 32 bits, que é realmente fácil de carregar (especialmente se o tamanho for uma potência de 2 (na verdade, um múltiplo de 8 bytes IIRC)).

Caso contrário, parece estranho que você queira apenas um formato, o jpg é muito legal para texturas de alta resolução no mundo real (o jpeg se maravilha com o espaço em disco e os tempos de carregamento (para baixo)), png para a transparência e o ocasional BMP de 32 bits para as texturas de controle (fácil de criar a partir de um script ou de uma ferramenta 'rápida e suja').

Valmond
fonte