gluTessVertex(3) ポリゴンの頂点を指定する

書式

void gluTessVertex( GLUtesselator* tess,


GLdouble *location,
GLvoid* data )

delim $$

引き数

tess
location
data

説明

gluTessVertex はプログラムで定義するポリゴンの頂点を記述する。 繰り返して gluTessVertex を呼ぶことで閉じた経路を記述する。 例えば四角形を記述するには、gluTessVertex を 4 回呼ばなければならない。 gluTessVertex を呼ぶことができるのは、gluTessBeginContourgluTessEndContour に挟まれた部分だけである。

data は普通、頂点位置を格納している構造体を指す。 この構造体は、色や法線など、各頂点が持つ属性も持つ。 テセレーション処理(gluTessCallback の項目を参照)の後、このポインタは GLU_TESS_VERTEXGLU_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);

注意

ローカル変数を locationdata に使い、ループの一部として その変数に値を格納してしまうことはよくある誤りである。 例えば、 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);
  }

はうまく動作しない。 locationdata が指定しているポインタは gluTessEndPolygon が実行されるまで参照が切れないかもしれないの で、ループの最後の繰り返しで指定されたもの以外の頂点座標は、 テセレーション処理が始まる前に上書きされるかもしれない。

この問題がある時によく起こる 2 つの症状は、点がひとつしか表示されない こと(data に対して局所変数が使われている時)と、 GLU_TESS_NEED_COMBINE_CALLBACK エラーが起こること (location に対して局所変数が使われている時)である。