2014-06-19 8 views
0

Windows 용과 Linux 용으로 다시 구현해야하는 Linux 용 코드가 있습니다. 현재 X-Windows, GLX 및 OpenGL 2.1이며 GLEW를 사용하는 SDL2 및 호환 OpenGL 확장을 사용하고 있습니다 (6 세 그래픽 카드가있는 최신 Windows뿐만 아니라 이전 (Centos 5.3) Linux 플랫폼에서도 실행 중입니다).glxMakeContextCurrent를 Windows로 변환

glXMakeContextCurrent를 대체하는 방법에 대해 고민하고 있습니다. 현재는 픽셀 버퍼 읽기 및 그리기 (GLXPbuffer)를 선택하고 컨텍스트와 연결하는 데 사용됩니다. GLXPbuffers를 대체하기 위해 Pixel Buffer Objects를 사용했지만 glXMakeContextCurrent의 기능을 복제하는 방법을 모르는 경우 나 더 나은 방법이있는 경우에 유용합니다.

기존 코드는 GLXPbuffer로 렌더링 한 다음 glCopyPixels를 사용하여 지정한 컨텍스트를 사용하여 Drawable 및 Draw Drawables 및 Context를 지정하여 한 Drawable (GLXPbuffer)에서 다른 GLXPbuffer로 복사합니다 glXMakeContextCurrent 호출에서. 이것은 주로 2D OpenGL 응용 프로그램입니다.

GLX를 사용하지 않고 어떻게 구현할 수 있습니까? 즉, Windows (Linux는 물론)에서 작동합니까?

Display  *dpy; 
GLXContext osr_ctx; 
GLXPbuffer pbuf2, osr_pbuf; 

void sel_drc(GLXDrawable dst, GLXDrawable src, SDL_GLContext ctx) 
{ 
     if (!src) 
     { 
       if (!glXMakeCurrent(dpy, dst, ctx)) 
       { 
        Error("glXMakeCurrent"); 
       } 
     } 
     else 
     { 
       if (!glXMakeContextCurrent(dpy, dst, src, ctx)) 
       { 
        Error("glXMakeContextCurrent"); 
       } 
     } 
} 
// Display dpy is set up elsewhere. 
// GLXContext and GLXPbuffers get created elsewhere and stored in osr_ctx, pbuf2, osr_pbuf 
// The Display and GLXContexts are to be replaced by their SDL2 equivalents. 
// GLXPbuffers are currently planned to be Pixel Buffer Objects: 
// GLuint pboIds[2]; 
// glGenBuffers(2, pboIds); 
// glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboIds[0]); 
// glBufferData(GL_PIXEL_UNPACK_BUFFER, DATA_SIZE, 0, GL_STREAM_DRAW); 
// etc. 
// 
sel_drc(osr_pbuf, pbuf2, osr_ctx); 
glRasterPos2f(0.1, 0.1); 
glCopyPixels (0, 0, 576, 576, GL_COLOR); 
+1

OS API를 직접 사용하는 대신 GLFW 또는 GLUT와 같은 라이브러리를 사용하여 모든 플랫폼 간 처리를 처리 할 수 ​​있습니다. –

+1

그게 네가 붙어있는 곳이야? 렌더링 컨텍스트를 만들기 전에'glXMakeCurrent (...)'를 호출 할 수 없습니다. 처음으로 컨텍스트 생성을 포팅하는 것부터 시작한다. (즉, ChoosePixelFormat (...), wglCreateContext (...) 등을 읽는 것을 의미한다.) 그런 다음 이것에 대해 걱정한다. –

답변

0

잠재적으로 성능이 낮은 솔루션이기는하지만, 단순한 사용 그들 사이의 프레임 버퍼 개체 및 블릿을 사용하는 glBlitFramebuffer 것으로 나타납니다 : 여기

는 현재 코드가 무엇을 보여주는 코드 세그먼트의

GLuint fboId;      // ID of FBO 
glBindFramebuffer(GL_READ_FRAMEBUFFER, fboId); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
glBlitFramebuffer(0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT, 
        0, 0, screenWidth, screenHeight, 
        GL_COLOR_BUFFER_BIT, 
        GL_LINEAR); 
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); 

두 프레임 버퍼 개체간에 복사하는 것과 동일합니다. 이 경우 코드는 FBO (fboId)에서 기본 Framebuffer (0)로 복사합니다. 텍스처로 렌더링 한 후 바인딩 그 질감 대상 프레임 버퍼에 쿼드를 렌더링하는 데 더 빠르다 것으로 보인다 http://www.songho.ca/opengl/gl_fbo.html

:에서

이 코드입니다. 그러나이 glBlitFramebuffer 접근법은 기존 코드 구조와 비슷하며 현재 채택 된 glCopy 픽셀보다 더 나쁜 것은 아닙니다.