繁体   English   中英

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

[英]Reading OpenGL's default framebuffer in a windowless GLX program

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

我创建了一个不需要窗口的基于C ++,GLX和GLEW的应用程序。 我得到一个显示glXOpenDisplay ,用它来找到合适的帧缓冲glXChooseFBConfig (经过DefaultScreen显示的),获得与视觉信息glXGetVisualFromFBConfig ,并传递相关信息给glXCreateContext 我将当前上下文设为当前状态并初始化GLEW。

作为开始测试,我只是清除具有多种颜色的默认帧缓冲区; 我现在想逐个查询结果,大概是使用glReadPixels

但这是我似乎从根本上误解的地方:默认帧缓冲区的尺寸是多少? 我从来没有为它定义初始高度或宽度,也没有找到一种方法。

这样的回答暗示着窗口“定义”了尺寸。 在我的应用程序中, DefaultScreen定义尺寸? 如果是这样,我该怎么做才能使默认帧缓冲区大于特别小的屏幕?

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

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

对于无窗口操作,GLX提供了PBuffers,这些缓冲区提供了无窗口可绘制对象。 或者,您可以使用不映射到屏幕的窗口。 PBuffer允许在不使用帧缓冲区对象的情况下进行屏幕外渲染,但是使用它们的主帧缓冲区有点挑剔。 我的建议是使用大小为0×0的PBuffer和一个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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM