2012-12-04 13 views
6

Sto avendo il seguente problema. Mentre glPolygonOffset funziona perfettamente per le mesh, ad esempio quando sto cercando di disegnare una struttura wireframe sopra l'oggetto, non funziona per le linee semplici.Come disegnare una riga sopra un'altra in OpenGL senza Z-fighting

Ecco come funziona per le maglie:

// draw object 
mTexture.enableAndBind(); 
gl::color(Colorf(1, 1, 1)); 
gl::draw(mVboMesh); 
mTexture.unbind(); 

// overlay wireframe 
gl::enableWireframe(); 
glLineWidth(1); 
glEnable(GL_POLYGON_OFFSET_LINE); 
glPolygonOffset(-1, -1); 
glColor3f(0, 0, 1); 
gl::draw(mVboMesh); 
glDisable(GL_POLYGON_OFFSET_LINE); 
gl::disableWireframe(); 

mesh

Per qualche ragione non funziona per le linee. Quello che sto cercando di ottenere è disegnare le frecce di una cornice di coordinate su una griglia. Sto usando la stessa modalità GL_POLYGON_OFFSET_LINE come quando stavo disegnando linee, proprio come stavo facendo per il wireframe sull'oggetto. Tuttavia in questo caso lo glPolygonOffset(-1, -1); non fa assolutamente alcuna differenza. L'ho provato con valori enormi come 100 ed è lo stesso. Assolutamente nessun effetto. Qui è quello che sto facendo:

// enable 3D rendering 
gl::enable(GL_CULL_FACE); 
gl::enableDepthRead(); 
gl::enableDepthWrite(); 

// drawing the grid 
int size = 2000; 
int step = 25; 
gl::color(Colorf(0.2f, 0.2f, 0.2f)); 
for(float i = -size; i <= size; i += step) 
{ 
    glBegin(GL_LINES); 
    glVertex3f(i, 0, -size); 
    glVertex3f(i, 0, size); 
    glVertex3f(-size, 0, i); 
    glVertex3f(size, 0, i); 
    glEnd(); 
} 

// drawing the arrows 
glEnable(GL_POLYGON_OFFSET_LINE); 
glPolygonOffset(-1, -1); 

glBegin(GL_LINES); 
gl::color(Colorf(1, 0, 0)); 
glVertex3f(0, 0, 0); 
glVertex3f(100, 0, 0); 
gl::color(Colorf(0, 1, 0)); 
glVertex3f(0, 0, 0); 
glVertex3f(0, 100, 0); 
gl::color(Colorf(0, 0, 1)); 
glVertex3f(0, 0, 0); 
glVertex3f(0, 0, 100); 
glEnd(); 

glDisable(GL_POLYGON_OFFSET_LINE); 

// disable 3D rendering 
gl::disableDepthWrite(); 
gl::disableDepthRead(); 
gl::disable(GL_CULL_FACE); 

e un esempio di Z-fighting ottengo:

lines

Un mod che ho provato e che cosa ha funzionato alla perfezione è:

  1. disabilitare lettura profondità, attivare profondità scrittura
  2. griglia pareggio
  3. frecce pareggio
  4. consentono profondità leggere
  5. disegnare altri oggetti

Tuttavia questo è un caso molto speciale e mentre lavora per una griglia piatta e le frecce, che non avrebbe funzionato per praticamente qualsiasi altra cosa con una forma complessa.

Le mie domande sono:

  1. Perché glPolygonOffset non funziona per le linee-on-lines mentre si lavora per le linee-on-poligono?
  2. Come posso risolvere il problema, senza ricorrere al trucco precedente, cosa funziona solo in casi molto specifici?

// sto usando Cinder come un quadro, ma non dovrebbe avere importanza dal momento che sto usando OpenGL prime comandi

Aggiornamento

ho controllato la risposta nel primo commento, e ha provato anche questo metodo, tuttavia non funziona neanche, dal momento che il risultato dipende dalla distanza dalla fotocamera.

//// draw coordinate frame and grid 
glDepthRange (0.01, 1.0); 
drawGrid(2000.0f, 25.0f); 
glDepthRange (0.0, 0.99); 
gl::drawCoordinateFrame(100.0f, 5.0f, 2.0f); 

glDepthRange (0.0, 1.0); 

// draw object 

mix

+1

possibile duplicazione di [glPolygonOffset() bug con le linee] (http://stackoverflow.com/questions/2020451/glpolygonoffset-bugs-with- Linee) – genpfault

risposta

3

immagino un hack potrebbe essere quella di disegnare la linea solo un po 'più vicino al punto di vista (diciamo 0,1 più vicino). Questo dovrebbe evitare z-fighting.

Per fare ciò, si calcola il vettore direzionale normalizzato dal punto in cui si trova la posizione POV. Poi lo ridimensiona con un piccolo fattore e lo aggiungi alle coordinate del tuo punto di linea

Problemi correlati