OpenGL ES - 更新顶点数组,添加/删除顶点

时间:2011-04-20 01:19:33

标签: ios opengl-es

我想实现功能,以便我可以在运行时向顶点数组添加/删除顶点。 有没有一种常见的方法呢?

顶点数据的推荐格式似乎是结构的C数组, 所以我尝试了以下内容。将指向顶点结构数组的指针保持为属性:

@property Vertex *vertices;

然后创建一个新数组并通过

复制数据
- (void) addVertex:(Vertex)newVertex
{
    int numberOfVertices = sizeof(vertices) / sizeof(Vertex);
    Vertex newArray[numberOfVertices + 1];

    for (int i = 0; i < numberOfVertices; i++) 
        newArray[i] = vertices[i];

    newArray[numberOfVertices] = newVertex;
    self.vertices = newArray;
}

但没有运气。我对C不太自信,所以这可能真的很微不足道。

2 个答案:

答案 0 :(得分:1)

这就是我刚刚做到的:

//verts is an NSMutableArray and I want to have an CGPoint c array to use with 
//  glVertexPointer(2, GL_FLOAT, 0, vertices);... so:

CGPoint vertices[[verts count]];
for(int i=0; i<[verts count]; i++)
{
    vertices[i] = [[verts objectAtIndex:i] CGPointValue];
}

答案 1 :(得分:0)

这是我现在的表现:

// re-allocate the array dynamically. 
// realloc() will act like malloc() if vertices == NULL
Vertex newVertex = {{x,y},{r,g,b,a}};
numberOfVertices++;
vertices = (Vertex *) realloc(vertices, sizeof(Vertex) * numberOfVertices);
if(vertices == NULL) NSLog(@"FAIL allocating memory for vertex array");
else vertices[numberOfVertices - 1] = newVertex;

// clean up memory once i don't need the array anymore
if(vertices != NULL) free(vertices);

我认为上面的icnivad方法更灵活,因为你可以用NSMutableArray做更多的事情,但是使用带有malloc / realloc的普通C数组应该(更多?)更快。