Чтение Framebuffer-текстуры как одномерного массива - PullRequest
0 голосов
/ 03 августа 2011

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

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

Возможно ли это? Если да, это медленнее / быстрее, чем glReadPixels на всем изображении, а затем вырезать то, что мне нужно?

EDIT Конечно, я знаю об OpenCL / CUDA, но они нежелательны, потому что я хочу, чтобы моя программа работала из коробки на (почти) любой платформе.

Также я знаю, что glReadPixels очень медленный, и одна из причин может заключаться в том, что он предлагает некоторые функции, которые мне не нужны (Работа в 2D). Поэтому я попросил более основную функцию, которая может быть быстрее.

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

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

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

1 голос
/ 04 августа 2011

Вы можете использовать объект пиксельного буфера (PBO) для передачи пиксельных данных из кадрового буфера в PBO, затем используйте glMapBufferARB для непосредственного чтения данных:

http://www.songho.ca/opengl/gl_pbo.html

...