Quante trame di solito posso legare contemporaneamente?


23

Sto sviluppando un motore di gioco e funzionerà solo su hardware moderno (modello Shader 4+). Immagino che, quando avrò finito, non sarà un requisito così irragionevole.

La mia domanda è: quante trame posso legare contemporaneamente su una moderna scheda grafica? 16 sarebbe sufficiente. Posso aspettarmi che le più moderne schede grafiche supportino quel numero di trame?

La mia GTX 460 sembra supportare 32, ma non ho idea se sia rappresentativo della maggior parte delle schede video moderne.


Quale API di rendering stai usando?
Adam,

2
OpenGL ovviamente :)
Avi

Risposte:


53

Il numero di trame che possono essere associate a OpenGL non è 32 o 16 . Non è quello che ottieni glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);. Tale funzione recupera il numero di trame a cui può accedere lo shader di frammenti .

Vedi, ogni shader ha il suo limite del numero di trame che può usare . Tuttavia, c'è anche un numero totale di trame che possono essere utilizzate, punto. Questo è definito (in OpenGL) da GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

Quindi ci sono due limiti: le trame per fase e le trame con limite totale.

OpenGL 3.x definisce il numero minimo per il limite per fase pari a 16, quindi l'hardware non può avere meno di 16 trame per fase. Può avere un limite superiore, ma sai che ottieni almeno 16. 3.x definisce il numero minimo per le trame-totale-associato come 48. AKA: 16 * 3 fasi. Allo stesso modo, GL 4.x definisce i numeri come 16 trame per fase e 96 trame con limite totale (ovvero: 16 * 6 fasi, inclusi gli shader di calcolo).

Ancora una volta, questi sono i numeri minimi . L'hardware può (e fa) variare.

Per quanto riguarda l'hardware specifico, ci si può aspettare che qualsiasi hardware di classe DX10 corrisponda a questi numeri. L'hardware di classe DX11 presenta alcune variazioni; I chip NVIDIA (GeForce 4xx +) e AMD di fascia alta (aka: GCN-core) possono avere più del 16-per-stage.


2
Vorrei che questa fosse la risposta accettata. Mi avrebbe risparmiato 5 minuti di lettura inutile.
Fibre

3

Credo che 32 sia il numero massimo di trame che possono essere associate attualmente. Per quanto ne so, anche la serie 8800 aveva 32 unità di trama.

Per quanto ne so, per il supporto di OpenGL 4.x avrai bisogno di una Fermi o di una nuova scheda nvidia (o corrispondente scheda amd), i modelli di fascia più alta sembrano avere tutti 32 unità, mentre le carte di fascia più bassa (GT 430, per esempio ) 16. Tuttavia, guardando le schede tecniche AMD, elencano numeri come 80 o 128 unità texture, ma elencano 32 unità ROP a colori che sembrano essere rimaste costanti per generazioni.

D'altra parte, la GTX 480 è elencata con 60 unità di trama e 48 unità ROP, mentre le carte di fascia bassa come la 430 secondo come riferito hanno solo 16 unità di trama e 4 inchiostri ROP. Quindi nel complesso non sono davvero convinto che nessuno di questi sia il numero che stai effettivamente cercando.

È possibile verificare il numero di unità di trama disponibili per il rendering della pipeline di funzioni non fisse con glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);, quindi, se si ha accesso ad hardware diverso, è possibile verificare da soli.

EDIT: questo sito ti consente di confrontare le capacità openGL riportate di tutti i tipi di schede video, che dovrebbero fornirti i numeri di cui hai bisogno: http://feedback.wildfiregames.com/report/opengl/device/GeForce%20GTX%20580

PS: AMD e nvidia hanno recentemente introdotto "trame senza bind", (amd ha un nome diverso per questo) che ti permette di usare un gran numero di trame senza vincolarle alle unità textutre, al momento questo è disponibile solo in openGL.


1
In seguito, la vera risposta è qualcosa come "hai tanto quanto la hw può offrire". Oppure, formulandolo diversamente, tutto dovrebbe funzionare il più velocemente possibile. (e in OpenGL che copre quasi tutti i campi).
Darkwings,

@Darkwings Suppongo di sì, l'associazione di più trame di quelle che l'hardware è in grado di gestire di solito porterà a un errore o al timeout del driver. Ho anche letto male, ha detto shader modello 4+ non aperto 4+. Osservando le prime carte DX10 (famiglie di carte X2900 e 8800) sembrano avere almeno 16 unità di trama.

Stavo solo sottolineando il fatto che, poiché può essere parametrizzato, dovrebbe essere. Anche se il gioco dovesse strisciare su carte più vecchie, non dovrebbe essere qualcosa di difficile ma un "requisito suggerito".
Darkwings,

4
-1: questa risposta è sbagliata. Vedi la mia risposta per il motivo (è troppo lungo per spiegare qui).
Nicol Bolas,

1
Ciò che potrebbe non essere immediatamente evidente. Quasi nessuno usa GL_TEXTURE n GLenums; utilizzare invece GL_TEXTURE0 + n, dove n è lo slot da associare. I GLenum arrivano solo a 32 slot, ma ciò non significa che OpenGL ti limiti a 32. Le specifiche garantiscono che saranno sequenziali. Inoltre, se non si utilizza DSA, è possibile riservare uno slot per il bind da creare / modificare, in modo che lo stato utilizzato per creare / modificare abbia meno interazione con lo stato utilizzato per il disegno.
Maximus Minimus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.