在无窗口的GLX程序中读取OpenGL的默认帧缓冲区

时间:2017-04-17 03:29:37

标签: c++ opengl glx

我想在我的Debian机器上执行一些3D渲染,并将结果带入客户端内存。

我创建了一个不需要窗口的基于C ++,GLX和GLEW的应用程序。我得到一个glXOpenDisplay的显示,用它来找到一个glXChooseFBConfig的正确帧缓冲区(通过显示的DefaultScreen),获取glXGetVisualFromFBConfig的视觉信息,并通过glXCreateContext的相关信息。我把这个背景当前和初始化GLEW。

作为一个开始测试,我只需清除各种颜色的默认帧缓冲区;我现在想逐个像素地查询结果,大概是glReadPixels

但这是我似乎从根本上误解了一些东西:默认帧缓冲区的维度是什么?我从来没有为它定义初始高度或宽度,我也没有办法这么做。

Answers such as this one暗示窗口"定义"尺寸。在我的应用程序中,DefaultScreen是否定义了维度?如果是这种情况,我该怎么做才能使默认帧缓冲区大于特别小的屏幕?

2 个答案:

答案 0 :(得分:2)

  

并将相关信息传递给glXCreateContext。然后我初始化GLEW。

仅仅因为你有一个上下文并不意味着,你可以立即使用它。考虑如果您有多个上下文会发生什么。在进行OpenGL调用之前,必须使用glXMakeCurrentglXMakeContextCurrent在当前线程上激活上下文。如果你看一下这些functios的签名,你会发现除了OpenGL上下文之外,他们还将Drawable作为参数。所以你也需要它。

对于无窗操作,GLX提供PBuffers,它提供无窗口绘图。或者您可以使用未映射到屏幕的窗口。 PBuffers允许在不使用帧缓冲对象的情况下进行屏幕外渲染,但是使用它们的主帧缓冲区有点挑剔。我的建议是使用0×0大小的PBuffer和帧缓冲对象。

答案 1 :(得分:1)

您需要使用framebuffer对象。它们使用您指定尺寸的纹理。例如:

// Generate framebuffer ID
GLuint fb;
glGenFramebuffers(1, &fb);

// Make framebuffer active
glBindFramebuffer(GL_FRAMEBUFFER, fb);

// Attach color and depth textures (must have same dimensions)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_tex, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_tex, 0);

// Check framebuffer is valid
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);