0

我正在使用 OpenGL 在网格上实现 Catmull-Clark 细分。我可以很好地绘制我的网格,并且我使用顶点数组来绘制。

我绘制的数组称为 extraVert1[]。

为了实现这种细分,除了用于绘制的顶点之外,我还必须对某些点进行操作。我已经实现了标准的半边数据结构,以便遍历网格的边缘并生成细分所需的边缘点。

问题在这里

当我计算边缘点时,我将它们存储到一个顶点数组中,并将对应的面点指向这个边缘点顶点(其中每个面指向4个)。

代码片段如下(edgeAry1[]为半边数组)

    edgePoint1[j].x = (edgeAry1[i].end->x + edgeAry1[i].next->next->next->end->x + edgeAry1[i].heFace->center.x + edgeAry1[i].opp->heFace->center.x) / 4.0;
    edgePoint1[j].y = (edgeAry1[i].end->y + edgeAry1[i].next->next->next->end->y + edgeAry1[i].heFace->center.y + edgeAry1[i].opp->heFace->center.y) / 4.0;
    edgePoint1[j].z = (edgeAry1[i].end->z + edgeAry1[i].next->next->next->end->z + edgeAry1[i].heFace->center.z + edgeAry1[i].opp->heFace->center.z) / 4.0;

    faceAry1[i].e = &edgePoint1[j];
    j++;

当这段代码执行时(它循环遍历 faceAry1[] 中的每个面),我在网格中心周围得到随机边和三角形,即使我从未对我从中绘制的数组 extraVert1[] 进行任何更改。

我认为这与我的指针有关,所以我单独注释掉了每个操作数,它们都没有改变任何东西。然后我将每一行设置为仅等于 4.0。这给了我一个额外的三角形,点 [大约] (0,0,0), (4,0,0), (4,4,4)。

调试时,我在这段代码之前和之后都遍历了 extraVer1[] 数组。它保持不变。我的绘图代码是:(extraVert 的尺寸为 408)

glEnableClientState(GL_VERTEX_ARRAY);

 glVertexPointer(3, GL_FLOAT, 0, extraVert1);

 glDrawArrays(GL_QUADS, 0, 408);

glDisableClientState(GL_VERTEX_ARRAY);

同样,我没有以任何方式修改绘图数组 extraVert1[],所以我完全不知道为什么会发生这种情况。如果有人有兴趣回答,我相信我需要提供更多信息,所以请随时询问。直到那时,我将继续努力。

更新

似乎使用一个足够大的不同数组来存储这些值(在本例中为 extraVert2[])。问题似乎是覆盖内存之一,但我不确定具体如何。当我的数组声明如下:

face faceAry1[34];
float extraVert1[408];
halfEdge edgeAry1[136];
vertex edgePoint1[136];
vertex extraVert2[1632];

我可以毫无问题地将信息存储在 extraVert2[] 中。如果我颠倒 extraVert2[] 和 edgePoint1[] 的顺序,我会遇到和以前一样的问题。有谁知道这是什么原因?

4

1 回答 1

0

虽然我不知道 3D 渲染是如何工作的,但随机边和三角形通常来自未初始化的变量悬空指针。这两个通常是我的程序中意外随机行为的原因。我也认为这与您的指针有关,但由于我不了解 3D 渲染,它也可能与任何特定于 3D 的上下文有关。

于 2013-05-02T21:03:48.977 回答