Mengapa tekstur selalu persegi kekuatan dua? Bagaimana jika tidak?


53

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?


9
Contoh Anda yang lain juga kekuatan dua, hanya kekuatan yang tidak sama dari dua. Kekuatan dua membuat tekstur dioptimalkan untuk perangkat keras grafis.
MichaelHouse

1
@ Byte56 Saya pikir maksudnya 2 ^ nx 2 ^ n tekstur, di mana n bervariasi dari 1 hingga tak terbatas. (Tidak benar-benar tanpa batas.)
Robin

Juga perhatikan bahwa kekuatan dua memiliki manfaat membuat mipmaps sepele.
Pubby

Karena teksturnya biasanya membungkus (walaupun Anda dapat memilih ini dalam custom shader) Anda tidak perlu membuang ruang, cukup bungkus poligon Anda dengan koordinat di tepinya dan Anda dapat menggunakan ruang yang tersedia dengan lebih mudah. Jika Anda belum memiliki kebutuhan mendesak, maka yang paling aman adalah tetap pada lebar = tinggi = 2 ^ n tekstur karena akan memungkinkan untuk rentang perangkat keras yang lebih luas dengan biaya tata letak uv yang sedikit lebih rumit.
Daniel Carlsson

Mereka tidak selalu kekuatan dua.
Almo

Jawaban:


49

Mengapa resolusi tekstur dalam gim selalu memiliki kekuatan dua (128x128, 256x256, 512x512, 1024x1024, dll.)?

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:

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?

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.


11
"Memang benar Anda" menyia-nyiakan "ruang seperti ini, tetapi ruang ekstra itu biasanya sepadan dengan tradeoff dalam membuat kinerja." - Sekitar sepuluh tahun yang lalu saya bekerja di sebuah studio yang memindahkan game PS2 ke XBox. Sementara PS2 secara teknis tidak mendukung tekstur non-kekuatan-dua, Anda dapat, dalam beberapa kasus, semacam memaksanya untuk melakukannya dengan sedikit manipulasi pintar dan tanpa kehilangan kecepatan. XBox, di sisi lain, sama sekali tidak mendukung mereka. Hasil akhirnya adalah bahwa meskipun XBox memiliki hampir dua kali RAM dari PS2, kami harus mengurangi beberapa tekstur agar sesuai.
ZorbaTHut

Saya mengalami kesulitan menemukan kutipan, tetapi saya telah membaca sebelumnya bahwa gambar JPEG harus di kelipatan 8 untuk efisiensi maksimum, karena apa pun di luar itu masih memerlukan blok 8x8.
salmonmoose

1
@salmonmoose: Benar; JPEG mengkompres setiap blok 8x8 secara independen dan akan mengisi blok di tepi. Tapi itu tidak terkait dengan pertanyaan ini.
MSalters

1
JPEG dikodekan dalam 8x8 blok, ya. Namun itu bukan pertimbangan efisiensi. Dan itu belum tentu kekuatan 2 baik. :)
Kylotan

Contohnya adalah di Android, di mana seringkali tekstur non-poweroftwo menghasilkan tekstur putih.
user717572

17

Mengapa tekstur selalu persegi kekuatan dua?

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:

  • Tekstur biasanya tidak perlu persegi - meskipun DirectX memang memiliki D3DPTEXTURECAPS_SQUAREONLYkemampuan tetapi saya telah bekerja dengan tekstur non persegi bahkan di perangkat keras yang lebih tua tanpa masalah.
  • Tekstur harusnya kekuatan dua karena banyak kartu grafis yang lebih tua masih memerlukannya. Alasan pembatasan itu adalah agar mereka dapat melakukan beberapa optimasi pada operasi pemetaan tekstur. Sebagian besar kartu grafis modern juga tidak memiliki batasan ini.

12
Perlu dicatat bahwa dengan "kartu grafis yang lebih lama" ia berarti barang yang dibuat sebelum tahun 2006 atau lebih.
Nicol Bolas

1
@NicolBolas Terima kasih, saya sebenarnya mencoba mencari beberapa referensi tentang hal itu.
David Gouveia

7

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.


6

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.

3 Pada tingkat fitur 9_1, 9_2 dan 9_3, perangkat layar mendukung penggunaan tekstur 2-D dengan dimensi yang bukan kekuatan dua di bawah dua kondisi. Pertama, hanya satu tingkat peta MIP untuk setiap tekstur yang dapat dibuat, dan kedua, tidak ada mode bungkus sampler untuk tekstur yang diperbolehkan (yaitu, AddressU, AddressV, dan AddressW anggota D3D11_SAMPLER_DESC tidak dapat diatur ke D3D11_TEXTURE_ADDRESS_WRAP).

4 Pada tingkat fitur 10_0, 10_1 dan 11_0, perangkat layar tanpa syarat mendukung penggunaan tekstur 2-D dengan dimensi yang bukan kekuatan dua.


6

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.


Ini adalah penjelasan yang menarik (titbit tentang matriks persegi) yang tidak ditemukan dalam kekuatan 2 jawaban biasa (+1) - dapatkah Anda memberikan beberapa kutipan jika memungkinkan?
Samaursa

1

Dunia digital kami bekerja dengan penomoran biner lalu untuk mengalikan atau membagi dengan 2 nilai, Anda dapat "memindahkan" nilai ke kiri atau kanan yaitu

<<  Left shift      x = 5 << 1    0101 << 1     1010     10
>>  Right shift     x = 5 >> 1    0101 >> 1     0010      2

Bekerja dengan nilai-nilai "kekuatan dua" lebih mudah untuk CPU.


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.