Я создал буферный объект хранилища шейдеров, чтобы передать информацию моему вершинному шейдеру. Он связан с буфером, содержащим одну структуру. Но есть проблема. Данные, которые я храню в этой структуре, это не простой массив, это std::vector
,
Вот структура:
typedef struct {
glm::mat4 modelMatrix;
} entityInfo;
typedef struct {
std::vector<entityInfo> entityInfoBuffer;
} shaderData;
mat4 — это простая матрица с плавающей точкой 4×4.
Если я передам это OpenGL, данные, передаваемые в GPU, будут просто набором указателей и информацией о матрице / векторе, а не данными в них.
Одним из решений будет создание структуры только для OpenGL:
typedef struct {
float* modelMatrix;
} SSBOentityInfo;
typedef struct {
SSBOentityInfo* entityInfoBuffer;
} SSBOshaderData;
Но мне бы пришлось скопировать eeeeevery указатель, соответствующий данным контейнеров.
Есть ли лучший способ сделать это?
glm::mat4
представляет собой массив из 16 float
s. Не указатель до 16 поплавков, фактический float[16]
массив. 16 float
с, один за другим.
Следовательно, vector<glm::mat4>
управляет непрерывным массивом элементов, где каждый элемент равен 16 плавающим. Это те данные, которые вы хотите сохранить в своем буферном объекте. Итак … сделай это.
vector
управляет непрерывным массивом данных, поэтому совершенно законно получить указатель на этот массив. Это то что vector.data()
для. Так что это указатель источника, который вы даете glBufferSubData
или что угодно. Размером будет количество элементов в массиве (vector.size()
) умножить размер каждого элемента на sizeof
,
Других решений пока нет …