Haruskah saya menggunakan tekstur yang tidak berukuran 2?

40

Pada hari-hari awal OpenGL dan DirectX, ukuran tekstur diminta menjadi kekuatan dua. Ini berarti interpolasi nilai float dapat dilakukan dengan sangat cepat, menggunakan pengalihan dan semacamnya.

Sejak OpenGL 2.0 (dan sebelumnya, melalui ekstensi) dimensi non-power-of-two tekstur telah didukung.

Apakah tekstur dua daya memiliki keunggulan kinerja pada GPU terintegrasi dan diskrit modern? Apa kelebihan yang dimiliki tekstur non-kekuatan-dua?

Apakah populasi desktop yang signifikan memiliki kartu yang mendukung tekstur non-kekuatan-dua?

Akan
sumber
Lihat jawaban luar biasa ini untuk pertanyaan serupa: Mengapa gambar untuk tekstur pada iPhone harus memiliki kekuatan dua dimensi?
Dvole

Jawaban:

15

Apakah ada keuntungan kinerja dengan tetap berpegang pada dua kekuatan pada GPU terintegrasi dan diskrit modern?

Sebagian besar GPU modern mendukung non-power of dua (NPOT) tekstur dan menanganinya dengan baik. Penurunan kinerja cukup kecil. Tetapi ada beberapa masalah yang perlu dipertimbangkan:

  • Saat menggunakan tekstur NPOT, dibutuhkan lebih banyak ruang dalam RAM, sama seperti tekstur POT berukuran berikutnya. Secara teknis Anda hanya membuang ruang yang bisa digunakan untuk meletakkan sesuatu di sana;

  • Tekstur NPOT dapat ditangani lebih lambat (pada OpenGL 2.1 saya mengalami penurunan kinerja hingga 30%) dibandingkan dengan POT dengan ukuran berikutnya;

  • GPU lama dan GPU on-board / on-chip tidak terlalu canggih, mereka sering mendukung tekstur NPOT, tetapi dukungannya cukup lambat dan canggung;

  • Bahkan GPU yang lebih lama dapat menolak untuk menerima / menampilkan tekstur NPOT sama sekali;

  • Mungkin ada artefak merayap yang disebabkan oleh interpolasi mip-peta, tekstur 25x25 Anda mungkin memiliki pinggiran hitam di mana piksel ditambahkan untuk memasukkannya ke ukuran 32x32.

NB Saya tidak tahu pasti tentang perangkat seluler, bahkan mungkin ada lebih banyak pembatasan mengenai tekstur POT.

Apa kelebihan yang dimiliki tekstur non-kekuatan-dua, jika ada?

Sejauh yang saya tahu hanya ada 2 keuntungan:

  • Mereka mengambil lebih sedikit ruang pada HDD jika mereka tidak dikemas (ketika area kosong yang dikemas memberi sangat sedikit tambahan)
  • Anda dapat menghemat waktu dalam menulis NPOT -> POT converter. Anda akan membutuhkan satu untuk versi rilis, tetapi menggunakan tekstur NPOT untuk mendesain dan membuat prototipe antarmuka / model tidak masalah

Apakah ada populasi besar pengguna desktop yang tidak memiliki kartu yang mendukung tekstur non-kekuatan-dua?

Sejauh yang saya tahu dan diuji pada PC - Ya. Itu termasuk persentase utama GPU penurunan kecepatan / bug minor dan persentase kartu kecil yang tidak akan menangani NPOT sama sekali.

Kromster berkata mendukung Monica
sumber
6

Salah satu penggunaan umum dari tekstur non-kekuatan-dua adalah untuk 'ukuran layar' atau 'ukuran setengah layar' (dan seterusnya) membuat tekstur target yang digunakan untuk efek postprocessing.

Dalam kasus ini, peta tidak diperlukan, buffer selalu tidak terkompresi, jadi ukuran tekstur yang aneh menyebabkan lebih sedikit masalah di sini

bluescrn
sumber
4

Ada batasan untuk tekstur NPOT pada perangkat keras yang lebih lama. Seperti yang disebutkan pada wiki OpenGL ini , beberapa perangkat keras lama membutuhkan NPOT untuk tidak memiliki mipmaps, tekstur terkompresi membutuhkan penyelarasan 4x4 piksel, tetapi perangkat keras baru harus menanganinya dengan sempurna.

Dalam pengalaman saya, beberapa perangkat keras yang bahkan relatif baru mengalami kinerja besar jika Anda menggunakan tekstur NPOT dan bukan POT. Saya tidak tahu apa masalahnya; ada kemungkinan bahwa dalam beberapa kombinasi status render, rendering sebenarnya dilakukan dalam perangkat lunak. Jadi, kecuali Anda memiliki alasan yang bagus, saya sarankan tetap mencoba menggunakan POT sebanyak mungkin.

Mengenai mengapa menggunakan NPOT dan bukannya POT - jika Anda memiliki gambar dengan dimensi NPOT, katakan misalnya 1600x1200, menggunakan permukaan 2048x2048 piksel akan menghabiskan banyak memori video.

Jari Komppa
sumber
3
Jika Anda menggunakan format tekstur yang dikompresi dalam memori (PVR atau DXT, misalnya), meningkatkan ke kekuatan berikutnya dari dua akan menggunakan memori tekstur secara signifikan lebih sedikit daripada tekstur NPOT yang tidak dikompresi, tetapi lebih kecil.
Tetrad
3
Kata-kata Anda agak kabur, jadi maaf jika ini berlebihan dengan apa yang Anda coba katakan - tekstur terkompresi masih memerlukan ukuran piksel dalam kelipatan 4, bahkan pada perangkat keras modern yang mendukung tekstur NPOT.
1
Saya berharap perangkat keras saat ini masih menjadi tekstur ubin / swizzling di driver saat Anda mengunggahnya. Ini mengubah tata letak tekstur untuk membuat pengaksesan lebih optimal untuk perangkat keras. Konsol (saya tidak termasuk XNA dalam hal itu) mengharuskan Anda untuk melakukan optimasi tata letak ini secara manual dalam rantai alat Anda sendiri, saya cukup yakin ini hanya bekerja pada POW2.
Roger Perkins
-1

kekuatan 2 tekstur meningkatkan kinerja sekitar 30% untuk semua jenis GPU tidak hanya GPU lama (30% lebih cepat adalah perbedaan antara GPU high-end dan rata-rata) mereka mengambil 30% lebih banyak ram tetapi lebih sedikit vram diperlukan mereka meningkatkan kualitas dengan memberikan ukuran tekstur yang tepat untuk jarak tertentu ia bekerja seperti anti-aliasing untuk tekstur garis gelap artefak harus ditangani oleh mesin permainan dan mesin aaa menanganinya dengan baik

yusef ghatavi
sumber
Ini hanya memberikan keunggulan (sudah ditentukan) dari tekstur dua kekuatan, itu tidak menjawab pertanyaan itu sendiri, itulah sebabnya Anda akan menggunakan tekstur non -kekuatan-dua karena keunggulan di atas.
Josh
maaf saya salah mengerti pertanyaan, dengan kekuatan 2 Anda dibatasi untuk 2048, 1024, 512, dll. mungkin ini adalah alasan utama
yusef ghatavi
juga non power 2 berguna untuk tekstur yang tidak memerlukan mipmaps seperti tekstur gui dan tekstur untuk karakter orang pertama yang selalu dekat dengan kamera
yusef ghatavi
-3

Seni programmer saya hanya dengan ukuran yang benar.

Ini tentu saja menyederhanakan logika tampilan saya untuk mengetahui bahwa jika saya ingin mengatur tekstur ke kiri atas layar, saya hanya dapat mengatur 0,0 sebagai kiri atas tekstur dan melihat semua tekstur di lokasi yang benar, sedangkan jika saya harus menambahkan 0alpha padding, memposisikan tekstur pada tepi layar akan lebih kompleks. Plus, tentu saja, 0alpha itu masih harus dicampur alfa, dan jika saya melihat tekstur buram, saya mungkin memilih untuk tidak memiliki saluran alpha.

DeadMG
sumber
6
Biasanya satu posisi poligon, bukan tekstur, di layar. Poligon dapat diberikan apa pun UV yang diperlukan - mereka tidak perlu harus berubah dari 0 menjadi 1; jika tekstur Anda hanya 30 lebar, tidak apa-apa untuk pergi ke 0,9375 (yang merupakan alasan lain tekstur POT baik - UVs benar-benar mewakili).