Что происходит при загрузке структуры с массивом в SSBO? - PullRequest
0 голосов
/ 26 мая 2018

Я взял следующую декларацию 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 массива.Поля в структуре просто являются указателями на массивы, которые выглядят примерно так:

enter image description here

Однако я ожидаю, что данные SSBO нуждаются в данныхчтобы перейти к шейдеру, нужно выглядеть следующим образом:

enter image description here

Таким образом, я ожидаю, что если кто-то попытается наивно загрузить текстуру CPP вSSBO, мы получим ошибку, так как мы загружаем не все данные, а просто целое число и два указателя, за которыми следует много памяти, что, скорее всего, не те данные, которые нам нужны (при условии отсутствия ошибки сегментации).

Правильно ли это объяснение?Или в OpenGL есть способ идентифицировать указатели и соответствующим образом загружать их данные в шейдеры?

Если я полностью ошибаюсь, объясните, как на самом деле загружается SSBO в этих случаях.

1 Ответ

0 голосов
/ 26 мая 2018

Другими словами, на стороне CPP эта структура данных занимает три различных раздела, структуру и 2 массива.

Нет, это не так.Массивы и указатели не одно и то же .sizeof(int[20]) эквивалентно sizeof(int) * 20.Принимая во внимание, что sizeof(int*) не эквивалентно sizeof(int[20]) или sizeof(int) * 20.

Элементы массива структур данных занимают хранение на месте, как и любой другой подобъект члена.

...