Должны ли системы частиц полностью обновляться в шейдере геометрии или шейдеру геометрии должны передаваться обновленные данные для позиций и жизни и т. Д. На данный момент я обновляю все в геометрии, но я не уверен, что это лучшая идея, если некоторые данные нужны в C++.
Следует ли полностью обновлять системы частиц в шейдере геометрии
Ответы (2)
В шейдерах возможно почти все (особенно если вы собираетесь использовать SM4+). Я не рекомендую использовать что-то большее, чем SM3, если вы хотите проникнуть на рынок. Я до сих пор жалею, что мы не предоставили резервную копию SM2 для нашей последней игры, потому что довольно много людей все еще используют старые дрянные карты SM2.
Подробнее к вопросу. Вы можете использовать RTT и никогда не возвращаться в основную память (это чертовски медленно, свести к минимуму передачу из графической памяти в основную память), но недостатком является то, что вам нужно использовать некоторые довольно сложные приемы для вычисления AABB. (что вам понадобится на стороне процессора), если вы используете чистый GPU.
Вместо этого мы делаем все, что требует изменения состояния частицы на стороне процессора. Затем у нас есть точное представление этих данных в памяти, которое обновляется на GPU. Вершинный шейдер довольно объемный (но это совершенно нормально, делайте все возможное в вершинном шейдере!), он извлекает это сжатое представление частицы, преобразует его и передает несжатые данные пиксельному шейдеру. Важным наблюдением здесь является то, что вы можете и должны разделять данные по вершинам и по частицам. Это подразумевает использование экземпляров (это просто способ сказать: используйте делители частоты). Мы представляем вращение частицы с нормалью + вращение вокруг этой нормали.
Еще одна причина изменения состояния частиц на стороне процессора заключается в том, что гораздо проще составить поведение на стороне процессора. Любая, по крайней мере, наполовину приличная система частиц нуждается в довольно большом количестве ручек, чтобы иметь возможность создавать интересные эффекты частиц.
РЕДАКТИРОВАТЬ: И если у вас есть что-то похожее на Particle::Update, которое не может быть встроено, вы потерпели неудачу, минимизируйте вызовы функций для каждой частицы, особенно виртуальные, и держите представление памяти частицы плотно упакованным!
Это зависит от того, какая у вас система частиц. В большинстве случаев у вас есть программное представление на C++ и аппаратное представление для вашего шейдера. Геометрические данные для шейдера вычисляются из программного представления, и их должно быть как можно меньше. Потому что в большинстве случаев ограничивающим ресурсом является не вычислительная мощность, а скорость передачи на видеокарту.
Если вы можете еще больше уменьшить передачу с помощью вашего метода, вы все равно можете сохранить представление программного обеспечения в памяти для дальнейшего использования. Даже если это подразумевает двойное вычисление данных, это может быть быстрее, чем процесс передачи.