Nota: ho già trovato una risposta (che posterò dopo questa domanda) - Mi stavo solo chiedendo se lo stavo facendo bene o se esiste un modo migliore.
Sto realizzando un gioco isometrico "2.5D" usando OpenGL ES (JOGL). Con "2.5D", intendo che il mondo è 3D, ma è reso usando tessere isometriche 2D.
Il problema originale che ho dovuto risolvere era che le mie trame dovevano essere rese in ordine (da dietro a fronte), in modo che le tessere si sovrapponessero correttamente per creare l'effetto giusto. Dopo alcune letture, ho capito rapidamente che si tratta dell'approccio 2D "vecchio cappello". Questo è diventato difficile da fare in modo efficiente, dal momento che il mondo 3D può essere modificato dal giocatore (quindi le cose possono apparire ovunque nello spazio 3D) - quindi mi è sembrato logico che io sfruttassi il buffer di profondità. Ciò significava che non dovevo preoccuparmi di rendere le cose nell'ordine corretto.
Tuttavia, ho riscontrato un problema. Se lo usi GL_DEPTH_TEST
e GL_BLEND
insieme, crea un effetto in cui gli oggetti si fondono con lo sfondo prima che vengano "ordinati" per ordine z (il che significa che ottieni uno strano tipo di sovrapposizione dove dovrebbe trovarsi la trasparenza).
Ecco alcuni pseudo codici che dovrebbero illustrare il problema (per inciso, sto usando libgdx per Android).
create() {
// ...
// some other code here
// ...
Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
Gdx.gl.glEnable(GL10.GL_BLEND);
}
render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
// ...
// bind texture and create vertices
// ...
}
Quindi la domanda è: come posso risolvere il problema di sovrapposizione della trasparenza?