ポリゴン上の線描画
地面を(ポリゴンで)描いて、その上に線を引きたいとき、下のように線がうまく見えなくなることがあります。
それを改善する方法をメモします。
それを改善する方法をメモします。
失敗した例
茶色の地面に格子状の線を描こうとしたら、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。
ポイントとなるのは、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