Neden dokular her zaman ikisinin kare güçleridir? Ya onlar değilse?


53

Oyunlardaki dokuların çözünürlüğü neden her zaman iki (128x128, 256x256, 512x512, 1024x1024, vb.) Gücünde? Oyunun dosya boyutundan tasarruf etmek ve dokuyu UV ambalajsız modele tam olarak uydurmak akıllıca olmaz mıydı?

İkisinin gücü olmayan bir doku olsaydı ne olurdu?

Dokunun 256x512 veya 512x1024 gibi olması yanlış olur mu? Yoksa bu, iki dokunun güçsüzlüğünün neden olabileceği sorunlara neden olur mu?


9
Diğer örnekleriniz de ikisinin gücüdür, ikisinin gücü değildir. İkisinin gücü, dokuyu grafik donanımı için optimize eder.
MichaelHouse

1
@ Bayt56 Sanırım 2 ^ nx 2 ^ n doku anlamına geliyor, ki burada n 1 ile sonsuz arasında değişiyor. (Gerçekten sonsuz değil.)
Robin

Ayrıca, ikisinin güçlerinin mipmapleri önemsiz yapma avantajına sahip olduğuna dikkat edin.
Pubby

Doku normal bir şekilde sarıldığından (bunu özel bir gölgelendiricide seçebilseniz de) herhangi bir yer harcamanıza gerek kalmaz, yalnızca çokgenlerinizi uv koordinatlarını kenarların etrafına sarın ve kullanılabilir alandan daha kolay yararlanın. Eğer bir baskıya sahip değilseniz, width = height = 2 ^ n dokulara yapışması en güvenli olana ihtiyaç duyar, çünkü biraz daha karmaşık bir uv düzeni pahasına daha geniş bir donanım yelpazesine izin verir.
Daniel Carlsson

Her zaman ikisinin gücü değildirler .
Almo

Yanıtlar:


49

Oyunlardaki dokuların çözünürlüğü neden her zaman iki (128x128, 256x256, 512x512, 1024x1024, vb.) Gücünde?

Byte56 Belirtildiği üzere, "gücü iki" boyut kısıtlamaları vardır (idi) her bir boyut olması gerektiğini, bağımsız bir şekilde, iki, bir güç değil, dokular kare olması gerektiğini ve bu ikisinin bir güç olan boyutlara sahiptir.

Bununla birlikte, modern kartlarda ve hangi modern grafik API'lerinde, bu "kısıtlama", dokular boyutlarının, neden dahilinde, hemen hemen istediğiniz herhangi bir şey olabileceği şekilde önemli ölçüde rahatlatılmıştır. Ancak:

Oyunun dosya boyutundan tasarruf etmek ve dokuyu UV ambalajsız modele tam olarak uydurmak akıllıca olmaz mıydı? İkisinin gücü olmayan bir doku olsaydı ne olurdu?

Doku boyutlarının ikisinin gücü olmasını sağlayarak, grafik boru hattı iki gücün çalışmasında verimlilik ile ilgili optimizasyonlardan yararlanabilir. Örneğin, GPU'ları tahsis etmeden ve son derece akıllıca optimize eden derleyicileri ayırmak ve ikisinin güçleriyle çarpmak daha hızlı olabilirdi. Boru hattında, mipmaplerin hesaplanması ve kullanılması gibi iki basitleştirilmiş işlemin gücüyle çalışmak (ikisinin gücü olan bir sayı daima yarıya bölünür, bu da yuvarlamanız gereken senaryolarla uğraşmanıza gerek kalmaz) mipmap boyutlarınız yukarı veya aşağı).

Bu şekilde bir alanı boşa harcadığınız doğrudur, ancak fazladan boşluk, render performansındaki tradeoff için genellikle buna değer. Ek olarak, depolama atığının bir kısmını hafifletebilecek tek bir doku boşluğuna çoklu görüntüleri sıkıştırmak veya paketlemek gibi teknikler vardır.


11
“Bu şekilde bir alanı boşa harcayacağınız” doğru, ancak fazladan boşluk, render performansındaki tradeoff için genellikle buna değer. ” - Yaklaşık on yıl önce, bir PS2 oyununu XBox'a taşıyan bir stüdyoda çalıştım. PS2 teknik olarak ikisinin güç olmayan dokusunu desteklemese de, bazı durumlarda, biraz akıllıca bir manipülasyon ve hız kaybı olmadan bunu yapmaya zorlayabilirsiniz. Öte yandan, XBox bunları tamamen desteklemiyordu. Sonuçta, XBox PS2'nin RAM'inin neredeyse iki katı olmasına rağmen, sığması için bazı dokuların altını örneklememiz gerekti.
ZorbaTHut

Bir alıntı bulmakta zorlanıyorum, fakat daha önce JPEG görüntülerinin maksimum 8x kat katında olması gerektiğini okudum, çünkü bunun dışında bir şey hala 8x8 blok gerektiriyor.
Salmonmoose

1
@ salmonmoose: Doğru; JPEG, her 8x8 bloğunu bağımsız olarak sıkıştırır ve blokları kenarlarından siler. Ancak bu, bu soru ile ilgisiz.
MSalters

1
JPEG'ler 8x8 blok halinde kodlanır, evet. Ancak bu gerçekten bir verimlilik değerlendirmesi değil. Ve ille de ikisinin de gücü olmaz. :)
Kylotan

Bir örnek Android'de, çoğu zaman güçlü olmayan dokular beyaz dokulara yol açıyor.
user717572

17

Neden dokular her zaman ikisinin kare güçleridir?

Dokular her zaman kare değildir ya da her zaman ikisinin gücüdür . İkisinin güç olma eğiliminin nedeni , genellikle bu kısıtlamayı getiren eski video kartlarıyla uyumluluğu arttırmaktır. Kare olmayan dokulara gelince, bu genellikle bir sorun değildir. Özetlemek:

  • Dokular genellikle kare olmak zorunda değildir - DirectX'in bir D3DPTEXTURECAPS_SQUAREONLYözelliği olsa da, eski donanımda bile sorunsuz olmayan kare olmayan dokularla çalıştım.
  • Dokular ikinin gücü olmalıdır , çünkü birçok eski grafik kartı hala onu gerektirir. Bu kısıtlamanın nedeni, doku haritalama işlemlerinde bazı optimizasyonlar yapabilmeleriydi. Çoğu modern grafik kartında da bu kısıtlama yoktur.

12
"Eski grafik kartları" ile 2006'dan önce veya daha önce yapılmış şeyler anlamına geldiğine dikkat edilmelidir.
Nicol Bolas

1
@NicolBolas Teşekkürler, aslında bu noktada bazı referanslar bulmaya çalışıyordum.
David Gouveia

7

Grafik kartı optimizasyonları ile ilgilidir. Onları bu şekilde işlemek için tasarlandılar. Kartların çoğu bu gün olacaktır Eğer ikisinin yetkileri olmayan boyutlara sahip dokular yüklenmesine izin, ancak büyük olasılıkla performansı üzerinde olumsuz bir etkisi olacaktır. Yüklendiğinde, zaman kazanmanıza ve herhangi bir hafıza kaydetmenize gerek kalmadan dönüştürülecek olması ihtimali yüksektir. Kare olmayan dokular, her ikisi de boyutları ikiden oluşan güçler olduğu sürece, genellikle tamamdır.

Tek boyutlu dokularla başa çıkmanın bir yolu Doku Atlası kullanmaktır . Temel olarak, birden çok dokuyu tek bir dokuya yerleştirir ve ihtiyacınız olan görüntüye referans vermek için köşelerinizin doku koordinatlarını kullanırsınız. Bu durum aynı zamanda ek performans avantajları ile birlikte gelir, çünkü durum değişikliklerini önlemeye izin verir. Bunun yaygın bir kullanımı, arayüzün tüm öğelerini tek bir dokuya yerleştirmektir, yani arayüzlerinizin köşelerini tek bir tampon nesnesine topluyorsanız, dokuyu değiştirmek yerine her şeyi tek bir çağrı ile çizebilirsiniz. birçok kez ve her biri için ayrı bir çizim yapma çağrısı.


6

Sorun, bazı donanımların iki boyutlu gücü olmayan dokular için sınırlı bir desteğe sahip olmasıdır.

Örneğin, http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspx adresinin altına bakın ve 3 ve 4 numaralı dipnotları okuyun.

3 9_1, 9_2 ve 9_3 özellik seviyelerinde, ekran cihazı, iki koşulda ikisinin gücü olmayan 2 boyutlu dokuların kullanımını destekler. Birincisi, her doku için sadece bir MIP-harita seviyesi oluşturulabilir ve ikincisi, dokular için sargı örnekleyici modlarına izin verilmez (yani, D3D11_SAMPLER_DESC'nin AddressU, AddressV ve AddressW üyelerine D3D11_TEXTURE_ADDRESS_WRAP olarak ayarlanamaz).

4 10_0, 10_1 ve 11_0 özellik seviyelerinde, ekran cihazı koşulsuz olarak iki boyutlu dokuların ikisinin gücü olmayan boyutlarda kullanılmasını destekler.


6

Grafik donanımı, matris işlemleri, parça işlemleri ve vektör işlemleri için optimize edilmiştir. Basitçe söylemek gerekirse, kare matrislerin başa çıkması daha kolaydır, çünkü hesaplamalar bloklar halinde (parça adı verilen) yapılabilir, donanım blok işlemleri için optimize edilmiştir, bu yüzden dosya tamponları gibi şeyler vardır, RAM blit bir blok kadar blit yapmaz dolduruldu. Aynısı grafik belleği için de geçerlidir.

Çerçeve tamponu kare olan parçalardan oluşur. Örneğin 800x600 ve RGB renk alanı (0-255) çözünürlüğünde bir ekranda, her kanalda 3 bayt olan 800x600 puan var, çerçeve tamponunda adreslenecek toplam 3x800x600 = 1,440,000 bayt var. Bu, 256x256x3 bayt olan 1.875 adreslenebilir fragman olduğu anlamına gelir. Doku verileri kare olduğu için, GRAM matrisinden ekran tampon matrisine bicubic scaling kullanarak eşleştirmeyi önemli ölçüde kolaylaştırır, burada kare olmasaydı sanki uzun tarafın önyargısı gerektiğinde hesaplamak için daha fazla zaman alırdı ölçeklendirilmek.

Birçok grafik API, kare olmayan doku verilerini kabul eder, çünkü UV haritalama koordinatlarını kayan nokta verileri olarak kabul ederler, ancak GPU'ya bir kez gönderildiğinde, doku verisine dolgu eklenir, çünkü görüntünün gerçek oranları haritalamayı değiştirmez GPU bunu mükemmel bir kare olarak ele almayı sevdiği için etkilenmemiş görünüyor, ancak doku verilerine dolgu eklendi.

Yani 100x1024 görüntü kullanılırsa ve 1024x1024 olan görüntü kullanılırsa, 946,176 bayt boşa harcanır. Daha da fazlası, eğer kompozisyon yapılacaksa, doldurma verilerinin kompozisyonlanmış dokuyu etkilememesi gerektiğini belirtmek için bir alfa kanalının eklenmesi gerekecektir.


Bu, 2 yanıtın (+1) olağan gücünde bulunmayan ilginç bir açıklamadır (kare matrisler için titbit) - eğer mümkünse biraz alıntı yapabilir misiniz?
Samaursa

1

Dijital dünyamız, ikili bir değerle çalışır, sonra bir değeri 2 ile bölmek veya bölmek için bir değeri sola veya sağa "taşıyabilirsin";

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

Bir değer için "ikisinin gücü" değerleri ile çalışmak daha kolaydır.


0

Modern donanım (nihayet) iki temel dokunun dokusuzluğundaki sargılı modları etkinleştirmekle başa çıkabilmektedir, ancak iki dokunun gücünün bulunmaması , genişlik boyunca bir miktar donanıma göre bir miktar dolgulu olma eğiliminde olduklarından GPU hafızasını boşa harcama eğilimindedir. bazı karo boyutuna veya dokuyu içeren iki boyutta bir sonraki güce yuvarlanır).

Bu donanıma bağımlı olduğundan ve satıcılar genel olarak bu ayrıntıların özelliklerine girmeyeceğinden, yapılacak en güvenli şey, dokular için GPU koçunu boşa harcamamak için iki boyutun gücünü kullanmaya devam etmektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.