Использование шейдера для вычислений

можно ли использовать шейдер для вычисления некоторых значений, а затем вернуть их для дальнейшего использования?

например, я отправляю сетку вниз на GPU, с некоторыми параметрами о том, как она должна быть изменена(изменить положение вершин) и вернуть полученную сетку? Я вижу, что это довольно невозможно, потому что я не видел никакой переменной для связи от шейдеров до процессора. Я использую GLSL, поэтому есть только равномерные, атрибутики и различные. Должен ли я использовать atribute или форму, будут ли они все еще действует после рендеринга? Могу ли я изменить значения этих переменных и прочитать их обратно в CPU? Существуют методы отображения данных в GPU, но будут ли они изменены и действительны?

вот как я думаю об этом, хотя может быть и другой способ, который мне неизвестен. Я был бы рад, если бы кто-то мог объяснить мне это, так как я только что прочитал несколько книг о GLSL, и теперь я хотел бы программировать более сложные шейдеры, и я не хотел бы облегчать методы, которые невозможны в эта пора.

спасибо

4 ответов


большой вопрос! Добро пожаловать в дивный новый мир вычислений общего назначения на графических процессорах (GPGPU).

то, что вы хотите сделать, возможно с помощью пиксельных шейдеров. Вы загружаете текстуру (то есть данные), применяете шейдер (для выполнения требуемых вычислений), а затем используете Render to Texture для передачи результирующих данных с GPU в основную память (ОЗУ).

для этой цели созданы инструменты, в частности OpenCL и CUDA. Они значительно помогают GPGPU так, что этот вид программирования выглядит почти как программирование CPU.

Они не требуют никакого опыта 3D-графики (хотя по-прежнему предпочитают :) ). Вам не нужно делать трюки с текстурами, вы просто загружаете массивы в память GPU. Алгоритмы обработки написаны в слегка измененной версии C. Последняя версия CUDA поддерживает C++.

Я рекомендую начать с CUDA, так как это самый зрелый: http://www.nvidia.com/object/cuda_home_new.html


Это легко возможно на современных видеокартах с использованием Open CL, Microsoft Direct Compute (часть DirectX 11) или CUDA. Используются обычные языки шейдеров (например, GLSL, HLSL). Первые два работают как на графических картах Nvidia, так и на ATI, cuda-это Nvidia exclusive.

Это специальные библиотеки для вычислений на видеокарте. Я бы не использовал для этого обычный 3D API, хотя это возможно с некоторыми обходными путями.


теперь вы можете использовать объекты буфера шейдеров в OpenGL для записи значений в шейдеры, которые можно прочитать на хосте.


мое лучшее предположение было бы отправить вас в BehaveRT которых библиотека создана, чтобы использовать GPU для моделей behavorial. Я думаю, что если вы можете сформулировать свои изменения в Библиотеке, вы могли бы извлечь выгоду из ее абстракции

о данных, передаваемых между вашим процессором и gpu, я позволю вам просматривать документацию, я не уверен в этом