bambooflow Note

ポリゴン上の線描画

最終更新:

bambooflow

- view
メンバー限定 登録/ログイン

ポリゴン上の線描画



地面を(ポリゴンで)描いて、その上に線を引きたいとき、下のように線がうまく見えなくなることがあります。
それを改善する方法をメモします。

失敗した例

茶色の地面に格子状の線を描こうとしたら、z座標が同じなので線が見えたり見えなかったりしています。


void drawGround()
{
    const float gsize = 12.0f;
 
    glDisable(GL_LIGHTING);
    glColor3f( 0.4, 0.3, 0.2 );
 
    glBegin( GL_TRIANGLE_STRIP );
    glNormal3f( 0,0,1 );
    glVertex3f(-gsize,-gsize,0);
    glVertex3f( gsize,-gsize,0);
    glVertex3f(-gsize, gsize,0);
    glVertex3f( gsize, gsize,0);
    glEnd();
}
 
void display(void)
{
    // ・・・
 
    glDisable(GL_LIGHTING);
    // 線描画
    glColor3d(0.0, 0.0, 0.0);
    glBegin(GL_LINES);
    for (int i = -10; i <= 10; i++) {
        glVertex3d((GLdouble)i, -10.0, 0);
        glVertex3d((GLdouble)i,  10.0, 0);
        glVertex3d(-10.0, (GLdouble)i, 0);
        glVertex3d( 10.0, (GLdouble)i, 0);
    }
    glEnd();
 
    // 地面描画
    drawGround();
 
    // ・・・
 



うまく描けた例

用は地面よりも線をちょっと浮かせて表示させています。
ポイントとなるのは、glEnable(GL_POLYGON_OFSET_FILL)とglPolygonOffset。


void display(void)
{
    // ・・・
 
    glDisable(GL_LIGHTING);
    // 線描画
    glColor3d(0.0, 0.0, 0.0);
    glBegin(GL_LINES);
    for (int i = -10; i <= 10; i++) {
        glVertex3d((GLdouble)i, -10.0, 0);
        glVertex3d((GLdouble)i,  10.0, 0);
        glVertex3d(-10.0, (GLdouble)i, 0);
        glVertex3d( 10.0, (GLdouble)i, 0);
    }
    glEnd();
 
    // 地面描画
    glEnable (GL_POLYGON_OFFSET_FILL);
    glPolygonOffset (1.0, 0);
    drawGround();
    glDisable (GL_POLYGON_OFFSET_FILL);
 
    // ・・・
 

ここでglPolygonOffsetの引数の値は、今回適当です。(1.0,1.0)はもっとも単純な値みたいです。




参考

  • http://opengl.jp/oglfaq/polygonoffset.htm

タグ:

OpenGL
記事メニュー
目安箱バナー