2011-09-29 9 views
5

Sto scrivendo un gioco 3D che utilizza GL10, ma mi piacerebbe che l'applicazione supporti GL11 o GL20 se disponibile. Qual è il miglior design per supportare tutti e 3? O è un compito da scemo e dovrei concentrarmi solo sul supporto di una versione?Come supporto OpenGL ES GL10, GL11 e GL20 in Libgdx?

La mia idea attuale è di dividere la mia funzione render() in renderGL10, renderGL11, renderGL20 e chiamare la funzione di rendering appropriata in base all'istanza GL disponibile. All'interno di ogni funzione di rendering è il modo corretto di renderizzare per la versione GL; ci saranno probabilmente sovrapposizioni per GL10 e GL11. È un modo appropriato per gestire il mio problema o esiste un modo migliore?

public render(){ 
    if (Gdx.graphics.isGL20Available()){ 
    renderGL20(); 
    } else if (Gdx.graphics.isGL11Available()){ 
    renderGL11(); 
    } else { 
    renderGL10(); 
    } 
} 

EDIT: Soluzione: Se gl1.x è disponibile, GL10 è anche disponibile (e Gdx.gl10 non è nullo). Quindi, il mio codice di rendering dovrebbe essere generalmente strutturato come segue:

public render(){ 
    // Use Gdx.gl for any gl calls common to all versions 
    if (Gdx.graphics.isGL20Available()){ 
    // Use Gdx.GL20 for all gl calls 
    } else { 
    if (Gdx.graphics.isGL11Available()){ 
     // Use Gdx.gl11 for any gl11 call not supported by gl10 
    } 
    // Use Gdx.gl10 for all gl calls 
    } 
} 

risposta

10

Ti effettivamente utilizzare shaders nel tuo percorso di OpenGL ES 2.0 o si basano su SpriteBatch e consorti per gestire i dettagli sporchi per te? Nel caso successivo non vi è alcun reale vantaggio nell'andare a GLES 2.0 (a parte la non potenza di due trame, che potrebbe essere più lenta su alcuni dispositivi)

Di solito si sceglie tra GLES 1.xo 2.0. Se vai con 1.x non devi fare nulla. Se si desidera utilizzare 2.0, è necessario creare un AndroidApplicationConfig e impostare il flag useGL20 su true. Se GLES 2.0 non è supportato sul dispositivo su cui viene eseguita l'app, libgdx tornerà a 1.x. È quindi possibile utilizzare il ciclo di rendering sopra indicato che utilizzerà GLES 2.0 se disponibile e riporterà a 1.x in caso contrario. È improbabile che sia necessario avere percorsi separati per 1.0 e 1.x, a meno che non si utilizzino le chiamate GLES direttamente.

+1

Non uso ancora molte parti artistiche della libreria; Sto esplorando come voglio progettarlo senza molta conoscenza di gles2.0 o di come libgdx tratti gl1.x. Sto usando questo gioco per espandere la mia conoscenza della programmazione di giochi e GLES, quindi mi piacerebbe supportare entrambi, così posso provare ad imparare GLSL. Basandomi sulla tua risposta su 1.x, ho appena dato una rapida occhiata al sorgente per i backend Android e Jogl e ho notato che quando gl11 è disponibile, Gdx.gl10 = Gdx.gl11; Mi aspettavo che gl10 sarebbe nullo se gl11 fosse impostato (allo stesso modo gl10 e gl11 sono nulli quando 2.0 è disponibile). Questo e la tua risposta hanno davvero aiutato. – Doran