Как отобразить объект или слой ровно один раз / за один кадр в QT3D

#qt3d

#qt3d

Вопрос:

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

Это шаги, которые мне нужно выполнить:

  1. Визуализировать черный квадрат в текстуру (для очистки текстуры)
  2. Визуализируйте геометрию в текстуру (чтобы сделать снимок, чтобы я мог его обработать)
  3. Запустите вычислительный шейдер с текстурой в качестве входных данных

Я могу выполнить вычислительный шейдер ровно один раз, используя команду trigger (1) (технически это было непросто, хотя: https://bugreports.qt.io/browse/QTBUG-86493 ).

Однако, как мне отобразить черный квадрат, а затем сетку (шаги 1 и 2) в текстуру ровно один раз? В идеале я хотел бы запустить вычислительный шейдер сразу после завершения шагов 1 и 2, и важно, чтобы шаги 1 и 2 перестали выполняться после выполнения шага 3, иначе результат из 3 будет перезаписан, и это проблема, с которой я сталкиваюсь сейчас в своем приложении qt3d.

Я думаю, я мог бы просто установить для свойства объектов qt3d значение true, а затем значение false, а затем запустить вычислительный шейдер. Но как я узнаю, когда нужно вернуть значение enabled обратно в false? Если я сделаю это слишком рано, они могут включаться и выключаться до того, как у них будет время для рендеринга.

Комментарии:

1. Я не уверен, что полностью понимаю, чего вы хотите. Правильно ли я понимаю, что у вас есть сетка, которую пользователь может просматривать, и когда им нравится, они могут сделать «скриншот» сетки, к которой вы хотите применить постобработку? Для рендеринга в текстуру я бы порекомендовал свой закадровый рендеринг . Для управления рендерингом у меня есть несколько предложений, но я не знаю, какой из них подойдет вам лучше всего: вы можете установить режим рендеринга на себя QRenderSettings onDemand . Это отображает что-то только тогда, когда что-то в сцене меняется.

2. Например, когда вы устанавливаете для объекта значение включено, это приведет к тому, что средство визуализации будет отображать из-за системы уведомлений о свойствах Qt3D. Я не уверен, что полностью понимаю ограждения в OpenGL, но есть также QSetFence и QWaitFence которые вы могли бы использовать, чтобы убедиться, что вычисление шейдера завершено.

3. Тогда вы также можете установить режим привода QAspectEngine для to manual (только из Qt> = 5.14). Затем вы можете вручную вызвать processFrame , какие процессы обрабатывают один кадр. Кроме этого, я думаю, у вас может быть QClearBuffers в ветке framegraph для рендеринга текстур вне экрана, которая очищает текстуру (нет необходимости отображать черный треугольник, это намного быстрее). Итак, и затем у вас есть захват рендеринга в ветке framegraph шейдера последующей обработки? Я правильно понял? И это слишком медленно?

4. Последнее, о чем я могу подумать, это, возможно, реализовать ваш собственный аспект, который отключает ветку, которая отображает сетку в текстуру. Вы можете прочитать здесь о том, как реализовать свой собственный аспект.

5. Спасибо за ваши ответы, Флориан, я видел много других ваших ответов на qt3d в другом месте, и они были очень полезны! Да, вы правильно поняли проблему, и я сначала попробую ваше предложение QSetFence. Я думал, что это будет работать с решением, которое у меня было, потому что у меня есть шаги 1,2 и 3 друг за другом в framegraph, и все они имеют MemoryBarrier. Доступ к шейдеру. Но похоже, что вычислительный шейдер (шаг 3) не совсем синхронизирован с шагами 1 и 2