gpt4 book ai didi

c++ - 如何读取纹理数据以便进行编辑?

转载 作者:行者123 更新时间:2023-11-30 04:51:24 25 4
gpt4 key购买 nike

我正在使用 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

最佳答案

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

帧缓冲区的像素可以通过glReadPixels读取.绑定(bind)用于读取的帧缓冲区并读取像素:

glBindFramebuffer(GL_FRAMEBUFFER, ssaoFBO);
glReadBuffer(GL_FRONT);
glReadPixels(0, 0, width, height, format, type, pixels);

纹理图像可以通过glGetTexImage读取.绑定(bind)纹理并读取数据:

glBindTexture(GL_TEXTURE_2D, ssaoTexture);
glGetTexImage(GL_TEXTURE_2D, 0, format, type, pixels);

在这两种情况下,formattype 都定义了目标数据的像素格式。
例如如果您想将像素存储到具有 4 个颜色 channel 的缓冲区,每个 channel 1 个字节,则 format = GL_RGBAtype = 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());

关于c++ - 如何读取纹理数据以便进行编辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54812864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com