iPhone OpenGL ES: L'applicazione di un test di profondità sulla texture che hanno pixel trasparenti per il 2D gioco

StackOverflow https://stackoverflow.com/questions/1320399

Domanda

Attualmente, ho miscelazione e il test di profondità accendere per un gioco in 2D. Quando disegno le mie texture, la texture "superiore" rimuovere una parte di tali trame più bassi se si intersecano. Chiaramente, i pixel trasparenti della texture sono presi in considerazione del test di profondità, e cancellare tutti i colori delle trame inferiori prelevate se si intersecano. Inoltre, mischie alfa sono resi in modo errato. ci sono alcun tipo di funzioni che possono dire OpenGL per non includere i pixel trasparenti in test di profondità?

È stato utile?

Soluzione

No, non è possibile. Questo è vero per tutti i test di profondità hardware.

GL (pieno o ES - e D3D) hanno tutti lo stesso modello - dipingono nell'ordine specificato poligoni. Se si disegna un poligono Una prima poligono B, e logicamente POLIGONO A dovrebbe essere di fronte a un poligono B, poligono B non sarà dipinta (per gentile concessione del test di profondità).

La soluzione è quello di disegnare voi poligoni in ordine dal più lontano al più vicino all'origine vista corrente. Fortunatamente in un gioco 2D questo dovrebbe essere solo un semplice sorta (uno che probabilmente non sarà nemmeno bisogno di fare molto spesso).

In 3D giochi BSP sono la soluzione di base a questo problema.

Altri suggerimenti

glEnable( GL_ALPHA_TEST );
glAlphaFunc( GL_EQUAL, 1.0f );

Questa operazione annullerà tutti i pixel con un'alfa di qualcosa di diverso completamente opaco. Questi pixel saranno, quindi, non essere resi alla Z-buffer. Ciò, tuttavia, incide varie ottimizzazioni gasdotti Z-Buffer quindi potrebbe causare alcune gravi rallentamenti. Utilizzare solo se si davvero avere troppo.

se si sta utilizzando shader, potete provare a disabilitare la miscelazione e scartare i pixel con l'alfa 0

if(texColor.w == 0.0)
    discard;

Che tipo di blending stai usando?

glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

dovrebbe impedire eventuali frammenti con alfa di 0 di scrivere nel buffer di profondità.

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