Я хотел бы создать эффект размытия движения путем рендеринга и аддитивного смешивания движущихся объектов в нескольких точках их траектории в течение кадра.Должен ли я использовать вершинный шейдер в этой ситуации?
Я думал, что расчет для определения места ничьей может быть выполнен в вершинном шейдере. Мне кажется, однако, что мне может понадобиться использовать геометрический шейдер, если я хочу избежать прохождения в геометрии для каждого рендеринга.
Каков мой лучший курс действий? Я решаю между:
- Сборка данных вершин для каждого подрамника вручную и передать его в ГПУ каждый раз (не нужно будет иметь вершинную программу, если я это сделать)
- Послать геометрия вместе со значениями скорости. Я могу вычислить промежуточную позицию в вершинном шейдере, хотя я не уверен, как указать, что определенное значение скорости присваивается определенным группам примитивов. Мне нужно будет отправлять одни и те же вершины один раз для каждого подкадрового рендеринга, потому что вершинный шейдер не может создавать новые вершины.
- Используйте геометрический шейдер для создания всей геометрии для всех подкадров. Я должен иметь возможность получить все подкадры без передачи данных взад и вперед во время всего процесса рендеринга.
Баланс, на который я хочу нанести удар, - это то, что я хочу как минимум избыточную передачу данных, поддерживая как можно больше аппаратного обеспечения. Похоже, я должен использовать объект буфера Vertex для хранения данных геометрии и просто передать несколько мундштуков для отправки данных скорости в вершинный шейдер для каждого рендеринга. Это работает? Также буфер VBO является постоянным, поэтому для достижения наилучшей производительности я должен входить и изменять данные геометрии по мере необходимости, правильно?
Еще одна потенциальная проблема, с которой я не знаю, заключается в том, что я хочу точно нарисовать свои промежуточные позиции путем интерполяции перевода и вращения, которые жесткие объекты пересекают по кадру, а не просто интерполировать только результирующие вершинные позиции. Разница здесь в том, что вращающийся объект оставит изогнутую полосу.
Есть ли способ, которым я могу предотвратить вызов для каждого отдельного динамического жесткого объекта? Может быть, я мог бы использовать общий атрибут вершины для отправки моей скорости? Это было бы несколько избыточно, потому что у меня мог быть объект с 100 вершинами с одинаковыми данными скорости, но по крайней мере мой шейдер может получить поток этих данных таким образом.
Мне кажется, что не может быть сделано слишком много, чтобы выполнить преобразования вершин на графическом процессоре: мне пришлось бы передавать вектор скорости, скаляр угловой скорости и центр масс-вектора в качестве атрибутов вершин , Похоже на большую трату пропускной способности. Однако я могу использовать эти данные для потенциально большого количества «выборок» (подкадровых рендерингов).
Я проработал очень долго, используя режим OpenGL Immediate, но на этот раз я хочу сделать все правильно.
ОБНОВЛЕНИЕ: см. Расширенную дискуссию по комментариям в отношении того направления, которое было выполнено. Теперь я уверен, что несколько образцов не приведут к хорошему результату из-за «светового эффекта строба»: при некоторых скоростях мне понадобится размытие по соображениям производительности. В этом случае мне нужно накапливать размытые подкадры; рендеринг субкадров, а затем размытие будет по-прежнему оставлять артефакты.
Интересная ссылка. Благодарю. Я создаю сцену 2d, и я пытаюсь использовать быстрый графический конвейер для моих целей, чтобы получить более высокие результаты верности, повторяя один и тот же объект много раз, а не только один раз и обрабатывая его. –
@StevenLu: Векторное размытие также работает в 2D. И что вы называете «быстрым графическим конвейером»? – datenwolf
В моей предыдущей реализации 2d motion blur использовался направленный метод размытия с помощью фрагментарного шейдера, проблема в том, что он будет размываться и смешать не движущиеся объекты, находящиеся рядом с движущимся объектом, что нежелательно. В противном случае это выглядело отлично. –