gpt4 book ai didi

Linux 使用 OpenGL 3.2+ w/FBOs 进行离屏渲染

转载 作者:IT王子 更新时间:2023-10-29 00:32:23 24 4
gpt4 key购买 nike

我有 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/

最后它使用像素缓冲区使上下文成为当前上下文,我听说它已被弃用,我们应该放弃它以支持帧缓冲区对象,是吗(我对此可能是错误的)。

有没有人有更好的方法或想法?

最佳答案

我不知道这是否是最佳解决方案,但它肯定适合我。

将函数绑定(bind)到我们可以使用的局部变量

typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*);
typedef Bool (*glXMakeContextCurrentARBProc)(Display*, GLXDrawable, GLXDrawable, GLXContext);
static glXCreateContextAttribsARBProc glXCreateContextAttribsARB = NULL;
static glXMakeContextCurrentARBProc glXMakeContextCurrentARB = NULL;

我们的对象作为类属性:

Display *display;
GLXPbuffer pbuffer;
GLXContext openGLContext;

设置上下文:

    glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc) glXGetProcAddressARB( (const GLubyte *) "glXCreateContextAttribsARB" );
glXMakeContextCurrentARB = (glXMakeContextCurrentARBProc) glXGetProcAddressARB( (const GLubyte *) "glXMakeContextCurrent");

display = XOpenDisplay(NULL);
if (display == NULL){
std::cout << "error getting the X display";
}

static int visualAttribs[] = {None};
int numberOfFrameBufferConfigurations;
GLXFBConfig *fbConfigs = glXChooseFBConfig(display, DefaultScreen(display), visualAttribs, &numberOfFrameBufferConfigurations);

int context_attribs[] = {
GLX_CONTEXT_MAJOR_VERSION_ARB ,3,
GLX_CONTEXT_MINOR_VERSION_ARB, 2,
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_DEBUG_BIT_ARB,
GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
None
};

std::cout << "initialising context...";
this->openGLContext = glXCreateContextAttribsARB(display, fbConfigs[0], 0, True, context_attribs);

int pBufferAttribs[] = {
GLX_PBUFFER_WIDTH, (int)this->initialWidth,
GLX_PBUFFER_HEIGHT, (int)this->initialHeight,
None
};

this->pbuffer = glXCreatePbuffer(display, fbConfigs[0], pBufferAttribs);
XFree(fbConfigs);
XSync(display, False);

使用上下文:

if(!glXMakeContextCurrent(display, pbuffer, pbuffer, openGLContext)){
std::cout << "error with content creation\n";
}else{
std::cout << "made a context the current context\n";
}

之后,就可以像在任何其他场合一样正常使用 FBO。直到今天,我的问题实际上还没有答案(如果有更好的选择),所以我只是提供一个对我有用的解决方案。在我看来,GLX 不像 OpenGL 那样使用像素缓冲区的概念,因此我很困惑。渲染离屏的首选方法是 FBO,但要在 Linux 上创建 OpenGL 上下文,必须创建像素缓冲区(GLX 类型)。之后,将 FBO 与我在问题中提供的代码一起使用将按预期工作,就像在 OS X 上一样。

关于Linux 使用 OpenGL 3.2+ w/FBOs 进行离屏渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21851688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com