Format Gambar Terbaik (Paling Populer?) Untuk Bertekstur [ditutup]

13

Oke, jadi saya menggunakan C ++ dengan OpenGL, dan saya akan membuat loader untuk memuat tekstur untuk gim 3D saya. (Tapi teksturnya 2D). Saya ingin opsi transparansi, bahkan jika saya memutuskan untuk tidak menggunakannya. Saya perlu kualitas yang layak, meskipun tidak harus menjadi yang terbaik. Apa yang kalian sarankan untuk format (PNG, TGA, dll.). Juga, mungkin membuatnya menjadi sesuatu yang mudah untuk membuat loader (saya tidak akan menggunakan yang sudah dibuat.). Dan juga, jika Anda memiliki tautan / kiat untuk membantu dengan loader, itu akan dihargai.

Brandon oubiub
sumber

Jawaban:

15

Saya tidak mengerti mengapa Anda tidak ingin menggunakan loader di luar rak. PNG , misalnya, adalah pilihan yang baik untuk format tetapi rumit untuk menulis loader tujuan umum (dan mungkin tidak sebanding dengan upaya menulis satu format yang hanya memuat subset spesifik dari format PNG yang Anda pedulikan).

Mengingat persyaratan yang agak tidak biasa ini, TGA mungkin merupakan taruhan terbaik Anda. TGA 2.0 memiliki saluran alpha dan relatif sederhana dibandingkan dengan PNG.


sumber
3
+1 untuk TGA jika OP ingin menulis sendiri. Saya pernah menulis loader TGA saya sendiri. Begitu cepat dan tidak menyakitkan.
Bebek Komunis
4
@Duck: Tidak menyakitkan selama Anda melakukan TGA sederhana tanpa kompresi atau fitur mewah lainnya. Jika Anda ingin loader TGA yang sepenuhnya sesuai, saya merasa sedikit sakit. Ini semacam format yang aneh.
ZorbaTHut
1
@Zorba, kompresi cukup mudah. Hanya apakah Anda peduli dengan ekstensi atau tidak.
deceleratedcaviar
10

Format tekstur gambar juga merupakan pilihan kinerja. Saya menyarankan Anda untuk menggunakan tekstur terkompresi sebanyak mungkin. Pada platform seluler, ini dapat sangat meningkatkan kinerja (40% atau bahkan lebih), penggunaan memori, dan pemuatan waktu.

Pertimbangkan tekstur 1024 * 1024:

  • RGB atau RGBA (16bits): 2Mo (.5s untuk memuat pada SGS)
  • RGBA (32bits): 4Mo (1s untuk memuat pada SGS)
  • PVRT (4bpp): 512ko (.125 untuk memuat pada SGS)
  • ETC1 + Alpha: 1.5Mo (.4d untuk memuat di SGS)

Dalam permainan kami, kami memiliki aset (tekstur) dalam banyak format:

  • Format DDS untuk tekstur DXTC (Platform desktop: OS X, Linux, Windows & Tegra)
  • Format DDS untuk tekstur ATC (GPU Andreno)
  • Format PVR untuk format PVRT (PowerVR GPU)
  • Format PKM untuk tekstur ETC1 (Semua perangkat yang kompatibel dengan OGLES 2.0)

Terakhir, kami menggunakan format mentah untuk kompatibilitas tetapi itu untuk kompatibilitas atau elemen GUI

  • Format PNG untuk tekstur mentah. Ini untuk tekstur RGBA 16, 24 atau 32bits (kami menggunakan loader berlisensi MIT). Ini adalah tekstur yang tidak terkompresi.

Tekstur ETC1 tidak memiliki saluran alfa sehingga kami menggunakan shader khusus dengan dua tekstur (rgb tekstur dan tekstur alfa). Format terkompresi sangat mudah dimuat (100 atau 200 loc).

Di desktop, DXTC (S3TC) hadir di banyak kartu. Jadi, Anda harus menggunakannya.

Tekstur Terkompresi

Pro

  • Isi tekstur meningkat
  • Memuat tekstur (4x atau lebih)
  • Mudah dimuat

Menipu

  • Tidak didukung di semua platform
  • artefak
Ellis
sumber
6
Ada perbedaan besar antara tekstur yang dikompres pada kartu video (mis. DXTC) dan tekstur yang hanya dikompresi saat disimpan dan harus didekompresi saat memuat (mis. PNG). PNG akan lebih lambat memuat daripada tekstur yang tidak terkompresi karena harus didekompresi terlebih dahulu. Mereka adalah ukuran file yang lebih kecil, ya, tetapi jumlah memori grafis yang digunakan sama.
jhocking
8

Tekstur adalah koleksi dari satu atau lebih gambar. Ini berarti bahwa suatu tekstur dapat diwakili oleh TGA atau PNG, tetapi format tidak mampu mewakili semua fitur tekstur yang mungkin. Mengapa?

Karena masing-masing hanya dapat menampung satu gambar. Tidak ada peta jalan. Tidak ada tekstur 3D yang mungkin. Tidak ada tekstur array. Tidak ada cubemaps. Masing-masing file hanya gambar 2D tunggal. Mereka dapat menjadi bagian dari tekstur, tetapi kecuali jika Anda tidak menggunakan mipmapping (dan saya sangat menyarankan agar tidak menggunakan mipmaps kecuali Anda memiliki kebutuhan khusus), satu file gambar dalam format ini tidak dapat berupa tekstur.

Mereka adalah format gambar yang bagus, tetapi mereka membuat format tekstur yang buruk .

DDS adalah yang terdepan dalam format tekstur karena sebenarnya mendukung hal-hal yang dibutuhkan tekstur. Ini mendukung mipmaps dan cubemaps. Ini mendukung tekstur 3D. DDSv10 mendukung tekstur array. Anda dapat mengemas satu tekstur dalam DDS dengan cara yang tidak bisa Anda lakukan dengan PNG atau TGA.

DDS mendukung data tekstur yang tidak terkompresi dan terkompresi. Selama format tekstur terkompresi adalah salah satu format tekstur DXT / BC.

PKM berguna untuk mengemas gambar yang dikompresi ETC1, tetapi seperti dengan PNG, PKM tidak mendukung fitur tekstur yang sebenarnya.

File PVR tampaknya setara dengan DDS (meskipun mengapa mereka tidak bisa menggunakan DDS saja, saya tidak tahu). Mereka mendukung berbagai teknik kompresi, tetapi mereka tidak memiliki fitur DDSv10 canggih seperti tekstur array, serta dukungan tekstur 3D.

Jadi DDS menang dalam hal dukungan tekstur yang komprehensif.

Nicol Bolas
sumber
2
Berbicara murni untuk fitur, TIFF mendukung semua hal yang dilakukan DDS dan banyak lagi. Ingin tekstur dengan saluran IR jauh, IR dekat, R, G, B, dan UV di samping Alpha? Dalam 64 bit IEEE floating-point per saluran? Dikompresi oleh sejumlah algoritma (termasuk JPEG dan JPEG2000) yang sesuai untuk saluran? Dengan banyak gambar per file dan metadata yang kaya untuk setiap gambarnya? Itu bisa melakukan semua ini, dan banyak lagi. Ini juga merupakan format "asli" Photoshop sejak beberapa waktu. Sekarang, untuk menulis loader untuk itu ...
Martin Sojka
Izinkan saya menambahkan lebih banyak informasi tentang persyaratan hanya menggunakan format tekstur DXT / BC di bawah wadah DDS; Sepertinya bukan itu masalahnya. Saya telah melihat Compressonator menggunakan berbagai format kompresi dan output sebagai .dds untuk semua (dapat melihat petunjuk ini dari output bantuan ketika menjalankan cli-nya) dan [ini] (jawaban) pada SO mengatakan bahwa Anda dapat menggunakan format kompresi apa pun (mengatur FourCC berbeda kemudian tangani diri kita sendiri).
haxpor
1
@haxpor: Anda dapat mendorong apa pun yang Anda inginkan dalam file dan menyebutnya DDS. Pertanyaannya adalah, apakah sebuah aplikasi yang dapat membaca file DDS normal dapat membaca milik Anda, atau apakah harus dikodekan secara khusus untuk melakukannya? Format DDS hanya menentukan format kompresi DXT / BC (dan saya kira ASTC saat ini). Apa yang terjadi jika Anda menggunakan format lain adalah antara program menulisnya dan program membacanya. Tapi itu berlaku untuk hampir semua format gambar.
Nicol Bolas
@NicolBolas Terima kasih telah menyimpulkannya. Saya pikir ini dia.
haxpor
5

Grup Khronos merekomendasikan format file KTX untuk menyimpan tekstur untuk aplikasi OpenGL dan OpenGL ES. Anda dapat menggunakan libktx untuk bekerja dengan format ini.

Fitur:

  • Instantiate tekstur OpenGL dari file KTX
  • Dekompres gambar tekstur terkompresi ETC1 ketika perangkat keras tidak memiliki dukungan ETC1.
  • Buat tabel hash pasangan kunci-nilai dari file KTX saat tekstur dimuat
  • Tulis file KTX dari array gambar sumber dan tabel hash opsional untuk pasangan nilai kunci.
  • Membangun dan mengisi tabel hash dari pasangan nilai kunci.
KindDragon
sumber
3

Sepertinya DDS (DirectDraw Surface) adalah pilihan paling populer untuk tekstur saat ini. Apakah memiliki format piksel yang berbeda, transparansi, dan kompresi. Ini didukung dalam OpenGL melalui ekstensi GL_ARB_texture_compression.

Misalnya, ada pemuat OpenGL di sini .

mrbinary
sumber
Jawaban Anda sedikit membingungkan. Tidak masuk akal untuk mengatakan bahwa DDS didukung di OpenGL. OpenGL tidak berurusan dengan format gambar.
rdb
3

Ada sejumlah pertimbangan di sini:

  1. Seberapa cepat Anda bisa mendapatkan tekstur dari disk dan masuk ke memori sistem.
  2. Seberapa cepat Anda bisa mendapatkan tekstur dari memori sistem ke GPU (melalui glTexImage2D dalam kasus Anda).
  3. Berapa banyak ruang disk dan penyimpanan RAM video dalam anggaran Anda.
  4. Performa dan kualitas.

TGA adalah pilihan yang baik karena dalam kasus 24 dan 32 bit yang tidak terkompresi Anda dapat membaca data dalam satu ketakutan tunggal / apa pun dan mengirim hasilnya langsung melalui glTexImage2D tanpa proses lebih lanjut. Ini adalah pilihan yang buruk karena dapat memiliki ukuran file terbesar dan jika disk I / O adalah hambatan maka pembacaan Anda akan lambat.

PNG adalah pilihan yang baik karena menjaga kualitas gambar dengan ukuran file yang cukup kecil. Ini adalah pilihan yang buruk karena PNG bisa lambat untuk didekompresi - jika itu hambatan Anda - yah, Anda tahu.

JPG adalah pilihan yang baik karena umumnya memiliki ukuran file terkecil dan akan keluar dari disk sangat cepat (dua kali lebih baik jika Anda perlu mengirim file melalui jaringan). Ini pilihan yang buruk karena langkah-langkah dekompresi perangkat lunak menengah dan kehilangan kualitas (walaupun Anda dapat menyesuaikan pengaturan kualitas untuk mengurangi ini). Juga tidak ada saluran alpha.

DDS (atau format terkompresi lainnya) adalah pilihan yang baik karena ukuran file yang lebih kecil dan kemampuan untuk memasukkan rantai mipmap prebuilt. Jika itu adalah format yang didukung secara native di perangkat keras (dan DDS secara asli didukung pada sebagian besar perangkat keras PC konsumen - telah lama juga) Anda mendapatkan manfaat yang sama seperti TGA - satu ketakutan, sedikit menyodok di header untuk mencari tahu beberapa properti gambar, lalu kirim data langsung tanpa langkah perantara. Tekstur terkompresi juga akan membuat program Anda berjalan lebih cepat dan menggunakan lebih sedikit RAM video. Mereka pilihan yang buruk karena mereka menggunakan kompresi lossy (yang kadang-kadang bisa sangat terlihat) dan mungkin tidak didukung pada semua perangkat keras.

Jika itu saya, saya akan membangun dukungan untuk semua 4 format ini (TGA dan DDS cukup sepele untuk menulis loader, dengan JPG dan PNG saya akan menggunakan perpustakaan gambar) sehingga pembuat konten dapat memilih format yang paling sesuai pada dasar per-tekstur.

Maximus Minimus
sumber
1
"DDS didukung secara native pada sebagian besar perangkat keras PC konsumen" DDS adalah wadah untuk berbagai format. Anda tidak meneruskan file DDS ke GPU, tetapi isinya!
Tara
0

Dan tentu saja Anda selalu dapat menggunakan BMP 32 bit lama yang benar-benar mudah dimuat (terutama jika ukurannya adalah kekuatan 2 (sebenarnya, kelipatan 8 byte IIRC)).

Kalau tidak, rasanya aneh bahwa Anda hanya menginginkan satu format, jpg benar-benar keren untuk tekstur hi-dunia nyata yang bagus (jpeg memang mengagumkan dengan ruang cakram dan (turun) memuat-kali), png untuk transparansi dan BMP 32 bit untuk kontrol-tekstur (mudah dibuat dari skrip atau alat 'cepat dan kotor').

Valmond
sumber