Геометрические шейдеры

В процессе поисков увеличения быстродействия графического движка попробовал перенести все процедуры расчета элементов поверхности в GPU. Теперь программа занимает в оперативке меньше 20Мб. Чтобы иметь возможность изменять окружающее пространство, в оперативной памяти основной программы хранится только массив опорных точек, которые используются для расчета и построения поверхностей. Планировалось, что если идея обеспечит нужный эффект, то в дальнейшем координаты опорных точек можно в виде потока передавать из базы данных.

Идея была в том, чтобы протестировать возможности графического шейдера по расчету геометрии базовых элементов поверхности для построения рельефа местности. Геометрический шейдер должен строить кубические элементы пространства по их 3D координатам, углам поворота и индексу текстуры используя 3Д координаты всего одной точки - центра фигуры. Шейдер на основании полученных данных генерировал 8 вершин, создавая таким образом объемные фигуры с заданной текстурой, из которых создавалась сцена. Увы, идея не дала прироста быстродействия.

Сам алгоритм вполне рабочий и может строить таким образом пространство. Но общие тесты показали, что быстродействие не возросло, а упало. Особенно это было заметно на слабых графических картах. При традиционном способе построения сцены, когда все вершины передаются в графический конвеер готовыми, GPU занят только рендером сцены. А при таком использовании геометрического шейдера часть ресурсов GPU тратится на расчет и построение (в каждом кадре!) от каждой вершины еще семи дополнительных. Естественно, скорость рендера при этом страдает. По моим тестам на простой сцене из двух миллионов вершин FPS на встроеной видео-карте Intel упал вдвое, а на средней Nvidia на четверть.

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