только левое изображение отображается на OpenGL Stereo

0

У меня проблема при попытке отобразить два изображения в OpenGL (Stereo Enabled с 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 );
Теги:
opengl
image
visual-c++
textures

1 ответ

3
Лучший ответ

Вы проверили, что выбранный pixelformat поддерживает стерео? К сожалению, из-за политических/маркетинговых и нетехнических причин графические процессоры потребительского класса как от NVIDIA, так и от AMD не поддерживают стереосистему quadbuffer. Поэтому, вероятно, пиксельная форма, которую вы получили, тоже не поддерживает. Следовательно, правый фреймбуфер глаз не будет доступен в этом случае.

Обновить

В дополнение к этому: где вы устанавливаете, в каком фреймбуфере вы хотите фактически отобразить?

Он должен выглядеть примерно так:

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 );
  • 0
    Я попробовал на поддерживаемой графической карте с четырьмя буферами (протестирован с Quadro 4000, Quadro 600, Quadro FX 3500), она хорошо работает, используя образец gali-3d (красный синий) www.gali-3d.com/archive/articles/StereoOpenGL/StereoscopicOpenGLTutorial .php. В этом примере не используются растровые данные, поэтому я пытаюсь реализовать нечто подобное (стерео) с растровыми данными, но в результате отображается только одно изображение. (используя код выше).
  • 0
    @ respeto14: смотрите обновление моего ответа
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню