关于c ++:如何在OpenGL中在不进行Z角战斗的情况下在另一条线上绘制一条线

How to draw one line on top of another in OpenGL without Z-fighting

我遇到以下问题。虽然glPolygonOffset非常适合于网格,例如,当我尝试在对象顶部绘制线框轮廓时,它不适用于简单的线条。

这是它对网格的工作方式:

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

mesh

由于某些原因,它不适用于线路。我想要实现的是在网格上绘制坐标框架的箭头。我正在使用与绘制线条时相同的GL_POLYGON_OFFSET_LINE模式,就像我在对象上绘制线框一样。但是,在这种情况下,glPolygonOffset( -1, -1 );绝对没有区别。我已经尝试过使用100之类的巨大值,并且它是相同的。绝对没有效果。这是我在做什么:

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战示例:

lines

我尝试过的一种方法,最有效的方法是:

  • 禁用深度读取,启用深度写入
  • 画网格
  • 画箭头
  • 启用深度读取
  • 画其他物体
  • 但是,这是一个非常特殊的情况,尽管它适用于平坦的网格和箭头,但不适用于形状复杂的其他任何东西。

    我的问题是:

  • 为什么glPolygonOffset不能用于在线,而适用于多边形?
  • 我该如何解决此问题,而不求助于上述技巧,那只能在非常特殊的情况下起作用?
  • //我使用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

    mix


    我猜可能有一个办法是将线画得离观察点更近一点(比方说更接近0.1)。 这应该避免Z战。

    为此,您需要计算从您的点到POV位置的归一化方向向量。 然后以很小的比例缩放它,并将其添加到线点坐标