Я создал буфер вершин на этапе «load vulkan» моей программы. он должен быть буфером для всех вершин, независимо от того, какие экземпляры модели могут их использовать. Мое приложение должно иметь возможность загружать вершины во время выполнения в любое время, используя разные смещения для буфера вершин (и, конечно, буфера индекса).vulkan: как использовать один буфер вершин с различными смещениями?
для проверки буфера вершин имеет статический размер 8 вершин, а индексный буфер имеет статический размер 12 индексов.
Я пытаюсь загрузить первый экземпляр модели (4 вершины, 6 индексов), который работает. Я вижу результат на экране. (это квадрат) Тогда я пытаюсь загрузить еще один экземпляр модели (опять же 4 вершины, 6 индексов) (другой квадрат).
проблема: второй экземпляр модели не появится на экране. Я проверил смещения для буфера вершин и буфер индекса. они кажутся правильными. Я знаю, что текстурного изображения для второго экземпляра пока нет, однако должен быть белый квадрат, по крайней мере, потому что цвет смешивания по умолчанию в шейдерах белый. цвет по умолчанию для экрана черный. для тестирования я также изменил его на белый, предположив, что ур-цвета могут быть 0, 0, 0.
так почему же второй экземпляр не отображается на экране? Я прочитал несколько статей, а некоторые предлагают «выполнить командный буфер» после обновления буфера вершин. кроме понимания того, что это значит, это не имело бы смысла, потому что оба экземпляра создаются во время выполнения, и первый работает!
поэтому любая помощь пожалуйста?
вы можете найти исходный код здесь: дизайн
игры, загрузка экземпляров модели: gm_update.cpp
двигатель вещи, Vulkan: de_core.cpp
вершинных шейдеров: шейдеры/stage.vert
фрагмент шейдера: шейдеры/stage.frag
вы можете найти все исходные файлы в этой папке. просто измените имя файла. Я хотел опубликовать образцы кода. но я точно не знаю, где именно ошибка находится в de_core.cpp
Пожалуйста, не публикуйте свой код в виде ссылки, но [MCVE] в своем вопросе, который воспроизводит вашу проблему. –
Да, вы делаете слишком много предположений. Еще одно преимущество минимального примера состоит в том, что вы можете легко поэкспериментировать с такими новыми функциями. ;; Но я вижу в вашем коде 'VkDeviceSize offsets [] = {0};' перед 'vkCmdBindVertexBuffers()' и 'vkCmdBindIndexBuffer() :: offset' = 0 тоже, так что вы вообще не используете смещения. – krOoze