Я создаю средство рендеринга частиц, проблема в том, что все позиции моих частиц инкапсулированы в классы, которые интегрируют их с течением времени и делают некоторые другие вещи. Вместо копирования значения в отдельный массив для отображения каждого кадра, я создал точку-структуру, как это, который можно использовать, чтобы указать на все значения сразу:Передача массива плавающих указателей в VBO
typedef struct
{
float *x, *y, *z;
} point;
Я тогда таНосом массива этого же размера как мой массив частиц.
Декларация на вершине:
point *points;
Malloc:
points = malloc(sizeof(point) * [particles count]);
Я тогда Переберите все частицы и копировать адреса каждой позиции к соответствующему указателю так:
for (int i = 0; i < [particles count]; ++i)
{
points[i].x = &[[particles objectAtIndex:i] getPosition].x;
points[i].y = &[[particles objectAtIndex:i] getPosition].y;
points[i].z = &[[particles objectAtIndex:i] getPosition].z;
}
Моя функция определения позиции возвращает векторную структуру (float x, y, z).
Первая проблема я столкнулась с этим состоит в том, что, когда я отображение значений следующим образом:
NSLog(@"%f", *points[0].x);
Вместо чтения значения (например: 0,5), он отображает ее округлую и сведена на нет (так что: - 1.0).
я тогда получить данные в моей VBO так:
glBufferData(GL_ARRAY_BUFFER, sizeof(point) * [particles count], &points[0], GL_DYNAMIC_DRAW);
Я думаю, что это тоже неправильно, но не можете найти какую-либо информацию о том, как передавать указатели на РВО.
GetPosition возвращает структуру значений не указателей, я сохраняю позиции каждой частицы в ее классе. – user22817
Хорошо, я отредактировал ответ, рассматривая это. Не забудьте понять, как работает пропуск по значению на C, это важный факт. –
Как это тогда, когда я создаю простой автономный указатель на значение класса, что, если я изменю значение классов, это также изменится? – user22817