Как я могу прочитать данные текстуры, чтобы я мог их редактировать? - PullRequest
0 голосов
/ 21 февраля 2019

Я использую OpenGL, и я определил текстуру в объекте кадрового буфера со следующими строками кода:

glGenFramebuffers(1, &ssaoFBO);
glBindFramebuffer(GL_FRAMEBUFFER, ssaoFBO);
glActiveTexture(GL_TEXTURE27);
glGenTextures(1, &ssaoTexture);
glBindTexture(GL_TEXTURE_2D, ssaoTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WG, WG, 0, GL_RGBA, 
    GL_UNSIGNED_BYTE,NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
    ssaoTexture, 0);

glDrawBuffer(GL_FRONT);
glReadBuffer(GL_NONE);

В конце я хочу применить сглаживание к моей текстуре.Для этого было бы очень полезно, если бы у меня были данные пикселей в массиве.

Как я могу прочитать текстуру и поместить ее данные в массив?Я думаю, что функция glGetBufferSubData может быть полезной, но я не могу найти учебник с полным примером, чтобы правильно ее использовать.

Кроме того, когда я редактирую массив, как я могу поместить новые данные в мою текстуру?

Обновление:
Если у кого-то еще возникли проблемы, вот как это работает для меня:

std::vector<GLubyte> pixels(1024* 1024* 4);
glActiveTexture(GL_TEXTURE27);
glBindTexture(GL_TEXTURE_2D, ssaoTexture);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data()); 
// Now pixels vector contains the pixel data

//...
//Pixel editing goes here...
//...

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WG, WG, 0, GL_RGBA, GL_UNSIGNED_BYTE,
        &pixels[0]); //Sending the updated pixels to the texture

1 Ответ

0 голосов
/ 21 февраля 2019

У вас есть 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());  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...