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

Reading OpenGL's default framebuffer in a windowless GLX program

本文关键字:OpenGL 默认 缓冲 读取 窗口 GLX 程序      更新时间:2023-10-16

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

我创建了一个基于C ,GLX和GLEW的应用程序,该应用程序不需要窗口。我获得了glXOpenDisplay的显示,使用它来找到带有glXChooseFBConfig的适当帧缓冲器(通过显示的DefaultScreen(,获取使用glXGetVisualFromFBConfig的视觉信息,然后将相关信息传递给glXCreateContext。我使这种情况当前&初始化glew。

作为开始测试,我只是清除带有多种颜色的默认框架。我现在想查询结果像素像素,大概是用glReadPixels

但这是我似乎从根本上误解某些东西的地方:默认的framebuffer的尺寸是多少?我从不定义初始高度或宽度,也没有看到一种方法。

这样的回答意味着窗口"定义"了尺寸。在我的应用程序中,DefaultScreen是否定义尺寸?如果是这样,我该怎么做才能使默认的帧缓冲程序比特别小的屏幕更大?

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

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

对于无窗操作,GLX提供了Pbuffers,可提供无窗的抽烟物。或者,您可以使用不映射到屏幕的窗口。Pbuffers可以在不使用Framebuffer对象的情况下进行屏幕外渲染,但是使用其主框架的使用有点挑剔。我的建议是使用0×0尺寸的pbuffer和framebuffer对象。

您需要使用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);