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();
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ć:
Jeden Hack próbowałem i co działało idealnie brzmi:
- wyłączenie odczytu głębokości, umożliwiają głębokość zapisu
- rysować siatki
- rysować strzałki
- umożliwić głębokość czytać
- 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:
- Dlaczego glPolygonOffset nie działać dla linii na linie, podczas gdy ona pracuje dla linii-on-wielokąta?
- 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
możliwy duplikat błędów [glPolygonOffset() z liniami] (http://stackoverflow.com/questions/2020451/glpolygonoffset-bugs-with- kwestia) – genpfault