В настоящее время мне поручено преобразовать базу кода OpenGL в Vulkan, но теперь я наткнулся на проблему с тем, как этот код использует вершинные буферы, потому что он очень динамически изменяет компоновку, чтобы обращаться к нему как к большому массиву кадров.
Для рендеринга своих анимированных моделей он устанавливает один большой буфер, содержащий все данные для всей модели, и вызывает следующую функцию, чтобы настроить все это:
void SetupVertexBufferFormat(unsigned int frame1, unsigned int frame2)
{
glVertexAttribPointer(PositionAttr, 3, GL_FLOAT, false, sizeof(Vertex), &vNull[frame1].x);
glVertexAttribPointer(TexcoordAttr, 2, GL_FLOAT, false, sizeof(Vertex), &vNull[frame1].u);
glVertexAttribPointer(Position2Attr, 3, GL_FLOAT, false, sizeof(Vertex), &vNull[frame2].x);
glVertexAttribPointer(NormalAttr, 4, GL_INT_2_10_10_10_REV, true, sizeof(Vertex), &vNull[frame1].packedNormal);
glVertexAttribPointer(Normal2Attr, 4, GL_INT_2_10_10_10_REV, true, sizeof(Vertex), &vNull[frame2].packedNormal);
}
Что хорошо и хорошоOpenGL, но в Vulkan макет буфера вершин является частью объекта конвейера!Это означает, что портирование установки потребует создания и уничтожения нескольких конвейеров на кадр, поскольку значения frame1 и frame2 могут быть почти случайно скомбинированы.
Что нельзя сделать, это изменить содержимое буфера, которое генерируется внешним интерфейсом, которыйЗапрещено, потому что он все еще должен работать с существующим бэкэндом OpenGL.
Есть ли способ обойти это или какой-то сложный конвейер управления единственная опция здесь?