Чтобы добавить динамическое освещение в мое приложение, я подумал, что мог бы представить каждый объект отбрасывания теней в виде массива с плавающей точкой (каждые 3 с плавающей точкой — это вектор, и поэтому каждые 9 с плавающей точкой — это треугольник). И поэтому, чтобы отбрасывать ВСЕ возможные тени, мне нужен массив этих массивов (если бы это был C ++, я бы сделал массив векторов).
Есть ли способ построить нечто подобное в glsl шейдере, через SSBO или униформу?
И если нет, как я мог передать эту информацию. Проблема здесь в том, что я не знаю, насколько велико количество треугольников на затенение объекта, поэтому у меня нет способа определить структуру постоянного размера, чтобы сделать мой массив из твердых объектов.
Вы думаете одновременно слишком высокий уровень и слишком низкий уровень. Вы говорите, что вам нужна куча массивов, но вам это не нужно. Что вам нужно, это способ получить данные вершины для определенного объекта в сцене. Это не должно быть закодировано как «массив этих массивов» вообще.
Вместо этого закодируйте его как единый массив данных вершин. Каждый объект имеет индексы, которые указывают местоположение в этом массиве для данных вершин.
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
и требует гораздо меньшего количества ассигнований.
Других решений пока нет …