書式
void gluTessVertex( GLUtesselator* tess,
GLdouble *location,
GLvoid* data )
delim $$
引き数
- tess
- location
- data
説明
gluTessVertex はプログラムで定義するポリゴンの頂点を記述する。 繰り返して gluTessVertex を呼ぶことで閉じた経路を記述する。 例えば四角形を記述するには、gluTessVertex を 4 回呼ばなければならない。 gluTessVertex を呼ぶことができるのは、gluTessBeginContour と gluTessEndContour に挟まれた部分だけである。data は普通、頂点位置を格納している構造体を指す。 この構造体は、色や法線など、各頂点が持つ属性も持つ。 テセレーション処理(gluTessCallback の項目を参照)の後、このポインタは GLU_TESS_VERTEX や GLU_TESS_VERTEX_DATA コールバック経由で ユーザに返される。
使用例
三角形の穴が開いた四角形は以下のように記述できる:
gluTessBeginPolygon(tobj, NULL);
gluTessBeginContour(tobj);
gluTessVertex(tobj, v1, v1);
gluTessVertex(tobj, v2, v2);
gluTessVertex(tobj, v3, v3);
gluTessVertex(tobj, v4, v4);
gluTessEndContour(tobj);
gluTessBeginContour(tobj);
gluTessVertex(tobj, v5, v5);
gluTessVertex(tobj, v6, v6);
gluTessVertex(tobj, v7, v7);
gluTessEndContour(tobj);
gluTessEndPolygon(tobj);
注意
ローカル変数を location や data に使い、ループの一部として その変数に値を格納してしまうことはよくある誤りである。 例えば、 for (i = 0; i < NVERTICES; ++i) {GLdouble data[3];
data[0] = vertex[i][0];
data[1] = vertex[i][1];
data[2] = vertex[i][2];
gluTessVertex(tobj, data, data);
}
はうまく動作しない。 location や data が指定しているポインタは gluTessEndPolygon が実行されるまで参照が切れないかもしれないの で、ループの最後の繰り返しで指定されたもの以外の頂点座標は、 テセレーション処理が始まる前に上書きされるかもしれない。
この問題がある時によく起こる 2 つの症状は、点がひとつしか表示されない こと(data に対して局所変数が使われている時)と、 GLU_TESS_NEED_COMBINE_CALLBACK エラーが起こること (location に対して局所変数が使われている時)である。