2013-10-17 40 views
0

我在我的OpenGL ES应用中的以下顶点结构:正在初始化一个C结构阵列 - 目标C - OpenGLES

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

一切正常?

+0

当您在初始化后检查调试器中的第一个数组时,它看起来像您期望的那样吗? (即,它看起来与第二种情况相同吗?) –

+0

另外,你如何初始化verticesArray? – micantox

+0

本 - 是的 - 数组看起来不错。 – GuybrushThreepwood

回答

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 * sizeof(顶点)。

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

如果不工作,你可以轻松地修复更换您的动态分配的数组的一个静态分配的,因为你知道在编译的时候,它需要有多大是问题。

Vertex Vertices[4]; 

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