Инициализация массива вершин OpenGL - PullRequest
0 голосов
/ 15 октября 2018

У меня есть вопрос об 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 голосов
/ 15 октября 2018

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);
...