Domanda

Ahoy!

Ho cercato di aggiornare un vecchio codice di test nel tentativo di rispolverare le nuove funzionalità aggiunte a GLKit. Finora sono riuscito a configurare un GLKViewController e iniziare a eseguire il rendering di alcune forme di base, ma ho faticato a trovare informazioni decenti su GLKBaseEffect.

La documentazione di GLKBaseEffect afferma:

Al momento dell'inizializzazione, l'applicazione crea prima un contesto OpenGL ES 2.0 e lo rende attuale. Quindi, alloca e inizializza un nuovo oggetto effetto, ne configura le proprietà e chiama il suo metodo prepareToDraw. L'associazione di un effetto determina la compilazione e il collegamento di uno shader al contesto OpenGL ES corrente. L'effetto di base richiede anche che i dati dei vertici vengano forniti dall'applicazione. Per fornire i dati dei vertici, creare uno o più oggetti array dei vertici. Per ogni attributo richiesto dallo shader, l'oggetto vertex array dovrebbe abilitare l'attributo e puntare ai dati memorizzati in un oggetto vertex buffer.

Quello che sto lottando per discernere è;

Ho bisogno di un oggetto GLKBaseEffect per ogni "modello" che sto renderizzando? O uso un singolo GLKBaseEffect per ogni "scena" e cambio semplicemente le proprietà al volo prima di chiamare prepareToDraw?

Ho visto alcuni tutorial per motori di gioco e renderer che usano semplicemente un singolo GLKBaseEffect per ogni modello, ma questo sembra del tutto inefficiente se lo stesso potesse essere ottenuto con una singola istanza.

Dalla lettura della documentazione sembra quasi che questo sia l'approccio migliore, ma considerando che ho visto così tante persone utilizzare più istanze, sto iniziando a pensare che non sia così.

Qualcuno può far luce su questo? GLKit è ancora abbastanza nuovo per iOS (e per me) quindi qualsiasi informazione sarebbe molto apprezzata.

È stato utile?

Soluzione

No, non dovresti creare un GLKBaseEffect univoco per ogni oggetto.Ad esempio, se stai disegnando un labirinto, ogni mattone in quel labirinto potrebbe essere il suo oggetto, ma tutti possono condividere lo stesso GLKBaseEffect.Ricorda però che GLKBaseEffect memorizza anche le informazioni nella posizione così come la consistenza, l'illuminazione, la nebbia ecc. Quindi se vuoi disegnare i mattoni in più di un posto (cosa che presumo tu faccia :-), modifichi la loro matrice di trasformazione e poi chiamil'API "prepareToDraw".

Sono d'accordo che abbiamo bisogno di più tutorial scritti da persone che hanno utilizzato ampiamente GLKBaseEffect per ottenere maggiori informazioni sulle best practice per questo nuovo framework.

Buona navigazione ..

Altri suggerimenti

Ogni modifica delle proprietà "fondamentali" (lightingType, lightModelTwoSided, colorMaterialEnabled, ...) causerà il caricamento di un nuovo programma shader con la successiva chiamata "prepareToDraw".

Quindi, se non usi un ordine di rendering, praticamente non importa se usi un effetto per ogni oggetto renderizzato o un singolo effetto di modifica per tutti gli oggetti.In entrambi i casi ti ritroverai con una chiamata glUseProgram non necessaria e molte modifiche allo stato OpenGL non necessarie per ogni oggetto disegnato.(utilizzare il modello di strumenti "OpenGL ES Analysis" per esaminare le chiamate OpenGL generate)

Detto questo, la tua preoccupazione principale dovrebbe essere quella di ordinare i tuoi oggetti per il rendering.Raggruppa almeno tutti gli oggetti che utilizzano lo stesso programma shader.Quindi creare e utilizzare un oggetto GLKBaseEffect per ciascuno di questi gruppi. Se non sei sicuro che una modifica della proprietà GLKBaseEffect causerà il caricamento di un nuovo programma shader, ti consiglio di utilizzare Instruments per esaminare le chiamate OpenGL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top