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

Получить результаты вычислений графического процессора обратно в программу CPU в OpenGL

Есть ли способ получить результаты от шейдера, запущенного на графическом процессоре, обратно к программе, запущенной на процессоре?

Я хочу создать многоугольную сетку из простых данных вокселя на основе вычислительного дорогостоящего алгоритма на графическом процессоре, но мне нужен результат для CPU для вычисления физики.

4b9b3361

Ответ 1

Определить "результаты"?

В общем, если вы используете вычисления в стиле GPGPU с OpenGL, вам понадобится структурировать ваши шейдеры вокруг потребностей системы рендеринга. Системы рендеринга проектируются как односторонние: в них поступают данные, и создается изображение. Возвращаясь назад, имея систему рендеринга, производят данные, обычно не структурированы системы рендеринга.

Это не значит, что вы не можете этого сделать, конечно. Но вам нужно создавать все вокруг ограничений OpenGL.

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

Выходы фрагментарного фрагмента

Любое аппаратное обеспечение, способное к фрагментарным шейдерам, очевидно, позволит вам писать текущему фреймбуферу, который вы выполняете. Благодаря использованию объектов фреймбуфера и текстур с форматами изображений , вы можете написать практически все данные, которые вы хотите использовать для различных изображений. После получения текстуры вы можете просто вызвать glGetTexImage, чтобы получить отображаемые пиксельные данные. Или вы можете просто сделать glReadPixels, чтобы получить его, если FBO все еще привязан. В любом случае работает.

Основными ограничениями этого метода являются:

  • Количество изображений, которые вы можете прикреплять к фреймбуферу; это ограничивает объем данных, которые вы можете записать. На оборудовании pre-GL 3.x FBOs обычно ограничивались только 4 изображениями и буфером глубины/трафарета. В 3.x и улучшенном оборудовании вы можете ожидать как минимум 8 изображений.

  • То, что вы делаете. Это означает, что вам нужно настроить данные вершин, чтобы расположить треугольник точно там, где вы хотите, чтобы он изменял данные. Это не тривиальное начинание. Также трудно получить полезные входные данные, так как вы обычно хотите, чтобы каждый тексель был достаточно независим от другого. Структурирование фрагментарного шейдера вокруг этих ограничений затруднено. Не исключено, но во многих случаях нетривиально.

Обратная связь с преобразованием

Эта функция OpenGL 3.0 позволяет выводить на выходе из Vertex Processing этап OpenGL (вершинный шейдер и дополнительный геометрический шейдер) для захвата в одном или больше объектов буфера.

Это гораздо более естественно для захвата вершинных данных, которые вы хотите воспроизвести или визуализировать снова. В вашем случае вам нужно будет прочитать его после его рендеринга, возможно, с вызовом glGetBufferSubData или с помощью glMapBufferRange для чтения.

Ограничения здесь состоят в том, что вы обычно можете захватывать только 4 выходных значения, где каждое значение является vec4. Существуют также некоторые строгие ограничения макета. Некоторые аппаратные средства OpenGL 3.x и 4.x позволяют записывать данные в несколько потоков обратной связи, которые могут быть записаны в разные буферы.

Загрузка и сохранение изображения

Эта функция GL 4.2 представляет собой вершину записи: вы можете связать изображение (текстуру буфера, если вы хотите записать в буфер), и просто написать ему. Существуют ограничения порядка памяти, в которых вам нужно работать.

Это очень гибкий, но очень сложный. Помимо трудностей с его использованием, существует ряд ограничений. Количество изображений, которые вы можете записать, будет довольно ограниченным, возможно, 8 или около того. И реализации могут иметь общие пределы записи, так что 8 изображений для записи могут быть разделены выводами фрагмента фрагмента.

Что еще, выходы изображений гарантируются только для шейдера фрагментов (и 4.3 вычисляющих шейдеров). То есть, оборудованию разрешено запретить вам использовать загрузку/сохранение изображений на этапах шейдера без FS/CS.