我想在我的Debian机器上执行一些3D渲染,并将结果带到客户端内存中。
我已经创建了一个不需要窗口的基于C++、GLX和GLEW的应用程序。我用glXOpenDisplay获得一个显示,用glXChooseFBConfig (传递显示器的DefaultScreen )找到合适的框架缓冲区,用glXGetVisualFromFBConfig获取可视信息,并将相关信息传递给glXCreateContext。我使这个上下文成为当前的&初始化GLEW。
作为一个开始测试,我只是使用各种颜色来清除默认的框架缓冲区;现在我想逐像素地查询结果,大概是使用glReadPixels。
但我似乎从根本上误解了这一点:默认框架缓冲区的维度是什么?我从来没有为它定义一个初始高度或宽度,我也没有看到这样做的方法。
Answers such as this one暗示窗口“定义”维度。在我的应用程序中,DefaultScreen是否定义了维度?如果是这样的话,我能做什么使默认的帧缓冲区大于一个特别小的屏幕?
发布于 2017-04-17 08:21:45
并将相关信息传递给glXCreateContext。然后初始化GLEW。
仅仅因为你有上下文并不意味着你可以立即使用它。考虑一下,如果您有多个上下文,会发生什么。在进行OpenGL调用之前,必须使用glXMakeCurrent或glXMakeContextCurrent在当前线程上创建活动上下文。如果您查看这些函数的签名,您会发现除了OpenGL上下文之外,它们还带有一个可绘制的参数。所以你也需要这个。
对于无窗口操作,GLX提供PBuffers,它提供无窗口的绘图。或者你可以用一个不映射到屏幕的窗口。PBuffers允许在不使用framebuffer对象的情况下进行屏幕外呈现,但是它们的主帧缓冲区的使用有点挑剔。我建议使用一个0×0大小的PBuffer和一个framebuffer对象。
发布于 2017-04-17 04:14:08
您需要使用框架缓冲区对象。这些使用的纹理,其尺寸您已经指定。例如:
// 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);https://stackoverflow.com/questions/43444724
复制相似问题