Я пишу симуляцию частиц, которая использует OpenGL> = 4.3 и натолкнулась на «проблему» (точнее, ее отсутствие), которая меня смущает.
Для части вычислительного шейдера я использую различные GL_SHADER_STORAGE_BUFFERs , которые связаны с точками связывания через glBindBufferBase () .
Один из этих GL_SHADER_STORAGE_BUFFERs также используется в вершинном шейдере для предоставления нормалей, необходимых для рендеринга.Связывание в GLSL как в вычислительном, так и в вершинном шейдерах (они называются шейдерами 1 ниже) выглядит следующим образом:
Часть OpenGL:
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, normals_ssbo);
Часть GLSL:
...
layout(std430, binding = 1) buffer normals_ssbo
{
vec4 normals[];
};
...
Интересно то, что в отдельной программе шейдеров с другим вершинным шейдером (ниже называемый шейдер 2) точка привязки 1 (повторно) используется следующим образом:
GLSL:
layout(location = 1) in vec4 Normal;
но в этом случае нормали происходят из другого объекта буфера, и привязка выполняется с использованием VAO, например:
OpenGL:
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);
Как видите, точка привязки ирасположение данных (оба vec4) одинаковы, но фактические объекты буфера отличаются.
Теперь к моим вопросам:
Почему VAO шейдера 2, который создается и используется после настройки шейдеров 1 (которые используют glBindBufferBase для привязки), перезаписывая (?) точку привязки, но шейдеры 1 все еще помнят привязку SSBO и работают нормально, не вызывая glBindBufferBase перед их использованием?
Как OpenGL узнает, какой из этих двух объектов буфераОбязательный пункт (который в обоих случаях равен 1) следует использовать?Связывающие точки, созданные с помощью VAO и glBindBufferBase , просто полностью разделяют вещи?Если это так, почему что-то вроде этого НЕ работает:
layout(std430, binding = 1) buffer normals_ssbo
{
vec4 normals[];
};
layout(location = 1) in vec4 Normal;