Предоставление контейнеров C ++ для OpenGL?

Я создал буферный объект хранилища шейдеров, чтобы передать информацию моему вершинному шейдеру. Он связан с буфером, содержащим одну структуру. Но есть проблема. Данные, которые я храню в этой структуре, это не простой массив, это 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 указатель, соответствующий данным контейнеров.

Есть ли лучший способ сделать это?

1

Решение

glm::mat4 представляет собой массив из 16 floats. Не указатель до 16 поплавков, фактический float[16] массив. 16 floatс, один за другим.

Следовательно, vector<glm::mat4> управляет непрерывным массивом элементов, где каждый элемент равен 16 плавающим. Это те данные, которые вы хотите сохранить в своем буферном объекте. Итак … сделай это.

vector управляет непрерывным массивом данных, поэтому совершенно законно получить указатель на этот массив. Это то что vector.data() для. Так что это указатель источника, который вы даете glBufferSubData или что угодно. Размером будет количество элементов в массиве (vector.size()) умножить размер каждого элемента на sizeof,

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]