Объект сцены Vulkan мигает / мерцает во время преобразования с использованием единого буфера - PullRequest
0 голосов
/ 10 октября 2018

У меня проблема при преобразовании (например, вращении) объекта (например, куба) в сцене с использованием унифицированной матрицы MVP.Вращение не является линейным, а края объекта мерцают.Посмотрите это https://drive.google.com/open?id=1L1Dx-LUdTdqvCQ23-o-vlI_yQK_t7l2_

  1. Я использую 3 буфера изображений / кадровых буферов / буферов глубины, по одному буферу команд на каждый кадровый буфер.(Я также пробовал 2,4 и более изображений)

  2. Я пытался использовать один унифицированный буфер для всех 3 буферов команд и отдельные унифицированные буферы для каждого буфера команд.

  3. Текущий режим - VK_PRESENT_MODE_IMMEDIATE_KHR (также я пробовал FIFO_KHR)

  4. Обновление унифицированных буферов синхронизируется событиями в буфере команд и ожиданием очереди ожидания в цикле рисования, чтоблокирует мьютекс для обновления единого буфера.Данные обновляются для всех однородных буферов одновременно в одном вызове функции после того, как цикл рисования разблокирует мьютекс, а буфер команд уведомляет о завершении рисования.

  5. Буферы команд подготавливаются только один раз для каждой стартовой программы, поскольку любые данныевнутренняя часть является константой (например, дескриптор установлен в единый буфер)

  6. единый буфер является видимым и связным хостом, отображаемым при создании

  7. выполняется основной цикл рисованиястандартные операции

    • а) vkAcquireNextImageKHR
    • b) vkWaitForFences для изображения swapchain
    • c) vkResetFences (b) забор
    • d) vkWaitForences дляотправка
    • e) vkResetFences (d) fence
    • f) vkQueueSubmit с предварительно скомпилированным буфером cmd
    • g) vkQueuePresentKHR
    • h) vkQueueWaitIdle
  8. Унифицированные буферы обновляются из основного потока по ключевым событиям.Во время нажатия кнопки я увеличиваю угол Y на 1 градус после этого вызова glm :: rotate с новым углом m_rot_prop.rotation = glm :: rotate (glm :: mat4 (1.0f), glm :: radians (angle.y), glm:: vec3 (0.f, 1.0f, 0.f));Рассчитать новую модель m_model = m_rot_prop.rotation m_trans_prop.transf orm m_scale_prop.scale;После этого эти данные копируются с помощью memcpy на единый указатель буфера.

  9. Изначально цикл рисования и основной поток разделяются.Но я также попытался найти их обоих в главном потоке.

Я ввел такие события:

1) добавил в буфер команд следующее:

vkBeginCommandBuffer...

vkCmdWaitEvents(cmd_buf, 1, &m_data_update_event[image_number],
VK_PIPELINE_STAGE_HOST_BIT,
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_HOST_BIT,
0, nullptr,
0, nullptr,
0, nullptr);

vkCmdSetEvent(cmd_buf, m_draw_progress_event[image_number],
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT);

vkCmdBeginRenderPass....
....
vkCmdEndRenderPass...

vkCmdResetEvent(cmd_buf, m_draw_progress_event[image_number], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT);

2) перед обновлением унифицированного буфера я делаю

m_is_draw_paused = true;
for (uint32_t i = 0; i < m_choosen_swap_chain_details.imagesCount; i++)
{
vkResetEvent(m_logical_device, m_data_update_event[i]);
while (vkGetEventStatus(m_logical_device, m_draw_progress_event[i]) == VK_EVENT_SET)
{
boost::this_thread::sleep_for(boost::chrono::milli seconds(1));
}
}

3) обновляю унифицированный буфер с новой матрицей MVP (униформа - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, VK_SHARING_MODE * 10 * * 5USUS) *)1072 *

for (uint32_t i = 0; i < m_choosen_swap_chain_details.imagesCount; i++)
{
vkSetEvent(m_logical_device, m_data_update_event[i]);
}

Может кто-нибудь знать причину мерцания?

...