将向量<GLubyte> 缓冲区复制到帧缓冲区

Posted

技术标签:

【中文标题】将向量<GLubyte> 缓冲区复制到帧缓冲区【英文标题】:Copy vector<GLubyte> buffer to framebuffer 【发布时间】:2020-04-29 01:20:43 【问题描述】:

我试图避免在我的代码中使用glDrawPixels,所以我正在寻找替代方案。

下面是我用来将帧缓冲区内容读入vector&lt;GLubyte&gt; 的代码。现在我需要代码将矢量内容传输回帧缓冲区。我尝试了十几种不同的尝试,但都没有成功。

glReadBuffer(GL_COLOR_ATTACHMENT0);

GLuint copy_tex = 0;
glGenTextures(1, &copy_tex);

vector<GLubyte> tex_buf(4 * win_x * win_y, 0);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, copy_tex);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, win_x, win_y, 0);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, &tex_buf[0]);

for (size_t i = 0; i < win_x; i++)

    for (size_t j = 0; j < win_y; j++)
    
        size_t index = 4 * (i*win_y + j);

        tex_buf[index + 0] = 255;
        tex_buf[index + 1] = 127;
        tex_buf[index + 2] = 0;
    


glDrawPixels(win_x, win_y, GL_RGBA, GL_UNSIGNED_BYTE, &tex_buf[0]);

glDeleteTextures(1, &copy_tex);

【问题讨论】:

您是否打算让它全部不可见?您已将每个像素的 alpha 设置为 0。尝试设置tex_buf[index + 3] = 255; 亲爱的 Nathan,感谢您指出这一点。我更新了我电脑上的代码。 我想我应该问的是如何从纹理复制到帧缓冲区? 【参考方案1】:

glGetTexImage 返回一个纹理图像。如果要将图像写回纹理,则可以使用glTexSubImage2D

glDrawPixels(GL_TEXTURE_2D, 0, 0, 0, win_x, win_y, GL_RGBA, GL_UNSIGNED_BYTE, &tex_buf[0]);

如果你想将一个像素块从一个帧缓冲对象复制到另一个,那么你可以使用glBlitFramebuffer。例如从命名帧缓冲区复制到默认帧缓冲区:

glBindFramebuffer(GL_READ_FRAMEBUFFER, my_fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, win_x, win_y, 0, 0, window_h, window_w, GL_COLOR_BUFFER_BIT, GL_LINEAR);

window_hwindow_w 可以与win_xwin_y 不同,并且是默认帧缓冲区的大小。

【讨论】:

亲爱的 Rabbif76,感谢您的专业知识。我已经设法从向量复制回 GPU 内存。现在我想我需要一种从纹理复制到帧缓冲区的方法。我正在有效地尝试替换 glDrawPixels,因为它不再适用于 GLFW。感谢您的宝贵时间。 @shawn_halayka 您不能从纹理复制到帧缓冲区,因为纹理是帧缓冲区的颜色平面。帧缓冲区没有自己的像素数据。如果您想从命名的帧缓冲区复制到默认帧缓冲区(窗口中显示的缓冲区)。然后按照我的回答中的说明使用glBlitFramebuffer 一切顺利。我最终绘制到全屏“四边形”。一个非常有用的源代码是:raw.githubusercontent.com/progschj/OpenGL-Examples/master/…

以上是关于将向量<GLubyte> 缓冲区复制到帧缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

纹理数组,创建纹理

如何将一个向量复制到另一个向量的末尾? [复制]

将轮廓点向量复制到垫子中

以相反的顺序将一个向量复制到另一个向量

C ++创建一个向量大小的数组,然后将向量复制到C样式数组中[重复]

当我想将数据从堆栈移动到向量时如何避免复制?