Насколько я понимаю, анимация частиц производится все же на CPU. Не слишком ли накладно постоянно лочить буфер? В OpenGL есть расширение TransformFeedback, позволяющее писать вершинному шейдеру сразу в буфер с данными (и даже без него есть возможность реализовать render to vertex buffer). Не пробовали ли сделать то же самое на D3D? Думаю, при большом количестве таких систем частиц все же придется обратить на это внимание.
>>Насколько я понимаю, анимация частиц производится все же на CPU
Да, все расчеты на CPU в несколько потоков.
>>Не слишком ли накладно постоянно лочить буфер?
Накладно, но не настолько. Если верить данным профилировщика, то самое накладное это именно вычисление координат частиц.
>>Не пробовали ли сделать то же самое на D3D?
Уже думаю о том, как переложить все расчеты на GPU. Начиная с DirectX 10 есть возможность изменять буфер напрямую из шейдера, насколько я слышал. Вскоре вполне возможно будет еще одна статья, но уже про D3D10 (11-ый мое оборудование не поддерживает) и вычисление на GPU.
Просто уточню, моей видеокарте около 4-х лет. Здесь дело не в Nvidia (честно никогда не слышал, чтобы они чем-то уступали графическим процессорам от AMD), а скорее в дате выпуска оборудования.
Если не ошибаюсь, то R600 — 2006-7 года проектирования (видеокарты поколения 2900/3800), уже держал DX 10.1, в nVidia поддержки 10.1 в топовых картах не было до архитектуры Fermi (400 series), которая увидела свет весной 2010. По этомй со старым Radeon'ом вполне могло бы и прокатить использование той фичи, которую вам предлагали.
Если память не изменяет, то это AMD предложила DX 10.1. Не удивительно, что по началу он только у неё и был реализован. Только вот нагуглить ничего не удалось, но я точно помню что где-то читал.
Изначально я взял формулу для расчет в векторной форме, там использовался куб расстояния. Потом я вернулся к обычной формуле, просто исправив 3-ку на 2-ку, и так больше и не заглядывал в формулу. Отдельно расстояние не нужно. Спасибо за замечание.
Для демонстрации неважно… но с точки зрения физического смылса важно. Размерности желательно приводить, чтобы, к примеру, не прибавлять к скорости Ньютоны, как в коде ниже force = G / distSquare;
...
particles[i].vx += xForce;
Размерности сохраняются, просто в первом варианте считалось расстояние как квадратный корень, а затем полученную величину возводили в квадрат — две трудоёмких функции на ровном месте.
Разработка системы частиц на платформе DirectX 9. Часть I