Следует ли полностью обновлять системы частиц в шейдере геометрии

Должны ли системы частиц полностью обновляться в шейдере геометрии или шейдеру геометрии должны передаваться обновленные данные для позиций и жизни и т. Д. На данный момент я обновляю все в геометрии, но я не уверен, что это лучшая идея, если некоторые данные нужны в C++.


person RobBain85    schedule 06.03.2012    source источник


Ответы (2)


В шейдерах возможно почти все (особенно если вы собираетесь использовать SM4+). Я не рекомендую использовать что-то большее, чем SM3, если вы хотите проникнуть на рынок. Я до сих пор жалею, что мы не предоставили резервную копию SM2 для нашей последней игры, потому что довольно много людей все еще используют старые дрянные карты SM2.

Подробнее к вопросу. Вы можете использовать RTT и никогда не возвращаться в основную память (это чертовски медленно, свести к минимуму передачу из графической памяти в основную память), но недостатком является то, что вам нужно использовать некоторые довольно сложные приемы для вычисления AABB. (что вам понадобится на стороне процессора), если вы используете чистый GPU.

Вместо этого мы делаем все, что требует изменения состояния частицы на стороне процессора. Затем у нас есть точное представление этих данных в памяти, которое обновляется на GPU. Вершинный шейдер довольно объемный (но это совершенно нормально, делайте все возможное в вершинном шейдере!), он извлекает это сжатое представление частицы, преобразует его и передает несжатые данные пиксельному шейдеру. Важным наблюдением здесь является то, что вы можете и должны разделять данные по вершинам и по частицам. Это подразумевает использование экземпляров (это просто способ сказать: используйте делители частоты). Мы представляем вращение частицы с нормалью + вращение вокруг этой нормали.

Еще одна причина изменения состояния частиц на стороне процессора заключается в том, что гораздо проще составить поведение на стороне процессора. Любая, по крайней мере, наполовину приличная система частиц нуждается в довольно большом количестве ручек, чтобы иметь возможность создавать интересные эффекты частиц.

РЕДАКТИРОВАТЬ: И если у вас есть что-то похожее на Particle::Update, которое не может быть встроено, вы потерпели неудачу, минимизируйте вызовы функций для каждой частицы, особенно виртуальные, и держите представление памяти частицы плотно упакованным!

person Ylisar    schedule 06.03.2012
comment
Ах, блестящий ответ, который имеет для меня большой смысл. моей следующей задачей является реализация мягких частиц, и именно поэтому мне нужно было задать этот вопрос, потому что мне не кажется, что вы можете очень легко выполнить сортировку по глубине, если вы используете чистый GPU. я могу изменить свой код сейчас, чтобы отразить то, что вы сказали, большое спасибо - person RobBain85; 06.03.2012

Это зависит от того, какая у вас система частиц. В большинстве случаев у вас есть программное представление на C++ и аппаратное представление для вашего шейдера. Геометрические данные для шейдера вычисляются из программного представления, и их должно быть как можно меньше. Потому что в большинстве случаев ограничивающим ресурсом является не вычислительная мощность, а скорость передачи на видеокарту.

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

person Nico Schertler    schedule 06.03.2012
comment
мои системы частиц бывают в виде дыма, огня, пыли, дождя и т. д. в тот момент, когда я отправляю случайные значения x, y и z в шейдер для определения положения и скорости, я также передаю время кадра и время жизни частицы. Затем мой шейдер вычисляет, где частица должна располагаться на основе поступающих значений. Не могли бы вы сделать эти расчеты в программе? - person RobBain85; 06.03.2012
comment
Может быть, я вас неправильно понимаю... Но когда вы посылаете случайные положения и скорости, ваши частицы будут мерцать, не так ли? Или эти значения вычисляются только один раз и обновляется только время кадра? В этом случае возможны только детерминированные движения. - person Nico Schertler; 06.03.2012
comment
извините, да, они применяются, когда частица испускается не снова и снова - person RobBain85; 06.03.2012