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