如何读取纹理数据以便我可以编辑它?

问题描述 投票:1回答:1

我正在使用OpenGL,我使用以下代码行在framebuffer对象中定义了一个纹理:

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
c++ opengl textures
1个回答
1
投票

你有两种可能性。纹理附加到帧缓冲区。从帧缓冲区读取像素或从纹理中读取纹理图像。

帧缓冲的像素可以由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);

在两种情况下,formattype定义目标数据的像素格式。 例如如果要将像素存储到具有4个颜色通道的缓冲区中,每个通道1个字节,则format = GL_RGBAtype = GL_UNSIGNED_BYTE。 目标缓冲区的大小必须是widht * height * 4

EG

#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整除,则必须设置qazxsw poi参数,以适应每个像素行开始的对齐要求。

例如对于紧密包装的GL_PACK_ALIGNMENT图像:

GL_RGB
© www.soinside.com 2019 - 2024. All rights reserved.