В настоящее время я реализую метод отбора окклюзии (CHC ++) в Vulkan и столкнулся с довольно странной проблемой при использовании запросов окклюзии. Чтобы указать c, некоторые сетки не отображаются полностью при представлении фрейма, но все правильно при попытке отладки с помощью Nvidia Nsight или RenderDo c. Это происходит при низкой частоте кадров и вызывает много «мерцания».
Это также происходит только в том случае, если у меня есть более одного кадра в полете. У меня есть пул запросов для каждого кадра в полете с 5000 запросов окклюзии каждый. В каждом фрейме я сначала сбрасываю все запросы пула запросов фрейма. Затем я пересекаю сцену спереди назад, отрисовываю ее часть и запрашиваю некоторые объекты. Затем я отрисовываю следующую часть и снова запрашиваю, пока не отрендерю / протестирую все. Между тем я проверяю, выполнен ли запрос уже, и обрабатываю его результат. В конце кадра я обрабатываю оставшиеся запросы и отрисовываю прозрачные объекты. Рендеринг и запросы выполняются в нескольких отправках командного буфера и синхронизируются семафорами (этап ожидания не имеет значения для этой проблемы), поскольку буферы команд генерируются во время выполнения и различаются для каждого кадра.
Вот как выглядит мой конвейер рендеринга как в принципе:
Start of frame
Reset queries of the frame
Render skybox
Submit commandbuffer
Traverse scene front-to-back
if my number of objects to test for occlusion exceed a batch limit
render objects that I already traversed
submit
query objects that need testing
submit
handle completed queries
handle remaining queries
render transparent objects
submit
present frame
Проблема, кажется, вызвана использованием тех же запросов, что и в предыдущем кадре (которые я предварительно сбрасывал, конечно), потому что, если я использовал как 100 запросов, кадр раньше и использовать следующие 100 опрашивают кадр после того, как все работает нормально, но если я использую те же 100 запросов, что и предыдущий кадр, синхронизация не работает должным образом. Это исправление работает только потому, что теперь у запросов больше времени для сброса или чего-то подобного, поэтому, вероятно, это не лучшее исправление.
Я не получаю никаких ошибок проверки, мои запросы окклюзии не сбрасываются. Я получаю только ошибки проверки VK_ERROR_VALIDATION_FAILED_EXT при отладке с помощью Nsight Graphics при проверке, завершен ли запрос, но еще не завершен. Но эта ошибка проверки не выдается при нормальном выполнении, поэтому, вероятно, что-то связано с отладкой фреймов.
У кого-нибудь еще были подобные проблемы при использовании запросов окклюзии? Или кто-нибудь знает, можно ли на самом деле выполнить синхронизацию на графическом процессоре для запросов окклюзии или мне нужно подождать на хосте, чтобы они были сброшены, прежде чем я смогу их использовать?