如何读取纹理数据,以便我可以编辑它
How can I read the texture data so I can edit it?
我正在使用OpenGl,并且我在flamebuffer对象中定义了一个代码的纹理:
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
读取Framebuffer的像素。绑定框架缓刑器以读取并读取像素:
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());
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 为什么我可以通过引用修改常量返回
- 我可以在 C++ 中的函数体之外进行操作吗?
- 我可以重新分配/覆盖std::字符串吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 为什么我可以使用比分配的内存更多的内存
- 在一个读写器队列中,我可以用volatile替换原子吗
- 我可以把基础班提升为儿童班吗
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 我可以使用什么来停止循环而不是"返回 0"?
- 我不允许更改变量的声明,我可以编辑哪些其他方法
- 如何读取纹理数据,以便我可以编辑它
- 我自己的C++框架(类似MFC),我可以创建子窗口,但不能在WM_create时创建编辑框
- 有没有办法,我可以检查是否由虚幻编辑器或视觉工作室编译