È una cattiva idea in quanto non ha senso. Non c'è nulla da "impostare" che non hai già fatto, ad eccezione di una matrice di proiezione orto (che dovrai comunque fare).
La portabilità probabilmente non è un problema, sebbene dovrebbe esserlo. Gli IHV sembrano essere molto riluttanti a rinunciare al supporto della modalità immediata per il futuro prevedibile (sembra "funzionare bene" anche nei profili di base), quindi anche se la modalità immediata avrebbe dovuto estinguersi molto tempo fa, probabilmente rimarrà per sempre. Le prestazioni sono un'altra storia. Vuoi davvero qualcosa che rappresenti lo 0,1% della complessità della scena per consumare il 15-20% del tempo della CPU - le chiamate GL sono relativamente leggere, rispetto ad esempio a DX, ma non sono gratuite - e il 15-20% di tempo reale dei fotogrammi dovuto allo stallo della tubazione? Puoi permettertelo con il tuo budget? La maggior parte dei giochi non può.
E poi, naturalmente, le stranezze. Oh le stranezze. L'apparente bellezza della modalità immediata è che è (apparentemente) facile e diretto fare qualcosa come disegnare un paio di quad veloci. In realtà, la modalità immediata può essere un tale dolore nella parte posteriore, è così piena di insidie non ovvie.
D'altra parte, è altrettanto facile (e più semplice se me lo chiedi!) Scrivere semplicemente una piccola funzione a 5 LOC DrawQuad
che quando viene chiamata aggiunge coordinate e indici di vertice a un buffer di memoria e incrementa un contatore. Che, sorpresa, puoi quindi disegnare glDrawArrays/Elements
e con cui puoi riutilizzare (la copia della GPU, non solo la copia della terra dell'utente!) Il fotogramma successivo così com'è fintanto che nulla è cambiato.
La modalità immediata deve, non c'è altro modo, allocare un buffer ed eseguire ogni volta un trasferimento PCIe. Oppure, qualcosa di equivalente in latenza (GPU che legge la memoria principale sul bus, qualunque cosa). Il driver non può sapere (o presumere) che i dati siano rimasti esattamente gli stessi del frame precedente.
Il trasferimento dei dati nella GPU è un'operazione ad alta velocità, ma anche ad alta latenza . Non solo il trasferimento del bus è di per sé un protocollo complicato e ad alta latenza (diversi livelli di protocollo, pacchetti, riconoscimenti, ecc.), Ma non tutte le GPU sono anche in grado di trasferire e disegnare contemporaneamente, o se possono farlo , potrebbero non essere sempre in grado di alternare o avviare nuove operazioni liberamente mentre fanno qualcosa di diverso. Leggi come: Non trasferire invano .