Aynı anda genellikle kaç dokuya bağlanabilirim?


23

Bir oyun motoru geliştiriyorum ve sadece modern (Shader model 4+) donanım üzerinde çalışacak. Anladığım kadarıyla, işim bittiğinde, bu mantıksız bir gereklilik olmayacaktı.

Sorum şu: Modern grafik kartına aynı anda kaç doku bağlayabilirim? 16 yeterli olacaktır. Çoğu modern grafik kartının bu kadar sayıdaki dokuyu desteklemesini bekleyebilir miyim?

GTX 460 cihazım 32 destekli görünüyor, ancak çoğu modern ekran kartının temsilcisi olup olmadığını bilmiyordum.


Hangi işleme API'sini kullanıyorsunuz?
Adam

2
Tabii ki OpenGL :)
Avi

Yanıtlar:


53

OpenGL'ye bağlanabilecek doku sayısı 32 veya 16 değil . Aldığın şey bu değil glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);. Bu işlev , parça gölgelendiricinin erişebileceği doku sayısını alır .

Bakın, her gölgelendiricinin kullanabileceği doku sayısının kendi sınırlaması vardır . Bununla birlikte, kullanılabilecek toplam doku sayısı da vardır. Bu (OpenGL'de) ile tanımlanır GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

Yani iki sınır var: sahne başına dokular ve toplam dokular dokular.

OpenGL 3.x, sahne başına limitin minimum sayısını 16 olarak tanımlar; bu nedenle donanım, sahne başına 16'dan az dokuya sahip olamaz. Daha yüksek bir limite sahip olabilir, ancak en az 16 aldığınızı biliyorsunuz. 3.x, toplam-toplam doku için minimum sayıyı 48 olarak tanımlar. AKA: 16 * 3 aşama. Benzer şekilde, GL 4.x sayıları, aşama başına 16 doku ve toplam 96 doku olarak sınırlandırılmış (yani: hesaplama gölgeleyicileri dahil 16 * 6 aşama) olarak tanımlar.

Yine, bunlar minimum sayılardır. Donanım değişebilir (ve değişebilir).

Belirli bir donanıma gelince, herhangi bir DX10 sınıfı donanımın bu numaralarla eşleşmesini bekleyebilirsiniz. DX11 sınıfı donanımda bazı farklılıklar vardır; NVIDIA (GeForce 4xx +) ve üst seviye AMD çipleri (aka: GCN-core), sahne başına 16'dan fazla olabilir.


2
Keşke bu kabul edilen cevap olsaydı. Bana 5 dakikalık anlamsız okuma kazandıracaktı.
Fibbles

3

32'nin şu anda ciltlenebilecek maksimum doku sayısı olduğuna inanıyorum. 8800 serisinin bile 32 tane doku birimi olduğunu söyleyebilirim.

Bildiğim kadarıyla, openGL 4.x desteği için, bir Fermi veya daha yeni bir nvidia kartına (veya ilgili amd kartına) ihtiyacınız olacak, daha yüksek son modellerin hepsinde 32 ünite var gibi gözüküyor, en düşük son kartlarda (GT 430, örneğin Ancak 16. AMD teknik özelliklerine bakıldığında 80 veya 128 doku ünitesi gibi sayıları listeliyorlar, ancak nesiller boyunca sabit kaldıkları görülmüş 32 renkli ROP ünitesini listeliyorlar.

Öte yandan GTX 480, 60 yapı ünitesi ve 48 ROP ünitesi ile listelenirken, 430 gibi alt uç kartların sadece 16 yapı birimi ve 4 ROP girişi olduğu bildiriliyor. Bu yüzden, aslında ikisinin de ikna olmadım, aradığınız sayı bu.

Sabit olmayan fonksiyon boru hattı oluşturma için mevcut doku birimlerinin sayısını kontrol edebilirsiniz glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);, bununla birlikte , çeşitli donanımlara erişiminiz varsa, kendiniz kontrol edebilirsiniz.

EDIT: bu site, ihtiyacınız olan sayıları size vermesi gereken her türlü video kartının bildirilen openGL yeteneklerini karşılaştırmanıza olanak sağlar: http://feedback.wildfiregames.com/report/opengl/device/GeForce%20GTX%20580

Not: AMD ve nvidia kısa bir süre önce "bindless dokuları" tanıttı (amd farklı bir isme sahip), bu sayede çok sayıda dokuyu textutre ünitelerine bağlamadan kullanmanıza izin veriyor, şu anda bu sadece openGL'de mevcut.


1
Ardından, asıl cevap, 'ne kadarını verebilecekseniz' gibi bir şey. Veya farklı ifadelerle her şey olabildiğince hızlı koşmalı. (ve hemen hemen her alanı kapsayan OpenGL'de).
Darkwings,

@Darkwings Sanırım, donanımın kaldırabileceğinden daha fazla doku bağlamak genellikle bir hataya veya sürücünün zaman aşımına uğramasına neden olur. Ben de yanlış anladım, o 4 + 4 değil opengl değil shader model dedi. İlk DX10 kartlarına (X2900 ve 8800 kart ailesi) bakıldığında hepsi en az 16 doku birimine sahip görünüyor.

Sadece parametreleştirilebileceği için olması gerektiği gerçeğinin altını çiziyordum. Oyun eski kartlarda sürünse bile, kodlanmış bir şey olmamalı, ancak 'önerilen bir gereklilik' olmalıdır.
Darkwings,

4
-1: Bu cevap yanlış. Nedenime cevabımı görün (burada açıklamak çok uzun).
Nicol Bolas,

1
Ne hemen belli olmayabilir. Neredeyse hiç kimse GL_TEXTURE n GLenums; bunun yerine, GL_TEXTURE0 + n tuşunu kullanın; burada n , bağlanacak yuvadır . GLenums yalnızca 32 yuvaya kadar çıkar ancak bu, OpenGL'in sizi 32 ile sınırladığı anlamına gelmez. Spesifikasyon onların sıralı olacağını garanti eder. Ayrıca, DSA'yı kullanmıyorsanız, oluşturmak / değiştirmek için bir yuva ayırmak isteyebilirsiniz, böylece oluşturma / değiştirme için kullanılan durum çizim için kullanılan durumla daha az etkileşime girebilir.
Maximus Minimus
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.