2

非三角形のポリゴンを三角形のポリゴンに転送するためにテッセレーションを使用しています。データを変数に保存し、データの保存中にテッセレーション コードを 1 回実行しようとしています。コードは、保存されたデータを描画関数で描画するために使用します。

スター ポリゴンを描画しようとしています。問題は、いくつかの三角形が表示されるが、スターが表示されないことです。データを保存すると、図面がうまくいかないのはなぜですか?

初期化コードは次のとおりです。

#define callback void(CALLBACK*)()
void Init()
{
    GLdouble star[5][6] = /* star data, The data is 100% perfect */


    glColor3f(0.0f, 1.0f, 0.0f);

    GLUtesselator *pTess = gluNewTess();

    indexNum = 0;
    gluTessCallback(pTess, GLU_TESS_BEGIN,      (callback)glDrowMode);
    gluTessCallback(pTess, GLU_TESS_VERTEX,     (callback)saveData);
    gluTessCallback(pTess, GLU_TESS_ERROR,      (callback)tessError);
    gluTessCallback(pTess, GLU_TESS_COMBINE,    (callback) scbCombine);


    gluTessProperty(pTess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO);
    gluTessBeginPolygon(pTess, NULL); 

    gluTessBeginContour(pTess);
    for(int i = 0; i < 5; i++)
        gluTessVertex(pTess, star[i], star[i]);
    gluTessEndContour(pTess);

    gluTessEndPolygon(pTess);
    gluDeleteTess(pTess);
}

データコードの保存と描画モードの保存:

struct vecStruct
{
    GLdouble *vertex, *color;
};
vecStruct vec[16];


int indexNum = 0;
void CALLBACK saveData(const GLvoid *ptr)
{
    const GLdouble *data = (const GLdouble*)ptr;

    vec[indexNum].vertex = new GLdouble[3];
    vec[indexNum].color = new GLdouble[3];
    vec[indexNum].vertex[0] = data[0];
    vec[indexNum].vertex[1] = data[1];
    vec[indexNum].vertex[2] = data[2];
    vec[indexNum].color[0] = data[3];
    vec[indexNum].color[1] = data[4];
    vec[indexNum].color[2] = data[5];

    indexNum++;
}


GLenum drawMode;
void CALLBACK glDrowMode(GLenum where)
{
    drawMode = where;
}

そして最後に drow 関数:

void vboDraw()
{
    glBegin(drawMode);
    for (int i = 0; i < indexNum; i++)
    {
        glColor3dv(vec[i].color);
        glVertex3dv(vec[i].vertex); 
    }
    glEnd();

}

私が言ったように、私は星を見るべきです:

ここに画像の説明を入力

しかし、私が見ることができるのはいくつかの三角形です:

ここに画像の説明を入力

コードの何が問題になっていますか? テッセレーション コードを 1 回だけ実行するためのデータを保存できないのはなぜですか?

4

0 に答える 0