我的OpenGL ES应用程序中有以下顶点结构:
typedef struct Vertex {
float Position[3];
float Color[4];
} Vertex;
在我的标题中,我然后声明:
Vertex *Vertices;
然后在我的初始化方法中:
int array = 4;
Vertices = (Vertex *)malloc(array * sizeof(Vertex));
然后我稍后按如下方式设置网格,在这种情况下,顶点数组有 4 个顶点:
- (void)setupMesh {
int count = 0;
for (VerticeObject * object in verticesArray) {
Vertices[count].Position[0] = object.x;
Vertices[count].Position[1] = object.y;
Vertices[count].Position[2] = object.z;
Vertices[count].Color[0] = 0.9f;
Vertices[count].Color[1] = 0.9f;
Vertices[count].Color[2] = 0.9f;
Vertices[count].Color[3] = 1.0f;
count ++;
}
}
谁能发现我在这里做错了什么?当我将此顶点对象传递给 OpenGL 时,不会绘制任何内容,而如果我将顶点数组硬编码为:
Vertex Vertices [] = {
{{0.0, 0.0, 0}, {0.9, 0.9, 0.9, 1}},
{{0.0 , 0.0 , 0}, {0.9, 0.9, 0.9, 1}},
{{0.0, 0.0, 0}, {0.9, 0.9, 0.9, 1}},
{{0.0, 0.0, 0}, {0.9, 0.9, 0.9, 1}},
};
一切正常 ?
我认为问题是,在堆栈上分配了一个数组之前,现在您有一个指向堆上内存块的指针(内存地址)。因此,当您使用原始sizeof(Vertices)
之类的东西时sizeof(Vertices)
会导致 4 个顶点,每个顶点保持 3 个浮点位置和 4 个浮点颜色 -> 4 * (3 + 4) * 4(float = 4 字节) = 112 字节。其中 sizeof(aPointer)
= 4 个字节。OpenGL是一个C库,不是很容易使用,所以在尝试运行它之前,你应该真正复习你的C技能。现在在一个GLKView
课上,这将使所有设置分配更容易。
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
尝试分配与顶点数组相同的大小。在您的情况下,4 * 大小(顶点)。
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 4, Vertices, GL_STATIC_DRAW);
如果这不起作用,您可以通过将动态分配的数组替换为静态分配的数组来轻松解决问题,因为您在编译时知道它需要多大。
Vertex Vertices[4];
然后像你一样在循环中设置值。