我现在使用的是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。
在这种情况下,我不需要将缓冲区数据转储到文件中来检查结果。
1条答案
按热度按时间tkclm6bt1#
ownbuffer
)...*对不起,这是不可能的。OpenGL在(默认)帧缓冲区中渲染,您不能将其重定向(或镜像)到CPU内存地址。
不能将纹理或渲染缓冲区附加到默认帧缓冲区。必须创建一个命名的帧缓冲区对象:
并且可以使用
glBlitFramebuffer
:将颜色平面的像素从默认帧缓冲区(0)复制到指定的帧缓冲区中。无论如何,现在数据仍然在纹理数据存储中,而不是在
ownbuffer
中。纹理数据存储和源数据没有链接。glTexImage2D
只是复制数据。您可以直接渲染到指定的帧缓冲区(
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
),而不是渲染到默认的帧缓冲区。但是,在这种情况下,窗口中不会绘制任何内容。如果你只想从帧缓冲区读取数据,你需要使用
glReadPixels
。glReadPixles
可以直接将数据读入CPU内存或读入GL_PIXEL_PACK_BUFFER
缓冲区。你可以使用缓冲区Map从像素缓冲区(glMapBuffer
)访问数据。但是,无论是哪种情况,每次你想获取当前缓冲区数据时都需要调用glReadPixles
。