Должен ли я использовать вершинный шейдер в этой ситуации? - PullRequest
4 голосов
/ 07 января 2012

Я хотел бы создать эффект размытия в движении, визуализируя и аддитивно смешивая движущиеся объекты в нескольких точках их траектории в течение кадра.

Я думал, что вычисление для определения местоположения рисования может быть выполнено в вершинном шейдере.Однако мне кажется, что мне может понадобиться использовать геометрический шейдер, если я хочу избежать передачи геометрии для каждого рендера.

Какой мой лучший курс действий?Я выбираю между:

  1. Сборка данных вершин для каждого подкадра вручную и передача их в GPU каждый раз (мне не понадобится программа вершин, если я это сделаю)
  2. Отправьте геометрию вместе со значениями скорости.Я могу вычислить промежуточное положение в вершинном шейдере, хотя я не уверен, как указать, что определенное значение скорости присваивается определенным группам примитивов.Мне нужно будет отправлять одни и те же вершины по одному разу для каждого рендера подкадра, потому что вершинный шейдер не может создавать новые вершины.
  3. Используйте геометрический шейдер, чтобы получить всю геометрию для всех подкадров.Я должен быть в состоянии получить все субкадры без передачи каких-либо данных взад и вперед в течение всего процесса рендеринга.

Баланс, который я хочу здесь достичь, заключается в том, что я хочу минимум избыточной передачи данных при поддержке как можно большего количества оборудования.Кажется, я должен быть в состоянии использовать объект буфера вершин для хранения своих данных геометрии и просто передать несколько униформ для отправки данных о скорости в вершинный шейдер при каждом рендеринге.Это работает?Кроме того, буфер VBO является постоянным, поэтому для лучшей производительности я должен вмешиваться и изменять геометрические данные по мере необходимости, правильно?

Другая потенциальная проблема, с которой я не знаю, как справиться, заключается в том, что я хочу точно нарисовать свои промежуточные позиции путем интерполяции перемещения и поворота жестких объектов через рамку, а не просто интерполирования результирующих положений вершин.в одиночестве.Разница здесь в том, что вращающийся объект оставит изогнутую полосу.

Есть ли какой-нибудь способ предотвратить вызов для каждого отдельного динамического жесткого объекта?Может быть, я мог бы использовать общий атрибут вершины, чтобы отправить мою скорость?Это было бы несколько избыточно, потому что у меня мог бы быть объект с 100 вершинами с такими же данными о скорости, но по крайней мере тогда мой шейдер мог бы получить поток этих данных таким образом.

Мне кажется, что не может бытьслишком много, чтобы выиграть, выполняя вершинные преобразования на графическом процессоре: я должен был бы передать вектор скорости, скаляр угловой скорости и вектор центра масс как атрибуты вершины.Это кажется большой тратой пропускной способности.Тем не менее, я могу использовать эти данные для потенциально большого количества «выборок» (рендеринг субкадров).

Я очень долго пользовался OpenGL Immediate Mode, но сейчас я хочу сделать все правильно.

ОБНОВЛЕНИЕ: см. Расширенное обсуждение комментариев для направления, которое это приняло.Теперь я совершенно уверен, что несколько образцов не дадут хорошего результата из-за «эффекта стробоскопического света»: при некоторых скоростях мне придется использовать размытие из соображений производительности.В этом случае мне нужно накапливать размытые субкадры;рендеринг субкадров, а затем размытие по-прежнему оставляют артефакты.

Ответы [ 2 ]

3 голосов
/ 07 января 2012

Я хотел бы создать эффект размытия в движении, визуализируя и дополнительно смешивая движущиеся объекты в нескольких точках на их траектории в течение кадра.

Это, безусловно, один из способовсделать размытие движения.Но в наши дни размытие движения осуществляется фильтром постобработки векторной размытости во фрагментном шейдере.См. http://www.blender.org/development/release-logs/blender-242/vector-blur/ для объяснения, как это работает.Для реального времени процесс должен быть воспроизведен с помощью шейдеров постобработки.

2 голосов
/ 07 января 2012
  1. Программное обеспечение рендерит субкадры - Рассмотрим это как «базовый» случай.
  2. Вершинный шейдер - Вы можете сделать это, но не пытайтесь посылать скорость геометрии, просто отправьтескорость вершины:

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

    Вершинному шейдеру потребуется применить отклонения на основе единого значения времени.

  3. Геометрический шейдер - если вы пошли с этим, вы могли бы реализовать его так же, как # 2, за исключением того, что вместо этого в шейдере был бы реализован «цикл и переменная» - помогая перенести больше работы на графический процессор.

Вы также упоминаете:

  • Рендеринг всего с VBO - Если бы вы использовали VBOs / списки отображения, подобные этому, вы бы в основном использовали вариант № 1 с большим аппаратным ускорением.
  • Проблемы с интерполяцией - вероятно, не стоит ваших усилий, чтобы получить точную интерполяцию.Если объекты не движутся очень быстро и изгиба, линейная интерполяция скорости (первый порядок), вероятно, подойдет.Вы можете улучшить его, добавив ускорение (второй порядок), но дополнительные заказы или более точную физическую модель, вероятно, будут стоить усилий или затрат.
  • Может быть не стоит - это действительно сутьэта проблема.В зависимости от вашего приложения, оборудования и других деталей, любое из этих возможных решений может превзойти другое.Если производительность важна, вам, вероятно, следует попробовать прототип реализации каждого из них и запустить тесты на целевых устройствах, чтобы увидеть, что подходит лучше всего.(Печальная реальность такова, что вы не можете легко выполнить тесты, пока вы не сделали всю работу.)
...