OpenGL顶点数组初始化

时间:2018-10-15 16:16:11

标签: c opengl opengl-3 vertex-buffer

我对OpenGL 3.0有疑问,为什么我的顶点数组初始化为

时为什么我无法绘制任何内容?
float * vertices;
int size = 100; // size of the vertices array
float * vertices = (float *) malloc (size*sizeof(float));

我已经分配了内存,并将数组中的所有值初始化为0.0,但是看来我的顶点缓冲区只读取了顶点数组的第一个元素。而当我像这样初始化数组时:

float vertices[size];

所有顶点均按预期方式读取并渲染。

这是我指定顶点缓冲区并将数据传递到缓冲区的方法:

unsigned int VBO;
glGenBuffers(1, &VBO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STREAM_DRAW);

GLint posAttrib = glGetAttribLocation(ourShader.ID, "aPos");

// iterpreting data from buffer 
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 3* sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

1 个答案:

答案 0 :(得分:4)

sizeof并没有达到您的预期。 sizeof(x)返回变量x的数据类型的大小。

对于int size = 100; float vertices[size];vertices的数据类型为float[100],而sizeof(vertices)返回的数据与sizeof(float)*100相同。

对于float * vertices;vertices的数据类型为float*,而sizeof(vertices)返回指针数据类型的大小,该指针数据类型指向动态分配的数组,但它不会返回动态内存的大小,甚至不会返回分配的数组中元素的数量。指针的大小取决于硬件,并且与sizeof(void*)相同(通常为4或8)。

sizeof(float) * size在以下两种情况下均适用:

glBufferData(GL_ARRAY_BUFFER, sizeof(float)*size, vertices, GL_STREAM_DRAW);