Эквивалент 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, который работает с объектами мошенничества ( ссылка). И это не считается устаревшим.
Вы можете воспользоваться преобразованием формата, масштабированием и мультисэмплингом.