0

我的 OpenGL ES 应用程序中有以下 Vertex 结构:

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 ++;
    }
 }

谁能发现我在这里做错了什么?当我将此 Vertices 对象传递给 OpenGL 时,不会绘制任何内容,而如果我将 Vertices 数组硬编码为:

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}},
};

一切正常?

4

1 回答 1

1

我认为问题在于,在您在堆栈上分配了一个数组之前,现在您有一个指向堆上内存块的指针(内存地址)。所以当你像sizeof(Vertices)原来的那样写东西时,sizeof(Vertices)会产生 4 个顶点,每个顶点都有 3 个浮点位置和 4 个浮点颜色 -> 4 * (3 + 4) * 4(float = 4 bytes) = 112 bytes。其中sizeof(aPointer)= 4 个字节。OpenGL 是一个 C 库,使用起来并不容易,所以在尝试运行它之前,你应该真正复习一下你的 C 技能。现在还有一GLKView堂课,这将使所有设置分配变得更容易。

glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

尝试分配与顶点数组相同的大小。在你的情况下 4 * sizeof(Vertex)。

glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 4, Vertices, GL_STATIC_DRAW);

如果这不起作用,您可以通过将动态分配的数组替换为静态分配的数组来轻松解决问题,因为您在编译时就知道它需要多大。

Vertex Vertices[4];

然后像你一样设置循环中的值。

于 2013-10-17T17:53:43.850 回答