首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在无窗口GLX程序中读取OpenGL的默认帧缓冲区

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

Stack Overflow用户
提问于 2017-04-17 03:29:37
回答 2查看 622关注 0票数 1

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

我已经创建了一个不需要窗口的基于C++、GLX和GLEW的应用程序。我用glXOpenDisplay获得一个显示,用glXChooseFBConfig (传递显示器的DefaultScreen )找到合适的框架缓冲区,用glXGetVisualFromFBConfig获取可视信息,并将相关信息传递给glXCreateContext。我使这个上下文成为当前的&初始化GLEW。

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

但我似乎从根本上误解了这一点:默认框架缓冲区的维度是什么?我从来没有为它定义一个初始高度或宽度,我也没有看到这样做的方法。

Answers such as this one暗示窗口“定义”维度。在我的应用程序中,DefaultScreen是否定义了维度?如果是这样的话,我能做什么使默认的帧缓冲区大于一个特别小的屏幕?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-17 08:21:45

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2017-04-17 04:14:08

您需要使用框架缓冲区对象。这些使用的纹理,其尺寸您已经指定。例如:

代码语言:javascript
复制
// 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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43444724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档