Настоящая прелесть работы с системами частиц из шейдера заключается в том, что вычисления выполняются в основном на графическом акселераторе, а не на основном процессоре. Если данные для создания системы частиц хранятся в буферном объекте, скорее всего, они будут храниться в памяти графического ускорителя, и для рендеринга даже не будет использоваться шина передачи данных. Однако уравнение для обновления каждой частицы, написанное на языке шейде-ров OpenGL, может оказаться довольно сложным. Так как рендеринг системы частиц выполняется так же, как рендеринг любого другого трехмерного объекта, то во время анимации можно поворачивать каждую частицу как угодно. Используя метод систем частиц, можно применять любое количество эффектов.
13.7. Колебания В двух предыдущих примерах анимация объекта выполнялась в основном вершинным процессором (так как форма объекта не может изменяться фрагментным процессором). Но фрагментный процессор также можно использовать для создания эффектов анимации. Основное назначение большинства фрагментных шейдеров - вычислять цвет фрагмента, и любые коэффициенты, влияющие на цвет, могут зави1 Небольшое изображение, переносимое по экрану независимо от других. - Примеч. науч. ред.
13.7. Колебания сеть от времени. В этом разделе будет представлен шейдер, который вносит зависящие от времени возмущения в текстурные координаты, создающие эффект колебаний или возмущений. Если выбрана правильная текстура, с помощью этого эффекта можно создавать «желатиновую» поверхность или «танцующий» логотип.
Этот шейдер был разработан для того, чтобы воспроизвести двухмерные колебательные эффекты, показанные в некоторых демонстрационных программах реального времени на веб-сайте http://www.scene.org. Автор этих программ, Анто-нио Тихада из компании 3Dlabs, хотел создать нечто подобное с помощью языка шейдеров OpenGL.
Для создания возмущений, вносимых фрагментным шейдером в текстурные координаты перед доступом к текстуре, используется функция синуса. Размеры и частота возмущений контролируются с помощью uniform-переменных, устанавливаемых приложением. В данном случае точность вычисления функции синуса не имеет особого значения, а сама функция синуса на время написания шейдера еще не была реализована, поэтому Антонио применил первые два члена последовательности Тейлора для синуса. Фрагментный шейдер был бы проще, если бы Антонио использовал встроенную функцию sin, но способ с последовательностью демонстрирует применение численных методов в шейдерах. (Сложно сказать, будет ли использование первых двух членов последовательности Тейлора работать быстрее встроенной функции sin. Возможно, это зависит от производителя аппаратного обеспечения, а именно от реализации функции sin.)