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();
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:
Un mod che ho provato e che cosa ha funzionato alla perfezione è:
- disabilitare lettura profondità, attivare profondità scrittura
- griglia pareggio
- frecce pareggio
- consentono profondità leggere
- 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:
- Perché glPolygonOffset non funziona per le linee-on-lines mentre si lavora per le linee-on-poligono?
- 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
possibile duplicazione di [glPolygonOffset() bug con le linee] (http://stackoverflow.com/questions/2020451/glpolygonoffset-bugs-with- Linee) – genpfault