Эквивалент glDrawpixels, который работает на памяти GPU? - PullRequest
2 голосов
/ 05 марта 2010
glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const ovid *pixels);

Есть ли такая функция, кроме того, что вместо доступа к памяти ЦП она получает доступ к памяти ГП? [Либо текстура объекта буфера кадра]

Ответы [ 4 ]

4 голосов
/ 26 августа 2012

Давайте рассмотрим все базы здесь.

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

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

Однако вы добавляете к этому «Либо текстуру объекта буфера кадра». В этой квалификации вы спрашиваете: «Есть ли способ скопировать пиксельные данные из одного текстурного / кадрового буфера в текущий кадровый буфер?»

Да. glBlitFramebuffer может сделать это. Блит от GL_READ_FRAMEBUFFER до GL_DRAW_FRAMEBUFFER. И так как вы можете добавлять изображения из текстур в FBO, вы можете копировать изображения просто отлично. Вы даже можете скопировать из кадрового буфера по умолчанию в какой-нибудь рендер-буфер или текстуру.

Вы также можете использовать glCopyImageSubData, который копирует прямоугольники пикселей с одного изображения на другое. Это намного удобнее, чем glBlitFramebuffer, если все, что вы делаете, это копирование данных пикселей. Это довольно новое в настоящее время (GL 4.3 или ARB_copy_image ). Его нельзя использовать для копирования данных в кадровый буфер по умолчанию.

1 голос
/ 05 марта 2010

Если это в текстуре:

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

Я использую это, например, в Compositor :: _ drawPixels

0 голосов
/ 06 марта 2010

Используйте glBlitFramebuffer , который работает с объектами мошенничества ( Ссылка ). И это не устарело .

Вы можете воспользоваться преобразованием формата , масштабированием и мультисэмплингом .

0 голосов
/ 05 марта 2010

glDrawPixels может читать из Буферного Объекта. Просто сделай

glBindBuffer(GL_PIXEL_UNPACK_BUFFER, XXX)

перед вызовом glDrawPixels.

Предупреждение: glDrawPixels устарела ...

...