Como você obtém cores decentes de 2BPP?

11

Eu estive pesquisando texturas do PowerVR e encontrei várias texturas que aparentemente são 2 bits por pixel. Isso, francamente, confunde minha mente. Como obter preservação de cores decente pela metade, quando você tem apenas 4 estados possíveis por pi por pixel? Eu adoraria quaisquer recursos por aí que falem sobre a compressão por trás de tal feito. Obrigado!

Toji
fonte
Com JPG, você pode obter uma cor decente com sob 1bpp :)
Ivan Kuckir

Respostas:

13

A codificação PVRTC 2BPP, conforme apresentada neste documento, divide uma imagem em blocos de 8x4-texel e compacta cada bloco de modo que apenas duas cores RGB sejam armazenadas para cada trinta e dois blocos de texel.

Nenhum dos trinta e dois texels armazena uma cor própria - cada texel armazena apenas informações sobre como se misturar entre as duas cores RGB de seu bloco 8x4-texel.

Se a imagem de origem tiver um bloco texel 8x4 com um arco-íris de 32 cores, a compactação PVRTC 2BPP fará um trabalho muito ruim para manter sua qualidade, porque no PVRTC 2BPP cada bloco texel 8x4 tem apenas duas cores RGB para combinar.

bmcnett
fonte
Fascinante! Muito obrigado. Infelizmente, estou tendo muitos problemas para carregar o papel ao qual você vinculou. Talvez esteja hospedado no EC2 da Amazon? ;)
Toji
6

A compactação de textura não compacta pixels. Comprime blocos de pixels. Quando um pixel individual é referenciado, a GPU calcula qual bloco representa o pixel. Em seguida, processa todo o bloco para obter a cor desse pixel.

Um exemplo

Vamos supor que o tamanho do bloco seja 4x4 pixels em uma textura RGB. Descompactado, cada bloco consome 4x4x3 = 48bytes na memória de textura.
Agora, o algoritmo de compactação calcula a média de cada canal (RGB) e a armazena no bloco (3 bytes). Agora vamos dar a cada pixel 2 bits para ajustar a média para que o pixel fique mais próximo da cor original. Isso é outro 4x4x2x3/8 = 12bytes.
O total de bytes usados ​​por este compressor recém-inventado é de 15 bytes por bloco, uma taxa de compressão de 31,25%.

Meu compressor mítico usa 7,5 bpp. Isso não é tão bom quanto o pvrtc de 2 bpp pode alcançar, mas agora você tem uma idéia aproximada de como 2 bbp pode ser alcançado.

update:
Acabei de olhar a página da wikipedia para pvrtc . Parece que o pvrtc não usa compactação baseada em bloco tradicional. Aqui está o artigo que descreve como a compressão baseada em bloco funciona e como o pvrtc difere. Nota especial: Os filtros baseados em bloco podem produzir imagens com aparência decente usando 4bpp (sem alfa), enquanto o nvrtc pode fazê-lo com 2bpp.

deft_code
fonte
1

@Toji, o site em que o jornal está é um pouco temperamental, mas funcionou para mim esta manhã. Caso contrário, se você tiver acesso ao ACM / SIGGRAPH, ele será hospedado aqui . Estranhamente, ele também estava no site do desenvolvedor do IMG / PowerVR (registro gratuito), mas não consigo encontrar a seção correta. :-(

[UPDATE] Ainda está no site IMG aqui [/ UPDATE]

@ BMCNET: PVRTC não quebra a textura em blocos como, por exemplo, ETC ou S3TC. FWIW, experimentei texturas baseadas em blocos, mas não consegui encontrar uma maneira de empacotar dados suficientes em blocos independentes e ainda assim obter os resultados desejados. Em vez disso, é um pouco mais de um sistema de compressão de textura 'global'. Ele possui 2 imagens de baixa resolução, que aumentam bilinearmente para a resolução desejada e, em seguida, as misturam em uma base de texel por texel.

Simon F
fonte