Я взял следующую декларацию SSBO из вики Khronos:
struct ssbo_data_t
{
int foo;
float bar[42];
float baz[MY_SIZE];
} ssbo_data;
Эта структура данных имеет два массива, один фиксированной длины, другой переменной длины.
То же объявление длясторона CPP была бы идентична, но если быть точным о том, как на самом деле структура памяти, я объявлю это немного по-другому:
struct ssbo_data_t
{
int foo;
float bar*;
float baz*;
} ssbo_data;
Другими словами, на стороне CPP эта структура данных занимает три различных раздела,структура и 2 массива.Поля в структуре просто являются указателями на массивы, которые выглядят примерно так:
Однако я ожидаю, что данные SSBO нуждаются в данныхчтобы перейти к шейдеру, нужно выглядеть следующим образом:
Таким образом, я ожидаю, что если кто-то попытается наивно загрузить текстуру CPP вSSBO, мы получим ошибку, так как мы загружаем не все данные, а просто целое число и два указателя, за которыми следует много памяти, что, скорее всего, не те данные, которые нам нужны (при условии отсутствия ошибки сегментации).
Правильно ли это объяснение?Или в OpenGL есть способ идентифицировать указатели и соответствующим образом загружать их данные в шейдеры?
Если я полностью ошибаюсь, объясните, как на самом деле загружается SSBO в этих случаях.