2012-12-04 20 views
6

Mam następujący problem. Podczas gdy glPolygonOffset działa idealnie na siatkę, na przykład gdy próbuję narysować kontur siatki na wierzchu obiektu, nie działa on dla prostych linii.Jak narysować jedną linię na drugiej w OpenGL bez walki Z

Oto jak to działa na siatkach:

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

Z jakiegoś powodu nie działa na liniach. To, co próbuję osiągnąć, polega na narysowaniu strzałek układu współrzędnych na siatce. Używam tego samego trybu GL_POLYGON_OFFSET_LINE, jak podczas rysowania linii, tak jak robiłem dla modelu krawędziowego nad obiektem. Jednak w tym przypadku glPolygonOffset(-1, -1); nie ma absolutnie żadnej różnicy. Wypróbowałem to z ogromnymi wartościami, jak 100 i to jest to samo. Absolutnie bez efektu. Oto, co robię:

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

i przykładem Z-walk uzyskać:

lines

Jeden Hack próbowałem i co działało idealnie brzmi:

  1. wyłączenie odczytu głębokości, umożliwiają głębokość zapisu
  2. rysować siatki
  3. rysować strzałki
  4. umożliwić głębokość czytać
  5. rysować innym obiektom

Jednak jest to bardzo szczególny przypadek, a jednocześnie działa na płaskiej siatki i strzały, to nie będzie działać na prawie niczego innego z złożony kształt.

Moje pytania są następujące:

  1. Dlaczego glPolygonOffset nie działać dla linii na linie, podczas gdy ona pracuje dla linii-on-wielokąta?
  2. Jak mogę to naprawić, bez uciekania się do powyższego hacka, co działa tylko w bardzo szczególnych przypadkach?

// Używam żużel jako ramy, ale to nie powinno mieć znaczenia, ponieważ używam surowego OpenGL polecenia

Aktualizacja

Sprawdziłem odpowiedź w pierwszym komentarzu i wypróbowałem również tę metodę, jednak ta też nie działa, ponieważ wynik zależy od odległości od kamery.

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

możliwy duplikat błędów [glPolygonOffset() z liniami] (http://stackoverflow.com/questions/2020451/glpolygonoffset-bugs-with- kwestia) – genpfault

Odpowiedz

3

Chyba jeden Hack może być, aby narysować linię po prostu nieco bliżej punktu widzenia (powiedzmy 0,1 bliżej). To powinno unikać z-walk.

W tym celu należy obliczyć znormalizowany wektor kierunkowy z punktu do pozycji POV. Następnie przeskaluj go z małym współczynnikiem i dodaj do swojego współrzędnych punktu linii:

Powiązane problemy