Обработка текстур по линиям ускорена с помощью OpenGL / OpenCL - PullRequest
2 голосов
/ 02 февраля 2012

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

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

Могу ли я настроить шейдеры OpenGL или OpenCL, или что-то еще, чтобы сделать это?Пожалуйста, предоставьте минимальный пример с кодом.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Если у вас есть доступ к оборудованию класса GL 4.x, которое реализует EXT_shader_image_load_store или ARB_shader_image_load_store, я полагаю, вы могли бы это осуществить. В противном случае чтение / запись изображения на месте, как правило, невозможно (хотя существуют способы с NV_texture_barrier).

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

Это не собирается много покупать.

Если вы действительно хотите это сделать, используйте OpenCL. Это намного дружелюбнее к таким вещам.

0 голосов
/ 02 февраля 2012

Да, вы можете сделать это. Нет, для этого вам не нужно оборудование 4.X, вам нужны фрагментные шейдеры (с контролем потока), объекты кадрового буфера и поддержка текстур с плавающей запятой.

Вам необходимо закодировать ваши данные в 2D текстуру.

Сохраните «переменную состояния» в 1-м пикселе для каждой строки и закодируйте оставшиеся данные в оставшиеся пиксели. Само собой разумеется, что рекомендуется использовать формат текстуры с плавающей запятой.

Используйте два кадровых буфера и визуализируйте их друг в друге в цикле, используя фрагментный шейдер, который обновляет «переменную состояния» в первом столбце и выполняет любую необходимую операцию с другим столбцом, который является «текущим». Чтобы уменьшить количество потерянных ресурсов, вы можете ограничить рендеринг столбцами, которые вы хотите обработать. Примеры NVidia OpenGL SDK имели демки "game of life", "Fluid GDGPU", "GPU partciles", которые работают аналогичным образом - кодируя данные в текстуру и затем используя шейдеры для ее обновления.

Однако, потому что вы можете это сделать, это не значит, что вы должны это делать, и это не значит, что это гарантированно быстро. Некоторые графические процессоры могут иметь очень высокую скорость чтения текстурной памяти, но относительно низкую скорость вычислений (и наоборот), и не все графические процессоры имеют много конвейеров для параллельной обработки данных.

Кроме того, в зависимости от вашего приложения, CUDA или OpenCL могут быть более подходящими.

...