Mengapa resolusi tekstur dalam gim selalu memiliki kekuatan dua (128x128, 256x256, 512x512, 1024x1024, dll.)? Tidakkah pintar untuk menghemat ukuran file gim dan membuat tekstur persis sesuai dengan model UV yang terbuka?
Apa yang akan terjadi jika ada tekstur yang bukan kekuatan dua?
Apakah salah memiliki tekstur seperti 256x512, atau 512x1024? Atau apakah ini akan menyebabkan masalah yang disebabkan oleh non-kekuatan-dua tekstur?
Jawaban:
Seperti yang disiratkan Byte56, batasan "kekuatan dua" adalah bahwa masing-masing dimensi harus, secara terpisah, kekuatan dua, bukan bahwa tekstur harus persegi dan memiliki dimensi yang merupakan kekuatan dua.
Namun, pada kartu modern dan API grafis modern mana, "batasan" ini telah berkurang secara signifikan sehingga dimensi tekstur dapat, dengan alasan, apa saja yang Anda suka. Namun:
Dengan memastikan dimensi tekstur adalah kekuatan dua, pipa grafis dapat mengambil keuntungan dari optimasi terkait dengan efisiensi dalam bekerja dengan kekuatan dua. Sebagai contoh, bisa jadi (dan benar-benar beberapa tahun yang lalu sebelum kami mendedikasikan GPU dan kompiler pengoptimalisasi yang sangat pintar) lebih cepat untuk membagi dan mengalikannya dengan kekuatan dua. Bekerja dalam kekuatan dua juga operasi yang disederhanakan dalam pipa, seperti perhitungan dan penggunaan mipmaps (angka yang merupakan kekuatan dua akan selalu dibagi secara merata menjadi dua, yang berarti Anda tidak harus berurusan dengan skenario di mana Anda harus membulatkannya dimensi mipmap Anda naik atau turun).
Memang benar Anda "menyia-nyiakan" ruang dengan cara ini, tetapi ruang ekstra biasanya sepadan untuk pertukaran dalam membuat kinerja. Selain itu ada beberapa teknik, seperti kompresi atau pengemasan banyak gambar menjadi satu ruang tekstur tunggal yang dapat meringankan sebagian dari limbah penyimpanan.
sumber
Tekstur tidak selalu persegi dan tidak selalu kekuatan dua . Alasan mengapa mereka cenderung demikian dua kekuatan biasanya untuk meningkatkan kompatibilitas dengan kartu video lama yang memberlakukan pembatasan itu. Sedangkan untuk tekstur non-persegi, itu biasanya tidak menjadi masalah. Untuk meringkas:
D3DPTEXTURECAPS_SQUAREONLY
kemampuan tetapi saya telah bekerja dengan tekstur non persegi bahkan di perangkat keras yang lebih tua tanpa masalah.sumber
Ini berkaitan dengan optimalisasi kartu grafis. Mereka telah dirancang untuk memprosesnya dengan cara itu. Sebagian besar kartu hari ini akan memungkinkan Anda memuat tekstur dengan dimensi yang bukan kekuatan dua , tetapi kemungkinan akan berdampak negatif pada kinerja. Ada kemungkinan besar bahwa ketika dimuat itu sebenarnya akan dikonversi dengan biaya Anda memuat waktu dan tidak menghemat memori. Tekstur non-kuadrat umumnya OK, asalkan kedua dimensinya adalah kekuatan dua.
Salah satu cara berurusan dengan tekstur ukuran ganjil adalah menggunakan Texture Atlas . Pada dasarnya, Anda menempatkan beberapa tekstur bersama menjadi satu tekstur dan menggunakan koordinat tekstur dari simpul Anda untuk referensi gambar tertentu yang Anda butuhkan. Ini dilengkapi dengan manfaat kinerja tambahan juga, karena memungkinkan untuk menghindari perubahan status. Penggunaan umum dari ini adalah menempatkan semua elemen antarmuka ke dalam satu tekstur, yang berarti bahwa jika Anda telah menumpuk simpul antarmuka Anda menjadi objek buffer tunggal, Anda dapat menggambar semuanya dengan satu panggilan saja, daripada mengganti tekstur. berkali-kali dan buat panggilan undian terpisah untuk masing-masing.
sumber
Masalahnya adalah beberapa perangkat keras memiliki dukungan terbatas untuk tekstur yang tidak memiliki kekuatan dua dimensi.
Misalnya, lihat di bagian bawah http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspx dan bacalah catatan kaki 3 dan 4 di sana.
sumber
Perangkat keras grafis dioptimalkan untuk operasi matriks, operasi fragmen dan operasi vektor. Sederhananya matriks persegi lebih mudah untuk ditangani, karena perhitungan dapat dilakukan dalam blok (disebut fragmen), perangkat keras dioptimalkan untuk operasi blok, yang mengapa ada hal-hal seperti buffer file, RAM blit tidak blit ke disk hingga blok telah diisi. Hal yang sama berlaku untuk memori grafis.
Frame buffer terdiri dari fragmen yang berbentuk bujur sangkar. Misalnya di layar dengan resolusi 800x600 dan ruang warna RGB (0-255) ada 800x600 poin dengan 3 byte setiap saluran ada total besar 3x800x600 = 1.440.000 byte untuk alamat dalam frame buffer. Itu berarti ada 1.875 fragmen yang dapat dialamatkan yang 256x256x3 byte. Karena data tekstur berbentuk bujur sangkar, membuatnya lebih mudah untuk memetakan dari matriks GRAM ke matriks buffer layar menggunakan penskalaan bikubik, di mana seolah-olah tidak kuadrat maka bias untuk sisi yang lebih panjang akan membutuhkan lebih banyak waktu untuk menghitung kapan diperlukan. diskalakan.
Banyak grafik API akan menerima data tekstur non persegi, karena mereka menerima koordinat pemetaan UV sebagai data titik mengambang, namun begitu dikirim ke GPU, padding ditambahkan ke data tekstur, karena proporsi gambar sebenarnya tidak mengubah pemetaan. tampaknya tidak terpengaruh, namun padding ditambahkan ke data tekstur, karena GPU suka mengatasinya sebagai kuadrat sempurna.
Jadi jika gambar 100x1024 digunakan, dan gambar yang 1024x1024 digunakan yang berarti 946.176 byte terbuang sia-sia. Terlebih lagi jika pengomposisian harus dilakukan, karena saluran alfa perlu ditambahkan untuk menunjukkan bahwa data padding tidak boleh mempengaruhi tekstur yang dikomposisikan.
sumber
Dunia digital kami bekerja dengan penomoran biner lalu untuk mengalikan atau membagi dengan 2 nilai, Anda dapat "memindahkan" nilai ke kiri atau kanan yaitu
Bekerja dengan nilai-nilai "kekuatan dua" lebih mudah untuk CPU.
sumber
Perangkat keras modern dapat (akhirnya) mengatasi dengan mengaktifkan mode bungkus pada non-power dari dua tekstur berbasis, namun non-power dari dua tekstur masih cenderung membuang-buang memori GPU karena mereka cenderung menjadi empuk sepanjang lebar dengan beberapa jumlah perangkat keras tertentu (baik untuk beberapa ukuran ubin atau dibulatkan ke kekuatan dua ukuran berikutnya yang berisi tekstur).
Karena ini tergantung pada perangkat keras dan vendor umumnya tidak akan masuk ke rincian rincian ini, hal paling aman untuk dilakukan adalah terus menggunakan kekuatan dua dimensi untuk tekstur, agar tidak membuang ram GPU.
sumber