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.
13
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:
Dalam permainan kami, kami memiliki aset (tekstur) dalam banyak format:
Terakhir, kami menggunakan format mentah untuk kompatibilitas tetapi itu untuk kompatibilitas atau elemen GUI
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
Menipu
sumber
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.
sumber
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:
sumber
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 .
sumber
Ada sejumlah pertimbangan di sini:
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.
sumber
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').
sumber