2016-08-15 2 views
-2

Мне нужно нарисовать сотни полупрозрачных кругов как часть моего контура OpenCL.Для простого рендеринга: OpenCL быстрее, чем OpenGL?

В настоящее время я использую OpenGL (с альфа-смесью), синхронизированный (для переносимости) с использованием clFinish и glFinish с моей очереди OpenCL.

Быстро ли выполнить эту задачу рендеринга в OpenCL? (если остальная часть конвейера уже находится в OpenCL и может работать на CPU, если нет совместимого с OpenCL GPU).

Легко заменить растеризатор простой тестовой функцией в случае круга. Для функции blend требуется одно чтение из текстуры назначения для каждого фрагмента. Таким образом, наивная реализация OpenCL кажется теоретически более быстрой. Но, возможно, OpenGL может отображать неперекрывающиеся треугольники параллельно (это было бы сложнее реализовать в OpenCL)?

+0

«* предполагая, что остальная часть конвейера уже находится в OpenCL *« О том, о каком трубопроводе вы говорите? –

+0

Конвейер обработки в моем приложении. Я вычисляю некоторое изображение с помощью OpenCL, затем нужно отображать эти круги, а затем снова обрабатывать с помощью OpenCL. –

+0

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

ответ

3

Коэффициенты хорошие, что обработка на основе OpenCL будет быстрее, но только, потому что вам не нужно иметь дело с CL/GL interop. Тот факт, что вы должны выполнить glFinish/clFinishна всех, является узким местом.

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

Теперь это не означает, что нет способы использования OpenCL для рендеринга этих вещей.

Что вы не хотите хотите сделать, это записать цвета в память с помощью одной вычислительной операции, а затем прочитать из другого вычисления op, blend и записать их обратно в память. Таким образом, безумие.

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

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