Подтвердить что ты не робот

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

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

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

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

Спасибо

4b9b3361

Ответ 1

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

То, что вы хотите сделать, возможно с пиксельными шейдерами. Вы загружаете текстуру (то есть: данные), применяете шейдер (для выполнения нужного вычисления), а затем используете Render to Texture для передачи полученных данных с графического процессора в основную память (RAM).

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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