Эквивалент glDrawpixels, который работает на памяти GPU?

glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const ovid *pixels);

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

4 ответа

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

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

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

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

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

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

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

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

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

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

glBindBuffer(GL_PIXEL_UNPACK_BUFFER, XXX)

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

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

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

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

Другие вопросы по тегам