2012-12-04 2 views
6

Ich habe das folgende Problem. Während glPolygonOffset perfekt für Meshes funktioniert, zum Beispiel, wenn ich versuche, einen Drahtgitter-Umriss über dem Objekt zu zeichnen, funktioniert es nicht für einfache Linien.Wie zeichne ich eine Zeile übereinander in OpenGL ohne Z-Bekämpfung

Hier ist, wie es für Maschen funktioniert:

// 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

Aus irgendeinem Grund ist es nicht für Linien funktioniert. Ich versuche, die Pfeile eines Koordinatenrahmens über ein Gitter zu ziehen. Ich verwende den gleichen GL_POLYGON_OFFSET_LINE-Modus wie beim Zeichnen von Linien, genau wie ich es für das Drahtmodell über das Objekt getan habe. Aber in diesem Fall macht glPolygonOffset(-1, -1); absolut keinen Unterschied. Ich habe es mit riesigen Werten wie 100 probiert und es ist dasselbe. Absolut keine Wirkung. Hier ist, was ich tue:

// 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); 

und ein Beispiel für die Z-Kämpfe ich:

lines

Ein Hack, den ich versucht habe und was funktionierte perfekt ist:

  1. disable Tiefe Lese ermöglichen Tiefe Schreib
  2. draw grid
  3. Unentschieden Pfeile
  4. ermöglichen Tiefe
  5. ziehen andere Objekte

jedoch lesen Sie dies ist ein ganz besonderer Fall und während es für ein flaches Gitter und Pfeile funktioniert, wäre es nicht für so ziemlich alles andere arbeiten mit eine komplexe Form.

Meine Fragen sind:

  1. Warum glPolygonOffset nicht für Linien-on-Linien arbeiten, während es für die Linien-on-Polygon arbeitet?
  2. Wie kann ich es beheben, ohne auf den obigen Hack zurückgreifen, was nur in ganz bestimmten Fällen funktioniert?

// Ich verwende Cinder als Rahmen, aber es sollte keine Rolle spielen, da ich roh OpenGL bin mit Befehlen

aktualisieren

Ich habe die Antwort überprüft im ersten Kommentar und probierte auch diese Methode aus, allerdings funktioniert das auch nicht, da das Ergebnis von der Entfernung zur Kamera abhängt.

//// 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

mögliches Duplikat von [glPolygonOffset() Fehlern mit Linien] (http://stackoverflow.com/questions/2020451/glpolygonoffset-bugs-with- Linien) – genpfault

Antwort

3

Ich denke, ein Hack könnte die Zeile nur ein bisschen näher zum Aussichtspunkt zu ziehen sein (die 0,1 näher sagen lassen). Dies sollte Z-Kämpfe vermeiden.

Um dies zu tun, berechnen Sie den normalisierten Richtungsvektor von Ihrem Punkt zur POV-Position. Dann skalieren Sie es mit einem kleinen Faktor und fügen Sie es Ihren Linienpunktkoordinaten hinzu.