【发布时间】:2011-07-04 07:27:18
【问题描述】:
我正在编写一些代码,我可以访问的只是一个 textureID 来访问所需的纹理。有什么方法可以访问此纹理的 RGB 值,以便对其执行一些计算?
编辑:我正在寻找 glTexSubImage2D 的倒数。我想获取纹理数据而不是替换它。
【问题讨论】:
我正在编写一些代码,我可以访问的只是一个 textureID 来访问所需的纹理。有什么方法可以访问此纹理的 RGB 值,以便对其执行一些计算?
编辑:我正在寻找 glTexSubImage2D 的倒数。我想获取纹理数据而不是替换它。
【问题讨论】:
您可能正在寻找glGetTexImage
在使用glGetTexImage 之前,不要忘记将glBindTexture 与您的纹理ID 一起使用。
【讨论】:
在 OpneGL 中,glGetTexImage/glGetnTexImage 可以分别读取函数 glGetTextureImage 的 DSA 版本。
另一种可能性是将纹理附加到帧缓冲区并通过glReadPixels 读取像素。 OpenGL ES 不提供glGetTexImage,所以这是 OpenGL ES 的方式。
见opengl es 2.0 android c++ glGetTexImage alternative
如果您将纹理图像传输到Pixel Buffer Object,那么您甚至可以通过Buffer object mapping 访问数据。另见OpenGL Pixel Buffer Object (PBO)。
您必须将具有适当大小的缓冲区绑定到目标GL_PIXEL_PACK_BUFFER:
// create buffer
GLuint pbo;
glGenBuffers(1, &pbo);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
glBufferData(GL_PIXEL_PACK_BUFFER, size_in_bytes, 0, GL_STATIC_READ);
// get texture image
glBindTexture(GL_TEXTURE_2D, texture_obj);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, (void*)(0));
// map pixel buffer
void * data_ptr = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
// access the data
// [...]
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
【讨论】:
我写在这里以防万一有人需要。
在 4.5+ OpenGL 中,可以通过使用 glGetTextureImage()函数。
例如为了得到一个 GL_RGB 纹理数据, 我们有 3 个浮点数 R、G、B,每一个都是 4 个字节,所以:
float* data = new float[texture_height * texture_width * 3];
glGetTextureImage(textureID, 0, GL_RGB, GL_FLOAT, texture_height * texture_width * 3 * 4, data);
【讨论】: