How to draw one line on top of another in OpenGL without Z-fighting
我遇到以下问题。虽然
这是它对网格的工作方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // 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(); |
由于某些原因,它不适用于线路。我想要实现的是在网格上绘制坐标框架的箭头。我正在使用与绘制线条时相同的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | // 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 ); |
还有我得到的Z战示例:
我尝试过的一种方法,最有效的方法是:
但是,这是一个非常特殊的情况,尽管它适用于平坦的网格和箭头,但不适用于形状复杂的其他任何东西。
我的问题是:
//我使用Cinder作为框架,但这没关系,因为我使用的是原始OpenGL命令
更新资料
我已经在第一条评论中检查了答案,并尝试了该方法,但是该方法也不起作用,因为结果取决于与相机的距离。
1 2 3 4 5 6 7 8 9 | //// 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 |
我猜可能有一个办法是将线画得离观察点更近一点(比方说更接近0.1)。 这应该避免Z战。
为此,您需要计算从您的点到POV位置的归一化方向向量。 然后以很小的比例缩放它,并将其添加到线点坐标