2016-12-11 18 views
0

Я создал буфер вершин на этапе «load vulkan» моей программы. он должен быть буфером для всех вершин, независимо от того, какие экземпляры модели могут их использовать. Мое приложение должно иметь возможность загружать вершины во время выполнения в любое время, используя разные смещения для буфера вершин (и, конечно, буфера индекса).vulkan: как использовать один буфер вершин с различными смещениями?

для проверки буфера вершин имеет статический размер 8 вершин, а индексный буфер имеет статический размер 12 индексов.

Я пытаюсь загрузить первый экземпляр модели (4 вершины, 6 индексов), который работает. Я вижу результат на экране. (это квадрат) Тогда я пытаюсь загрузить еще один экземпляр модели (опять же 4 вершины, 6 индексов) (другой квадрат).

проблема: второй экземпляр модели не появится на экране. Я проверил смещения для буфера вершин и буфер индекса. они кажутся правильными. Я знаю, что текстурного изображения для второго экземпляра пока нет, однако должен быть белый квадрат, по крайней мере, потому что цвет смешивания по умолчанию в шейдерах белый. цвет по умолчанию для экрана черный. для тестирования я также изменил его на белый, предположив, что ур-цвета могут быть 0, 0, 0.

так почему же второй экземпляр не отображается на экране? Я прочитал несколько статей, а некоторые предлагают «выполнить командный буфер» после обновления буфера вершин. кроме понимания того, что это значит, это не имело бы смысла, потому что оба экземпляра создаются во время выполнения, и первый работает!

поэтому любая помощь пожалуйста?

вы можете найти исходный код здесь: дизайн

project: main function

игры, загрузка экземпляров модели: gm_update.cpp

двигатель вещи, Vulkan: de_core.cpp

вершинных шейдеров: шейдеры/stage.vert

фрагмент шейдера: шейдеры/stage.frag

вы можете найти все исходные файлы в этой папке. просто измените имя файла. Я хотел опубликовать образцы кода. но я точно не знаю, где именно ошибка находится в de_core.cpp

+3

Пожалуйста, не публикуйте свой код в виде ссылки, но [MCVE] в своем вопросе, который воспроизводит вашу проблему. –

+0

Да, вы делаете слишком много предположений. Еще одно преимущество минимального примера состоит в том, что вы можете легко поэкспериментировать с такими новыми функциями. ;; Но я вижу в вашем коде 'VkDeviceSize offsets [] = {0};' перед 'vkCmdBindVertexBuffers()' и 'vkCmdBindIndexBuffer() :: offset' = 0 тоже, так что вы вообще не используете смещения. – krOoze

ответ

0

Ссылка на исходный код не работает для меня, но у меня есть предложение. При привязке буферов убедитесь, что вы только вызываете vkBindVertexBuffers один раз за призыв на призыв. он заменяет текущие связанные буферы. Если вам нужно связать несколько буферов, сделайте что-то вроде этого

vkBuffer buffers[2] = {buffer1, buffer2}; 
vkDeviceSize offsets[2] = {0, 0};//offsets of buffers 
vkbindVertexBuffers(commandBuffer, firstInputBindingToUpdate(probably 0), 2, buffers, offsets); 

 Смежные вопросы

  • Нет связанных вопросов^_^