在无窗口 GLX 程序中读取 OpenGL 的默认帧缓冲
Reading OpenGL's default framebuffer in a windowless GLX program
我想在我的debian机器上执行一些3D渲染,并将结果带入客户端内存。
我创建了一个基于C ,GLX和GLEW的应用程序,该应用程序不需要窗口。我获得了glXOpenDisplay
的显示,使用它来找到带有glXChooseFBConfig
的适当帧缓冲器(通过显示的DefaultScreen
(,获取使用glXGetVisualFromFBConfig
的视觉信息,然后将相关信息传递给glXCreateContext
。我使这种情况当前&初始化glew。
作为开始测试,我只是清除带有多种颜色的默认框架。我现在想查询结果像素像素,大概是用glReadPixels
。
但这是我似乎从根本上误解某些东西的地方:默认的framebuffer的尺寸是多少?我从不定义初始高度或宽度,也没有看到一种方法。
这样的回答意味着窗口"定义"了尺寸。在我的应用程序中,DefaultScreen
是否定义尺寸?如果是这样,我该怎么做才能使默认的帧缓冲程序比特别小的屏幕更大?
并将相关信息传递给GlxCreateContext。然后我初始化glew。
仅仅因为您的上下文并不意味着您可以立即使用它。考虑如果您有多个上下文会发生什么。在进行OpenGL调用之前,您必须使用glXMakeCurrent
或glXMakeContextCurrent
在当前线程上使活动性上下文。如果您查看这些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);
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 了解 GLM- openGL 中的相机转换
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 初始化具有非默认构造函数的std::数组项的更好方法
- 何时提供默认参数作为模板参数
- 是默认情况下分配给char数组常量的值
- 如何在全屏模式下(在OpenGL中)使背景透明
- 具有默认值的引用获取函数
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 在 OpenGL/GLFW 中管理默认着色器
- 在无窗口 GLX 程序中读取 OpenGL 的默认帧缓冲
- OpenGL - 绑定到默认纹理的做法?
- OpenGL红色书籍示例1-1错误lnk2019;Glut和Glew的问题以及许多默认的Libs
- 使用默认构造函数调用的网格类不起作用 OpenGL C++
- 是否可以仅使用OpenGL来确定默认帧缓冲区的大小
- OpenGL红皮书-如果枚举默认为整数,从0开始,glBindVertexArray如何绑定到保留值0