Как передать массив структур, изменяющих размер, в шейдер glsl

Чтобы добавить динамическое освещение в мое приложение, я подумал, что мог бы представить каждый объект отбрасывания теней в виде массива с плавающей точкой (каждые 3 с плавающей точкой — это вектор, и поэтому каждые 9 с плавающей точкой — это треугольник). И поэтому, чтобы отбрасывать ВСЕ возможные тени, мне нужен массив этих массивов (если бы это был C ++, я бы сделал массив векторов).

Есть ли способ построить нечто подобное в glsl шейдере, через SSBO или униформу?

И если нет, как я мог передать эту информацию. Проблема здесь в том, что я не знаю, насколько велико количество треугольников на затенение объекта, поэтому у меня нет способа определить структуру постоянного размера, чтобы сделать мой массив из твердых объектов.

1

Решение

Вы думаете одновременно слишком высокий уровень и слишком низкий уровень. Вы говорите, что вам нужна куча массивов, но вам это не нужно. Что вам нужно, это способ получить данные вершины для определенного объекта в сцене. Это не должно быть закодировано как «массив этих массивов» вообще.

Вместо этого закодируйте его как единый массив данных вершин. Каждый объект имеет индексы, которые указывают местоположение в этом массиве для данных вершин.

layout(std430) buffer obj_data
{
uvec2 objects[];
};

layout(std430) buffer vertex_data
{
vec4 vertices[]; //NEVER use `vec3`s in storage blocks
};

objects массив, где каждый uvec2 представляет конкретный объект. x компонент этого uvec2 это смещение в vertices где начинается его вершина данных. А также y количество вершин для чтения, начиная с x,

Так vertices[objects[10].x] первая вершина данных для объекта с индексом 10.

И кстати:

если бы это был C ++, я бы сделал массив векторов

Если бы это был C ++, я бы закодировал его более или менее так же, как и для GLSL: сохраняю все данные вершин в одном массиве и каждый объект ссылается на свой непрерывный фрагмент этого массива. Это более эффективный доступ, чем массив vectorи требует гораздо меньшего количества ассигнований.

2

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

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

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