PDA

View Full Version : OpenGL depth buffer: chiarimenti


DesmoColo
11-02-2005, 01:04
Ciao a tutti.
Vorrei un chiariemento sull'output di queste righe di codice;

void DrawMyScene()
{

stanza.drawGLStanza
glDepthFunc(GL_ALWAYS);
pallina.drawGLPallina();
glDepthFunc(GL_LESS);
}
Per essere più chiari,quello che voglio ottenere è una pallina texturirizza all'interno di una stanza che sia sempre visibile, anche quando sia dietro un muro (la texture non importa che si veda in tal caso). So già che con le righe di codice sopra indicate disabilito il temporaneamente il depth buffer e faccio disegnare prima di ogni cosa la mia pallina (almeno così mi hanno spigato! :-)) Non capisco perchè, se mi trovo in una stanza senza muri, la texture della pallina a volte scompare e riappare mentre questa è in movimento e si vede la pallina con delle righe nere. Come posso evitare questo effetto?
Avrei pensato di disegnare intorno alla sfera un cerchietto trasparente con il depth buffer disabilitato,e di tenerlo abilitato sul resto della sfera, ma non ho la minima idea di come fare.

71104
11-02-2005, 17:02
La glDepthFunc imposta il criterio in base al quale viene utilizzato il depth buffer, ovvero il buffer dove OpenGL mantiene la profondità di ciascun pixel (non so se è corretto chiamarlo pixel, forse "frammento" sarebbe + corretto, ma non sono sicuro).
Quindi nel codice che hai postato, la stanza viene disegnata per intero (la profondità dei poligoni viene ignorata, se c'è un poligono che sta dietro a un altro, potrebbe venire disegnato davanti), mentre della pallina vengono disegnati solo i poligoni che stanno davanti e che coprono quelli che stanno dietro, perché prima di disegnare la pallina viene reimpostato il criterio per l'uso del depth buffer. Poi il programma ce l'hai tu, quindi tu sai qual'è il suo effetto grafico finale :p
Ciao

71104
11-02-2005, 17:05
Scusa, avevo letto male il messaggio: ho letto male il codice e non ho letto la seconda parte :D :p
Allora, se disabiliti il depth buffer, la pallina viene disegnata sopra la stanza, ma circa metà dei poligoni che compongono la parte posteriore della pallina potrebbero essere disegnati davanti a quelli che compongono la parte anteriore; ecco spiegato lo strano effetto grafico.
Il fatto è che la scena che vorresti disegnare è incoerente: dovresti disegnare davanti una cosa che in realtà sta dietro! Secondo me quello che devi fare è lasciar perdere il depth buffer e lavorare sulle matrici: al momento del disegno della pallina la matrice (modelview o projection, vedi un po' tu :p) deve fare in modo che il solido disegnato stia davanti a tutto, ma le dimensioni devono essere appropriate affinché la pallina appaia piccola e sembri lontana... spero di essermi spiegato bene :p

Ri-ciao

DesmoColo
12-02-2005, 12:29
Ho risolto con un piccolo trucco: Ho disegnato attorno alla mia pallina due cerchietti neri paralleli tra loro con il depth buffer impostato come nel precente post e ho cammuffato il tutto mettendoci sopra la texture di una palla da basket:D
Ti ringrazio molto perch almeno adesso ho un 'idea più chiara di come si usa il depth buffer!