Saya telah melihat ke dalam tekstur PowerVR, dan telah mengalami beberapa tekstur yang ternyata 2 bit per-pixel. Ini, terus terang, mengejutkan pikiran saya. Bagaimana cara mendapatkan perlindungan warna yang layak bahkan setengah jalan saat Anda hanya memiliki 4 kemungkinan status per pi per piksel? Saya akan senang sumber daya di luar sana yang berbicara tentang kompresi di balik prestasi semacam itu. Terima kasih!
textures
compression
Toji
sumber
sumber
Jawaban:
Pengkodean PVRTC 2BPP, seperti yang diperkenalkan dalam makalah ini membagi gambar menjadi blok 8x4-texel, dan mengkompres setiap blok sedemikian sehingga hanya dua warna RGB yang disimpan untuk setiap tiga puluh dua blok texel.
Tidak satu pun dari tiga puluh dua texel yang menyimpan warna sendiri - masing-masing texel hanya menyimpan informasi tentang bagaimana memadukan dua warna RGB dari blok 8x4-texel-nya.
Jika gambar sumber memiliki blok texel 8x4 dengan pelangi 32 warna di dalamnya, kompresi PVRTC 2BPP akan melakukan pekerjaan yang sangat buruk dalam mempertahankan kualitasnya, karena dalam PVRTC 2BPP setiap blok texel 8x4 hanya memiliki dua warna RGB untuk disatukan.
sumber
Kompresi tekstur tidak memampatkan piksel. Ini memampatkan blok piksel. Ketika satu piksel dirujuk, GPU menghitung blok mana yang mewakili piksel tersebut. Kemudian memproses seluruh blok untuk mendapatkan warna piksel itu.
Sebuah contoh
Mari kita asumsikan ukuran blok 4x4 piksel pada tekstur RGB. Terkompresi, setiap blok mengkonsumsi
4x4x3 = 48
byte dalam memori tekstur.Sekarang algoritma kompresi akan menghitung rata-rata untuk setiap saluran (RGB) dan menyimpannya dengan blok (3 byte). Sekarang mari kita beri setiap pixel 2 bit untuk menyesuaikan rata-rata sehingga pixel lebih dekat ke warna aslinya. Itu
4x4x2x3/8 = 12
byte lain .Total byte yang digunakan oleh kompresor yang baru ditemukan ini adalah 15 byte per blok, rasio kompresi 31,25%.
Kompresor mitos saya menggunakan 7,5 bpp. Itu tidak sebagus yang dapat dicapai oleh 2 bpp pvrtc, tetapi sekarang Anda memiliki gagasan kasar tentang bagaimana 2 bbp dapat dicapai.
pembaruan:
Saya baru saja melihat halaman wikipedia untuk pvrtc . Sepertinya pvrtc tidak menggunakan kompresi berbasis blok tradisional. Berikut ini adalah kertas yang menjelaskan cara kerja kompresi berbasis blok dan bagaimana pvrtc berbeda. Catatan khusus: Filter berbasis blok dapat menghasilkan gambar tampak layak menggunakan 4bpp (tanpa alfa), sedangkan nvrtc dapat melakukannya dengan 2bpp.
sumber
@Toji, situs di mana makalah ini sedikit temperamen tetapi berhasil untuk saya pagi ini. Gagal itu, jika Anda memiliki akses ke ACM / SIGGRAPH, itu di-host di sini . Anehnya, itu adalah juga pada IMG / website pengembang PowerVR (pendaftaran gratis) tapi aku tidak bisa menemukan bagian kanan. :-(
[PEMBARUAN] Masih ada di situs IMG di sini [/ PEMBARUAN]
@ bmcnet: PVRTC tidak memecah tekstur menjadi blok-blok seperti, katakanlah, ETC atau S3TC. FWIW, saya melakukan percobaan dengan tekstur berbasis blok tetapi saya tidak bisa menemukan cara untuk mengemas data yang cukup ke dalam blok mandiri dan masih mendapatkan hasil yang saya inginkan. Sebaliknya, ini sedikit lebih dari sistem kompresi tekstur 'global'. Ini memiliki 2 gambar resolusi rendah yang bilinearly meningkat ke target res, dan kemudian mencampurnya bersama-sama pada basis texel-by-texel.
sumber