【发布时间】:2014-03-18 02:00:17
【问题描述】:
我有 ubuntu 机器和一个用 OS X 编写的命令行应用程序,它使用 FBO 渲染屏幕外的东西。这是代码的一部分。
this->systemProvider->setupContext(); //be careful with this one. to add thingies to identify if a context is set up or not
this->systemProvider->useContext();
glewExperimental = GL_TRUE;
glewInit();
GLuint framebuffer, renderbuffer, depthRenderBuffer;
GLuint imageWidth = _viewPortWidth,
imageHeight = _viewPortHeight;
//Set up a FBO with one renderbuffer attachment
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glGenRenderbuffers(1, &renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB, imageWidth, imageHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
//Now bind a depth buffer to the FBO
glGenRenderbuffers(1, &depthRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, _viewPortWidth, _viewPortHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderBuffer);
“系统提供程序”是围绕 OS X 的 NSOpenGLContext 的 C++ 包装器,它仅用于创建渲染上下文并使其成为当前状态,而不会将其与窗口相关联。所有的渲染都发生在 FBO 中。
我正在尝试对使用 GLX 的 Linux (Ubuntu) 使用相同的方法,但我很难做到,因为我看到 GLX 需要一个像素缓冲区。
我正在尝试学习本教程:
http://renderingpipeline.com/2012/05/windowless-opengl/
最后,它使用像素缓冲区使上下文成为当前的,我听说它已被弃用,我们应该放弃它以支持帧缓冲区对象,对吗(我可能错了)。
有没有人有更好的方法或想法?
【问题讨论】:
-
嗯,是的,渲染缓冲区现在用处不大。
-
你能详细说明一下吗?渲染缓冲区是什么意思?你有更好的跨平台替代品吗?
-
“渲染缓冲区”可能是什么意思?您的代码正在使用它们。
-
我希望您能详细说明替代方案,以及为什么您认为它们不是很有用,因为通过小型谷歌搜索,人们说最好的方法之一是不仅使用 fbo用于离屏渲染,也用于渲染到纹理效果。我很想听听你的替代方案。
-
@BartekBanachewicz 我相信他在谈论像素缓冲区,而不是渲染缓冲区。我正在尝试在 Ubuntu 上使用 GLX 做同样的事情。 OP 提到的链接使用像素缓冲区来生成上下文。但是不推荐使用像素缓冲区,并且首选 FBO。他要问的是,如果我们想使用 FBO,需要做什么。