自定义缓冲区OpenGL绘图

dpiehjr4  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(194)

我现在使用的是opengl3.3和glfw来绘制+显示,但是目前OpenGL是在其内部的帧缓冲区中绘制的,我假设它是“glBindFramebuffer(GL_FRAMEBUFFER,0);“
我想知道我是否可以自己定义一个缓冲区,让OpenGL在这个缓冲区中绘图?

GLuint ownbuffer[800*600*4]; // width:800, height:600, ARGB channel

// by setting some APIs to let OpenGL draw in the above buffer?

我读到了FBO,我最初的想法是我可以用它来绘制FBO缓冲区,方法是在纹理缓冲区中填充缓冲区地址。但是,它似乎不起作用。我得到了一个全零缓冲区。

GLuint frameBuffer;
    glGenFramebuffers(1, &frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);

    GLuint texColorBuffer;
    GLuint ownbuffer[800*600*4];
    glGenTextures(1, &texColorBuffer);
    glActiveTexture(GL_TEXTURE8);
    glBindTexture(GL_TEXTURE_2D, texColorBuffer);

    glTexImage2D(
        GL_TEXTURE_2D, 0, GL_RGBA, 800, 600, 0, GL_RGBA, GL_UNSIGNED_BYTE, ownbuffer
    ); // by setting buffer here instead of fill in NULL

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0);

而且,是否可以让glfw显示我们自己的缓冲区?例如上面提到的ownbuffer。
在这种情况下,我不需要将缓冲区数据转储到文件中来检查结果。

tkclm6bt

tkclm6bt1#

  • 我希望opengl直接绘制到我准备的缓冲区(ownbuffer)...*

对不起,这是不可能的。OpenGL在(默认)帧缓冲区中渲染,您不能将其重定向(或镜像)到CPU内存地址。
不能将纹理或渲染缓冲区附加到默认帧缓冲区。必须创建一个命名的帧缓冲区对象:

GLuint fbo;
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0);

并且可以使用glBlitFramebuffer:将颜色平面的像素从默认帧缓冲区(0)复制到指定的帧缓冲区中。

glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
glBlitFramebuffer(0, 0, 800, 600, 0, 0, 800, 600, GL_COLOR_BUFFER_BIT, GL_NEAREST);

无论如何,现在数据仍然在纹理数据存储中,而不是在ownbuffer中。纹理数据存储和源数据没有链接。glTexImage2D只是复制数据。
您可以直接渲染到指定的帧缓冲区(glBindFramebuffer(GL_FRAMEBUFFER, fbo);),而不是渲染到默认的帧缓冲区。但是,在这种情况下,窗口中不会绘制任何内容。
如果你只想从帧缓冲区读取数据,你需要使用glReadPixelsglReadPixles可以直接将数据读入CPU内存或读入GL_PIXEL_PACK_BUFFER缓冲区。你可以使用缓冲区Map从像素缓冲区(glMapBuffer)访问数据。但是,无论是哪种情况,每次你想获取当前缓冲区数据时都需要调用glReadPixles

相关问题