c++ - 如何读取纹理数据以便进行编辑?
问题描述
我正在使用 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
解决方案
你有两种可能性。纹理附加到帧缓冲区。从帧缓冲区读取像素或从纹理中读取纹理图像。
可以读取帧缓冲区的像素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());
推荐阅读
- html - 我在提交表单时在 django 项目中遇到错误,任何人都可以告诉我更正我的错误
- python - python打字:重载与TypeVar
- laravel-8 - 使用 livewire 组件重定向的问题
- javascript - 赛普拉斯 cy.route2 没有收到请求
- android - flutter build apk --split-per-abi 失败
- python - 使用 python 的 Azure 函数是否支持函数筛选器?
- powerbi - 坚持来自度量的未来值
- linux - 当试图在后台运行时,Twinkle 立即终止
- sql - 具有文件数据集唯一标识符的数组聚类
- excel - Excel 范围到 CSVrange 输出 - 将范围分成 41 个条目的组