1

GLUtesselatorを使用して、いくつかの非凸ポリゴンを塗りつぶしています。

それは非常にうまく機能しましたが、いくつかのポリゴンでは、結合関数が必要であると不平を言ったので、新しい頂点を割り当てて座標をコピーするだけの非常に単純なGLU_TESS_COMBINEコールバックを提供しました(単色の2Dなので、必要ありませんRGB値などを補間するには):

void CALLBACK tessCombine( GLdouble coords[3], GLdouble * vertex_data[4], GLfloat weight[4], GLdouble **outData )
{
    GLdouble *vertex = new GLdouble[3];
    vertex[0] = coords[0];
    vertex[1] = coords[1];
    vertex[2] = coords[2];
    *outData = vertex;
}

これですべてが期待どおりにレンダリングされますが、明らかにメモリリークが発生します。ドキュメントによると:

別の頂点を割り当てます。[...]gluTessEndPolygonを呼び出した後、いつかメモリを解放します。

しかし、私が見つけたすべての例では、メモリの処理方法を示していません。コールバックはフリー関数であり、そこに割り当てられたメモリを解放する方法はありませんか?

私が考えることができる唯一の方法は、それらをどこかに保存してから、自分で削除することです。これは正しい方法ですか?

4

1 に答える 1

3

この OpenGL テッセレーション チュートリアルをご覧ください。

ポイントは、コールバックにメモリを割り当てないことです (そうしないと、メモリ リークが発生します)。代わりに、頂点データをコールバックのメモリ ロケーションにコピーする必要があります (例で行われているように)。どこから頂点データをコピーするかはあなた次第です。

これは、コールバック関数がそのでどのように見えるかです:

void CALLBACK tessCombineCB(const GLdouble newVertex[3], const GLdouble *neighborVertex[4],
                            const GLfloat neighborWeight[4], GLdouble **outData)
{
    // copy new intersect vertex to local array
    // Because newVertex is temporal and cannot be hold by tessellator until next
    // vertex callback called, it must be copied to the safe place in the app.
    // Once gluTessEndPolygon() called, then you can safly deallocate the array.
    vertices[vertexIndex][0] = newVertex[0];
    vertices[vertexIndex][1] = newVertex[1];
    vertices[vertexIndex][2] = newVertex[2];

    // compute vertex color with given weights and colors of 4 neighbors
    // the neighborVertex[4] must hold required info, in this case, color.
    // neighborVertex was actually the third param of gluTessVertex() and is
    // passed into here to compute the color of the intersect vertex.
    vertices[vertexIndex][3] = neighborWeight[0] * neighborVertex[0][3] +   // red
                               neighborWeight[1] * neighborVertex[1][3] +
                               neighborWeight[2] * neighborVertex[2][3] +
                               neighborWeight[3] * neighborVertex[3][3];
    vertices[vertexIndex][4] = neighborWeight[0] * neighborVertex[0][4] +   // green
                               neighborWeight[1] * neighborVertex[1][4] +
                               neighborWeight[2] * neighborVertex[2][4] +
                               neighborWeight[3] * neighborVertex[3][4];
    vertices[vertexIndex][5] = neighborWeight[0] * neighborVertex[0][5] +   // blue
                               neighborWeight[1] * neighborVertex[1][5] +
                               neighborWeight[2] * neighborVertex[2][5] +
                               neighborWeight[3] * neighborVertex[3][5];


    // return output data (vertex coords and others)
    *outData = vertices[vertexIndex];   // assign the address of new intersect vertex

    ++vertexIndex;  // increase index for next vertex
}
于 2012-09-04T07:26:39.470 に答える