只有左图像显示在OpenGL Stereo上

时间:2013-11-25 17:17:33

标签: c++ image visual-c++ opengl textures

尝试在OpenGL上显示两个图像时出现问题(使用PFD_STEREO启用立体声)。当我尝试同时显示2张图像时,只显示一张(最后)图像而另一张图像只显示黑色(图像未显示)。

以下是代码:

WNDCLASS wc;
HWND hWnd;
HDC hDC;
HGLRC hRC;
MSG msg;
BOOL bQuit = FALSE;

GLuint  leftImage,rightImage;

// register window class
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
wc.lpszMenuName = NULL;
wc.lpszClassName = "GLSample";

RegisterClass( &wc );

// create main window
hWnd = CreateWindow( "GLSample", "OpenGL Texture Sample", 
WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
0, 0, 800, 600,
NULL, NULL, hInstance, NULL );

// enable OpenGL for the window
EnableOpenGL( hWnd, &hDC, &hRC );

// load our texture
leftImage = LoadTexture( "left0000.bmp", TRUE );
rightImage= LoadTexture( "right0000.bmp", TRUE );

// program main loop
while ( !bQuit ) {
    // check for messages
    if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
    {
        // handle or dispatch messages
        if ( msg.message == WM_QUIT )
        {
            bQuit = TRUE;
        }
        else
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }
    else
    {
        glDrawBuffer(GL_BACK_LEFT);
        glClear(GL_COLOR_BUFFER_BIT);

        glDrawBuffer(GL_BACK_RIGHT);
        glClear(GL_COLOR_BUFFER_BIT);

        // setup texture mapping
        glEnable( GL_TEXTURE_2D );
        glBindTexture( GL_TEXTURE_2D, leftImage );

        glPushMatrix();

        glBegin( GL_QUADS );
            glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);
            glTexCoord2d(1.0,0.0); glVertex2d(+1.0,-1.0);
            glTexCoord2d(1.0,1.0); glVertex2d(+1.0,+1.0);
            glTexCoord2d(0.0,1.0); glVertex2d(-1.0,+1.0);
        glEnd();

        glBindTexture( GL_TEXTURE_2D, rightImage );

        glBegin( GL_QUADS );
            glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);
            glTexCoord2d(1.0,0.0); glVertex2d(+1.0,-1.0);
            glTexCoord2d(1.0,1.0); glVertex2d(+1.0,+1.0);
            glTexCoord2d(0.0,1.0); glVertex2d(-1.0,+1.0);
        glEnd();

        glPopMatrix();
        glDisable( GL_TEXTURE_2D );

        SwapBuffers( hDC );
    }
}

// free the texture
FreeTexture( leftImage );
FreeTexture( rightImage );

// shutdown OpenGL
DisableOpenGL( hWnd, hDC, hRC );

// destroy the window explicitly
DestroyWindow( hWnd );

return msg.wParam;

只要我尝试过,我确定代码在这里效果不好:

glDrawBuffer(GL_BACK_LEFT);
glClear(GL_COLOR_BUFFER_BIT);

glDrawBuffer(GL_BACK_RIGHT);
glClear(GL_COLOR_BUFFER_BIT);

// setup texture mapping
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, leftImage );

glPushMatrix();

glBegin( GL_QUADS );
    glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);
    glTexCoord2d(1.0,0.0); glVertex2d(+1.0,-1.0);
    glTexCoord2d(1.0,1.0); glVertex2d(+1.0,+1.0);
    glTexCoord2d(0.0,1.0); glVertex2d(-1.0,+1.0);
    glEnd();

glBindTexture( GL_TEXTURE_2D, rightImage );

    glBegin( GL_QUADS );
        glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);
        glTexCoord2d(1.0,0.0); glVertex2d(+1.0,-1.0);
        glTexCoord2d(1.0,1.0); glVertex2d(+1.0,+1.0);
        glTexCoord2d(0.0,1.0); glVertex2d(-1.0,+1.0);
    glEnd();

glPopMatrix();
glDisable( GL_TEXTURE_2D );

SwapBuffers( hDC );

1 个答案:

答案 0 :(得分:3)

您是否检查过实际选择的pixelformat是否支持立体声?不幸的是,由于政治/营销而非技术原因,NVidia和AMD的消费级GPU不支持四缓冲立体声。所以你回来的像素格式可能也不支持它。因此,在这种情况下,右眼帧缓冲不可用。

更新

除此之外:你在哪里设置想要实际渲染的帧缓冲区?

看起来应该是这样的:

glDrawBuffer(GL_BACK);  // <<<< enable both back buffers for clearing
glClear(GL_COLOR_BUFFER_BIT);

// setup texture mapping
glEnable( GL_TEXTURE_2D );

glPushMatrix();

glBindTexture( GL_TEXTURE_2D, leftImage );
glDrawBuffer(GL_BACK_LEFT); // <<<< enable left back buffer to draw left image to
glBegin( GL_QUADS );
    glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);
    glTexCoord2d(1.0,0.0); glVertex2d(+1.0,-1.0);
    glTexCoord2d(1.0,1.0); glVertex2d(+1.0,+1.0);
    glTexCoord2d(0.0,1.0); glVertex2d(-1.0,+1.0);
glEnd();


glBindTexture( GL_TEXTURE_2D, rightImage );
glDrawBuffer(GL_BACK_RIGHT); // <<<< enable left back buffer to draw right image to
glBegin( GL_QUADS );
    glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);
    glTexCoord2d(1.0,0.0); glVertex2d(+1.0,-1.0);
    glTexCoord2d(1.0,1.0); glVertex2d(+1.0,+1.0);
    glTexCoord2d(0.0,1.0); glVertex2d(-1.0,+1.0);
glEnd();

glPopMatrix();
glDisable( GL_TEXTURE_2D );

SwapBuffers( hDC );