#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: Тогда у вашего компилятора ошибка. Технически грамматика позволяет это, но в тексте есть явное указание, запрещающее это : » Определения структуры не могут быть вложены внутрь блока »