2014-06-19 68 views
0

我有一些爲Linux編寫的代碼,我需要重新實現,以便它可以在Windows和Linux上工作。目前它是X-Windows,GLX和OpenGL 2.1,我使用的是使用GLEW的SDL2和兼容的OpenGL擴展(它仍然運行在舊的(Centos 5.3)Linux平臺以及最近使用6年的圖形卡的Windows上)。將glxMakeContextCurrent轉換爲Windows

我被困在如何取代glXMakeContextCurrent。這當前用於選擇Read和Draw Pixel Buffers(GLXPbuffer)並與上下文關聯。我一直在尋找使用像素緩衝區對象來替換GLXPbuffers,但不知道如何使用這些技術來複制glXMakeContextCurrent的功能,或者如果有更好的方法來做到這一點。

現有代碼將其設置爲使其呈現爲GLXPbuffer,然後使用glCopyPixels使用指定的上下文將Draw和Read 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); 

這相當於在兩個Framebuffer對象之間進行復制。在這種情況下,代碼從FBO(fboId)複製到默認幀緩衝區(0)。

此代碼是: http://www.songho.ca/opengl/gl_fbo.html

這似乎是更快地渲染到紋理然後渲染四到目標幀緩衝帶紋理的約束。但是,這種glBlitFramebuffer方法接近現有的代碼結構,可能不會比當前使用的glCopyPixel更差。