Come posso usare i test di profondità e la trasparenza delle trame insieme nel mio mondo 2.5D?


11

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_TESTe GL_BLENDinsieme, 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).

problema di sovrapposizione della 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?


2
Solo un commento per dirti che sono andato esattamente come te per il mio motore 2D: prima cercando di essere io stesso intelligente e riordinando le tessere Z, poi realizzando che non c'era motivo per cui la scena dovesse essere piatta, dando così alle mie piastrelle un Coordinata Z e attivazione del test alfa. Non sono sicuro di avere ragione, ma non sei solo :-)
sam hocevar l'

Risposte:


7

OK, quindi ecco la mia soluzione (per favore commenta se può essere fatto meglio) ...

Si scopre che dovrei effettivamente utilizzare i test alfa (tuttavia, l'ho scoperto per caso, quindi non sono del tutto sicuro del perché funzioni).

create() {
    // ...
    // some other code here
    // ...

    Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL10.GL_ALPHA_TEST);
}

render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    Gdx.gl10.glAlphaFunc(GL10.GL_GREATER, 0);

    // ...
    // bind texture and create vertices
    // ...
}

Si noti l'uso di GL_ALPHA_TESTe glAlphaFunc.


Ha risolto anche il mio problema. Grazie per la condivisione. Sei fantastico
Mathlover, il

2

Il test alfa viene utilizzato per interrompere il rendering del pixel di disegno su qualsiasi buffer, incluso il buffer z. La fusione alfa è solo una cosa visiva - i valori sono ancora scritti nello zbuffer, il che può causare problemi come questo - i pixel invisibili sono davanti ai pixel successivamente resi, il che significa che falliranno lo ztest quando disegnerai i nuovi pixel. Questo è ciò che puoi vedere nell'immagine che hai dato, un fallimento ztest.

Disattivando la scrittura z otterrai anche gli stessi fini, ma devi assicurarti di riportare tutto in primo piano. Questo dovrebbe essere abbastanza facile da fare nel tuo gioco isometrico.


1
Penso che disegnare cose da dietro in avanti sia facile in un gioco iso 2D solo quando hai un piano Y fisso e il progettista ha il pieno controllo del mondo. Tuttavia, quando le cose possono esistere ovunque nello spazio 3D e si consente all'utente di cambiare le cose, diventa più complicato. Penso che usare il buffer di profondità mi renderà la vita molto più semplice.
Nick Bolton,
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.