我有一些为Linux编写的代码,我需要重新实现它,因此它可以在Windows和Linux上运行。它目前是X-Windows,GLX和OpenGL 2.1,我使用SDL2和使用GLEW的兼容OpenGL扩展(它仍然运行在旧的(Centos 5.3)Linux平台以及最近的Windows上有6岁的显卡)。
我坚持如何替换glXMakeContextCurrent。这当前用于选择读取和绘制像素缓冲区(GLXP缓冲区)并与上下文关联。我一直在寻找使用Pixel Buffer Objects来替换GLXPbuffers,但不知道如何使用这些技术复制glXMakeContextCurrent的功能,或者是否有更好的方法来实现它。
现有代码设置它以便渲染到GLXPbuffer然后使用glCopyPixels使用指定的上下文从一个drawable(一个GLXPbuffer)复制到另一个(另一个GLXPbuffer),同时指定Draw和Read Drawables和Context 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 );
答案 0 :(得分:1)
看起来似乎是一种简单但尽管可能性能较低的解决方案是使用帧缓冲对象并使用glBlitFramebuffer在它们之间进行blit:
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
似乎渲染到纹理然后使用该纹理绑定将四边形渲染到目标Framebuffer中会更快。但是,这种glBlitFramebuffer方法接近现有的代码结构,并且可能不会比目前使用的glCopyPixels更糟糕。