是否可以将数据从纹理2D(GL_TEXTURE_2D)复制到数组缓冲区(GL_ARRAY_BUFFER)?

时间:2017-04-06 16:09:11

标签: c opengl vertex texture2d vertex-buffer

我正在开发一个可以在GPU上计算直方图的程序。我正在使用OpenGL编写代码。在第一步中,我将像素(RGB)的值加载到数组(arr_image)并将其上传到顶点缓冲区(vbo):

GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);

GLuint num_input_data = width * height;

/* Upload data */
glBufferData(GL_ARRAY_BUFFER, num_input_data * sizeof(float) * 3, arr_image, GL_STATIC_DRAW);

它正在工作,我可以计算出图像的直方图。

但是现在,我想要从纹理(GL_TEXTURE_2D)(作为我之前的步骤的结果)加载数据到数组缓冲区(GL_ARRAY_BUFFER)。有可能吗?

1 个答案:

答案 0 :(得分:3)

我不确定您的整体方法是否真的是最好的方法,但我在这里只讨论您的具体问题:

OpenGL中的缓冲区对象可以绑定到每个缓冲区目标。要将像素数据从纹理复制到缓冲区对象,您只需将缓冲区绑定到GL_PIXEL_PACK_BUFFER,这意味着将其用作Pixel Buffer Object (PBO)。当绑定PBO时,从GL读回像素数据的任何操作都将把数据写入PBO。因此,您可以发出glGetTexImage来电。就像VBO一样,这些调用的pixels指针现在被解释为不是客户端内存地址,而是PBO的偏移量。

然后,您可以将此缓冲区绑定到GL_ARRAY_BUFFER目标,并将其用作顶点数据的源。