Как я могу иметь единый буферный блок массива в glsl?

#opengl #glsl

#opengl #glsl

Вопрос:

Ошибка, которую я получаю при следующем объявлении буфера:

Точка привязки для однородного блока должна быть равна или больше 0 и меньше: GL_MAX_UNIFORM_BUFFER_BINDINGS .

Мои GL_MAX_UNIFORM_BUFFER_BINDINGS равны 90. Я хочу 128 из следующих структур:

 layout(binding = 3, std140) uniform lightsBuffer
{
    mat4 viewMatrix;
    vec3 colour;
    float padding;
}lights[128];
  

Кажется, я создал 128 таких структур, каждая в разных точках привязки. Как мне получить массив из 128 структур при привязке 2?

Редактировать: это так:

 layout(binding = 3, std140) uniform lightsBuffer
{
    struct Light
    {
        mat4 viewMatrix;
        vec3 colour;
        float padding;
    }lights[128];
};
  

Комментарии:

1. И если вы собираетесь использовать дополнение, просто используйте vec4 .

2. @Rabbid76 Могу ли я определить структуру Light внутри или я должен заранее определить struct Light { } , а затем сделать то, что вы сказали?

Ответ №1:

Это не структура; это единый блок. Вы можете сказать, потому что вы не использовали ключевое struct слово 😉 Итак, то, что вы создаете, — это массив однородных блоков.

Если вам нужен массив в едином блоке, вы можете создать его, используя стандартный синтаксис:

 layout(...) uniform lightsBuffer
{
    StructName lights[128];
};
  

Где StructName находится ранее определенный struct .

Могу ли я определить легкую структуру внутри

Нет. Зачем вам это нужно?

Комментарии:

1. Я вижу, заранее определите структуру. Он не может быть внутри блока, как я сделал?

2. @Rabbid76 Я имел в виду что-то вроде uniform lightsBuffer { struct Light { float a; } lights[128]; }; Похоже, это сработало в моей программе.

3. @Zebrafish: Тогда у вашего компилятора ошибка. Технически грамматика позволяет это, но в тексте есть явное указание, запрещающее это : » Определения структуры не могут быть вложены внутрь блока »