У меня есть какой-то старый код, использующий OpenGL 1.1, который таинственным образом является segfaulting. Единственное, где я могу ошибаться, это то, что я free()
массив после предоставления его glNormalPointer
. Это разрешено, или OpenGL требует памяти на этом указателе, чтобы остаться? Я предполагал, что данные были скопированы.
double vertices[] = { ... };
double *normals = (double *)malloc(sizeof(vertices));
CalcNormals(vertices, normals, num_vertices); // Calculate the normal vectors.
GLuint my_display_list = glGenLists(1);
glNewList(my_display_list, GL_COMPILE);
glVertexPointer(3, GL_DOUBLE, 0, vertices);
glNormalPointer(GL_DOUBLE, 0, normals);
glDrawArrays(GL_TRIANGLES, 0, num_vertices);
glEndList();
free(normals); // Is this permitted?
// ...
glCallList(winglist);
РЕДАКТИРОВАТЬ 1: Я заметил несколько ссылок, которые говорят, что glNormalPointer и другие "команды состояния клиента" не могут быть включены в список отображения. Я предполагаю, что в этом случае включение glVertexPointer
и glNormalPointer
между glNewList
и glEndList
, вероятно, не причинит вреда, но я мог бы также сместить их вверх, чтобы это произошло до glNewList
. Это вызов glDrawArrays
, который действительно записывается в списке отображения, верно?
РЕДАКТИРОВАТЬ 2: Я пытался вызвать memset(normals, 0, sizeof(vertices))
, чтобы принудительно очистить буфер нормалей перед его освобождением, чтобы сделать использование послеСвободная ситуация более очевидна. Поскольку сцена по-прежнему рисуется правильно, я делаю вывод, что выделенный мною буфер нормалей не используется после вызова glDrawArrays
.