2014-02-18 4 views
5

우분투 시스템과 FBO를 사용하여 화면에서 뭔가를 렌더링하는 OS X로 작성된 명령 행 응용 프로그램이 있습니다. 이것은 코드의 일부입니다.OpenGL 3.2+ w/FBO를 사용하여 오프 스크린 렌더링 Linux

 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/

끝에를 객체, 그게 옳은 것입니다 (나는 이것에 대해 틀릴 수도 있습니다).

누구나 더 나은 접근 방식이나 아이디어가 있습니까?

+0

글쎄, 그렇습니다. 렌더 버퍼는 요즘 많이 사용되지 않습니다. –

+0

당신은 정교 할 수 있습니까? 렌더링 버퍼 란 무엇을 의미합니까? 더 나은 크로스 플랫폼 대안이 있습니까? – csotiriou

+0

"renderbuffer"는 무엇을 의미할까요? 귀하의 코드가 그것을 사용하고 있습니다. –

답변

4

그것이 최선의 해결책인지는 잘 모르겠지만 분명히 저에게는 효과적입니다.

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); 
: 컨텍스트를 설정

Display *display; 
GLXPbuffer pbuffer; 
GLXContext openGLContext; 

을 :

우리는 클래스 속성으로

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

우리의 객체를 사용할 수있는 지역 변수에 함수를 바인딩 0 하나는 그가 다른 기회에서와 마찬가지로, 일반적으로 식 코멘트를 사용, 그 후

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

수 있습니다

컨텍스트를 사용. 지금까지 내 질문에 답이 없습니다 (더 좋은 대안이 있다면). 그래서 저는 저에게 도움이되는 해결책을 제시하고 있습니다. GLX가 OpenGL과 같은 방식으로 픽셀 버퍼 개념을 사용하지 않는다고 생각합니다. 따라서 혼란 스럽습니다. 오프 스크린에서 렌더링하는 가장 좋은 방법은 FBO이지만 Linux에서 OpenGL 컨텍스트를 만들려면 픽셀 버퍼 (GLX 종류)를 만들어야합니다. 그 후 질문에 제공된 코드로 FBO를 사용하면 OS X에서와 같은 방식으로 예상대로 작동합니다.

관련 문제