У меня проблема при преобразовании (например, вращении) объекта (например, куба) в сцене с использованием унифицированной матрицы MVP.Вращение не является линейным, а края объекта мерцают.Посмотрите это https://drive.google.com/open?id=1L1Dx-LUdTdqvCQ23-o-vlI_yQK_t7l2_
Я использую 3 буфера изображений / кадровых буферов / буферов глубины, по одному буферу команд на каждый кадровый буфер.(Я также пробовал 2,4 и более изображений)
Я пытался использовать один унифицированный буфер для всех 3 буферов команд и отдельные унифицированные буферы для каждого буфера команд.
Текущий режим - VK_PRESENT_MODE_IMMEDIATE_KHR (также я пробовал FIFO_KHR)
Обновление унифицированных буферов синхронизируется событиями в буфере команд и ожиданием очереди ожидания в цикле рисования, чтоблокирует мьютекс для обновления единого буфера.Данные обновляются для всех однородных буферов одновременно в одном вызове функции после того, как цикл рисования разблокирует мьютекс, а буфер команд уведомляет о завершении рисования.
Буферы команд подготавливаются только один раз для каждой стартовой программы, поскольку любые данныевнутренняя часть является константой (например, дескриптор установлен в единый буфер)
единый буфер является видимым и связным хостом, отображаемым при создании
выполняется основной цикл рисованиястандартные операции
- а) vkAcquireNextImageKHR
- b) vkWaitForFences для изображения swapchain
- c) vkResetFences (b) забор
- d) vkWaitForences дляотправка
- e) vkResetFences (d) fence
- f) vkQueueSubmit с предварительно скомпилированным буфером cmd
- g) vkQueuePresentKHR
- h) vkQueueWaitIdle
Унифицированные буферы обновляются из основного потока по ключевым событиям.Во время нажатия кнопки я увеличиваю угол 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 на единый указатель буфера.
Изначально цикл рисования и основной поток разделяются.Но я также попытался найти их обоих в главном потоке.
Я ввел такие события:
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]);
}
Может кто-нибудь знать причину мерцания?