2012-06-19 2 views
1

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

+1

GLSL не используется для программирования GPU общего назначения, поскольку для этой цели были разработаны аппаратные и программные интерфейсы. Если вам не нужно программировать GPU более 6 лет, это, вероятно, не вопрос, который вы хотите. – Potatoswatter

ответ

4

GLSL не обеспечивает выходы, кроме того, что помещается в буфер кадра.

Чтобы запрограммировать GPU и получить результаты более удобно, используйте CUDA (только NVidia) или OpenCL (кросс-платформенный).

3

В общем, вы хотите использовать OpenCL для задач GPU общего назначения. Однако, если вы настаиваете на том, чтобы сделать вид, что OpenGL не является API-интерфейсом ...

Framebuffer Objects сделать его относительно простым для отображения на нескольких выходах. Это, конечно, означает, что вам нужно структурировать свою обработку таким образом, чтобы то, что получается, соответствовало тому, что вы хотите. Вы можете отображать 32-битные «образы» с плавающей запятой, поэтому у вас есть доступ к множеству точности. Самая большая трудность заключается в том, что я сказал: выяснение того, как структурировать свою задачу в соответствии с рендерингом.

Это немного проще при использовании обратной связи преобразования. Это возможность записывать выходные данные шейдерной обработки вершины (или геометрии) в buffer object. Это по-прежнему требует структурирования ваших задач во что-то вроде рендеринга, но это проще, потому что вершинные шейдеры имеют строгий одно вертекс-один-вершинный сопоставление. Для каждой входной вершины имеется ровно один вывод. И если вы нарисуете GL_POINTS, не так уж сложно использовать атрибуты для передачи данных, которые меняются.

Как проще, так и проще использовать shader_image_load_store. Это фактически способность читать/писать с/на произвольные изображения «всякий раз, когда вы хотите». Я поставил эту последнюю часть в кавычки, потому что существует множество эзотерических правил относительно условий гонки данных: чтение из значения, написанного другим вызовом шейдера и т. Д. Это не тривиально иметь дело. Вы можете попытаться структурировать свой код, чтобы избежать их, не записывая одно и то же изображение в том же шейдере. Но во многих случаях, если вы могли бы это сделать, вы могли бы просто визуализировать фреймбуфер.

В конечном счете, на этот вопрос в общем случае невозможно ответить на этот вопрос, не зная, что именно точно, которое вы пытаетесь на самом деле сделать. Как вы подходите к GPGPU через API-интерфейс рендеринга, в значительной степени зависит от того, что вы пытаетесь вычислить.

Смежные вопросы