У вас есть 2 возможности.Текстура прикреплена к фреймбуферу.Либо считывайте пиксели из буфера кадров, либо считывайте изображение текстуры из текстуры.
Пиксели буфера кадра можно прочитать как glReadPixels
.Привязать кадровый буфер для чтения и прочитать пиксели:
glBindFramebuffer(GL_FRAMEBUFFER, ssaoFBO);
glReadBuffer(GL_FRONT);
glReadPixels(0, 0, width, height, format, type, pixels);
Текстурное изображение можно прочитать по glGetTexImage
.Свяжите текстуру и прочитайте данные:
glBindTexture(GL_TEXTURE_2D, ssaoTexture);
glGetTexImage(GL_TEXTURE_2D, 0, format, type, pixels);
В обоих случаях format
и type
определяют формат пикселей целевых данных.
Например, если вы хотите сохранить пикселив буфер с 4 цветовыми каналами, по 1 байту для каждого канала, тогда format = GL_RGBA
и type = GL_UNSIGNED_BYTE
.
Размер целевого буфера должен быть widht * height * 4
.
, например,
#include <vector>
int width = ...;
int height = ...;
std::vector<GLbyte> pixels(width * height * 4); // 4 because of RGBA * 1 byte
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data());
или
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data());
Обратите внимание: если размер в байтах 1 строки изображения не делится на 4, то GL_PACK_ALIGNMENT
параметр должен быть установлен, чтобы адаптировать требования выравнивания для начала каждой строки пикселей.
например, для плотно упакованного GL_RGB
изображения:
int width = ...;
int height = ...;
std::vector<GLbyte> pixels(width * height * 3); // 3 because of RGB * 1 byte
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels.data());