2016-07-27 3 views
1

Я создал объект буфера хранения шейдера, чтобы предоставить информацию моему шейдеру вершин. Он связан с буфером, содержащим единую структуру. Но есть проблема. Данные, хранящиеся в этой структуре, не являются простым массивом, это std::vector.Предоставление контейнеров C++ для OpenGL?

Вот структура:

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 указатель, соответствующий данным контейнеров.

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

+0

Не хотите ли вы просто отправить содержимое 'entityInfoBuffer' на GPU? Вы не хотите копировать указатели ЦП на графический процессор, они ничего не означают для GPU (вы также можете копировать случайные числа). – immibis

+0

Я думаю, что при использовании объекта буфера хранения шейдеров вы должны использовать structs? Я не прав ? Это означало бы, что мне пришлось бы установить 'entityInfoBuffer.data()' в SSBOshaderData 'entityInfoBuffer'? Также OpenGL сможет читать '& mat4 [0] [0]'. – Talesseed

+0

@Talesseed: «* вы должны использовать структуры?» «Почему? Данные - это данные, память - это память, а объекты буфера - объекты буфера. –

ответ

4

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

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

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

+0

Спасибо, я, хотя, что mat4 не был массивом. Однако, что я могу сделать, если я хочу использовать структуры для добавления элементов позже? – Talesseed

+0

@Talesseed: Пока не ясно, что вы имеете в виду, но я уверен, что это другой вопрос, который вы задали здесь. –

+0

Я хотел добавить больше членов в shaderData. Но да, я думаю, это другой вопрос. – Talesseed