C语言 OpenGL 顶点数组初始化



我有一个关于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);
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);

最新更新