OpenGL + Visual Sudio 2017: окно рендеринга не отображается (было нормально с Visual 2010) - PullRequest
0 голосов
/ 24 июня 2019

Обновлено:

Проблема решена!Решение вдохновлено советом в комментариях:

Я только что обновил графический драйвер, и теперь весь мой код работает нормально.Для информации, упомянутым драйвером является «Inter (R) UHD Graphics 620», который я обновил до версии 25.20.10.6472 (10/12/2018).

Приносим извинения за неудобства и благодарю вас за всеВаша поддержка.

Использование ScreenToGif (благодаря Strive Sun ) выглядит следующим образом: главное (OpenGL) окно - это внешний вид некоторого видакосмический корабль (с разноцветными бустерами), а в правом нижнем углу окно (GDI) представляет собой вид от пилота ИИ, который учится есть зеленые десны и избегать красных).

GeneticNeuralNetwork

Если вы, мистер StackOverflow , считаете, что этот тип бессвязных действий не подходит, пожалуйста, удалите его ...

Ниже, оригинальный вопрос:

У меня есть небольшой пример кода OpenGl под Windows, который отлично работает с Windows 7 + Visual Studio 2010. Но на моем новом ПК с Windows 10 + Visual Studio 2017 окно рендеринга OpenGL неотображается.Компиляция в порядке, и во время выполнения ошибки не возвращаются.

Итак, чтобы опубликовать это здесь, не беспокоясь о куче вещей, я написал небольшую выдержку из своего кода.Он использует только базовые встроенные функции gdi + opengl, предоставляемые стандартным Win API (gl.h / glu.h), но не какую-либо дополнительную библиотеку (например, glew / glut / freeglut /...).

СWindows7 + VS2010 У меня есть 3 окна: рендеринг GDI, рендеринг OpenGL и консоль.

  • На первом: несколько пересекающихся синих линий (с использованием « LineTo »).
  • На втором: один фиолетовый треугольник (с использованием " glVertex3d ").
  • На консоли появляется сообщение о том, что все функции вернулись.

В Windows10 + VS2017 окно OpenGL не отображается.Я даже не вижу призрака, когда играю с клавишами alt-tab.

Я полагаю, что что-то изменилось в API, но я не могу понять, что ...

Вот мой код:

#include <windows.h>
#include <cstdio>
#include <GL/GLU.h>

static LRESULT CALLBACK win32callback ( HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam ) 
    {
    return DefWindowProcA( hWnd,message,wParam,lParam ) ;
    }

HWND create_window ( BOOL & ok , int x )
    {
    WNDCLASSEXA wcx ;
    memset( &wcx,0,sizeof( wcx )) ;
    wcx.cbSize        = sizeof( wcx ) ;
    wcx.lpfnWndProc   = win32callback ;
    wcx.lpszClassName = "spam" ;
    RegisterClassExA( &wcx ) ;

    HWND hwnd = CreateWindowExA( 0,"spam",NULL,WS_POPUP,x+10,10,500,500,NULL,NULL,NULL,NULL ) ;
    ok = ok && SetWindowPos( hwnd,HWND_TOPMOST,x+10,10,500,500,SWP_NOOWNERZORDER|SWP_SHOWWINDOW ) ;
    ok = ok && ShowWindow( hwnd,SW_SHOWNORMAL ) ;

    return hwnd ;
    }

void play_opengl ( HWND hwnd , BOOL & ok )
    {
    HDC dc = GetWindowDC( hwnd ) ;

    PIXELFORMATDESCRIPTOR pfd ;
    memset( &pfd,0,sizeof( PIXELFORMATDESCRIPTOR )) ;
    pfd.nSize      = sizeof( PIXELFORMATDESCRIPTOR ) ;
    pfd.nVersion   = 1 ;
    pfd.dwFlags    = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER ;
    pfd.iPixelType = PFD_TYPE_RGBA ;
    pfd.cColorBits = 24 ;
    pfd.cDepthBits = 32 ;
    pfd.iLayerType = PFD_MAIN_PLANE ;
    int PixFormat  = ChoosePixelFormat( dc,&pfd ) ;

    ok = ok && SetPixelFormat( dc,PixFormat,&pfd ) ;

    HGLRC glrc = wglCreateContext( dc ) ;
    ok = ok && wglMakeCurrent( dc,glrc ) ;

    glViewport( 0,0,500,500 ) ;
    glEnable( GL_COLOR_MATERIAL ) ;
    glMatrixMode( GL_PROJECTION ) ;
    gluPerspective( 70,1,0.1,1000 ) ;
    glMatrixMode( GL_MODELVIEW ) ;
    glLoadIdentity() ;
    glColor3b( 100,50,120 ) ;
    glTranslated( 0,0,-20 ) ;

    glBegin( GL_TRIANGLES ) ;
    glVertex3d( 0,0,0 ) ;
    glVertex3d( 5,5,0 ) ;
    glVertex3d( 0,5,0 ) ;
    glEnd() ;

    ok = ok && SwapBuffers( dc ) ;
    }

void play_gdi ( HWND hwnd , BOOL & ok )
    {
    HDC     windc  = GetWindowDC( hwnd ) ;
    HDC     dc     = CreateCompatibleDC( windc ) ;
    HBITMAP bitmap = CreateCompatibleBitmap( windc,500,500 ) ;
    HPEN    pen    = CreatePen( PS_SOLID,1,0xffaa55 ) ;
    ok = ok && (SelectObject( dc,bitmap ) != NULL) ;
    ok = ok && (SelectObject( dc,pen ) != NULL) ;
    for ( int i = 0 ; i < 100 ; i++ )
        ok = ok && LineTo( dc,(i&1?i:100-i)*4,(i&1)*400 ) ;
    BitBlt( windc,0,0,500,500,dc,0,0,SRCCOPY ) ;
    }

void main ()
    {
    BOOL ok = TRUE ;
    HWND hwnd1 = create_window( ok,0 ) ;
    HWND hwnd2 = create_window( ok,600 ) ;
    play_gdi( hwnd1,ok ) ;
    play_opengl( hwnd2,ok ) ;
    // sorry I don't clean up anything...
    if (ok) printf("\n all correct!\n") ;
    printf("\n\n press ENTER") ; 
    getchar() ;
    }

1 Ответ

1 голос
/ 25 июня 2019

То, о чем вы говорите, это то, что окно-призрак создается с помощью следующего кода.

for ( int z = -n ; z <= n ; z++ )
        for ( int y = -n ; y <= n ; y++ )
            for ( int x = -n ; x <= n ; x++ )
                {
                printf(" %d,%d,%d%s",x,y,z,x?"":"\n") ;
                SwapBuffers( dc ) ;
                glTranslated( x,y,z ) ;
                gluSphere( quadric,4,5,5 ) ;
                glTranslated( -x,-y,-z ) ;
                }

Я не знаю, какое окно вы хотите визуализировать с помощью этого кода, но это так.Ваш цикл for зацикливался на матрице сфер.

Я пытаюсь заменить часть вашего кода на мой для целей тестирования.

#include <windows.h>
#include <cstdio>
#include <math.h>
#include <GL/GLU.h>

#pragma comment (lib,"Glu32.lib")
#pragma comment (lib,"Opengl32.lib")

void draw();

int width, height;      // the desired width and height of the CLIENT AREA
HDC dc;

static LRESULT CALLBACK win32callback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    return DefWindowProc(hWnd, message, wParam, lParam);
}
void main()
{
    WNDCLASSEXA wcx;
    memset(&wcx, 0, sizeof(wcx));
    wcx.cbSize = sizeof(wcx);
    wcx.lpfnWndProc = win32callback;
    wcx.lpszClassName = "spam";
    RegisterClassExA(&wcx);

    HWND hwnd = CreateWindowExA(0, "spam", NULL, WS_POPUP, 10, 10, 500, 500, NULL, NULL, NULL, NULL);
    SetWindowPos(hwnd, HWND_TOPMOST, 10, 10, 800, 500, SWP_NOOWNERZORDER | SWP_SHOWWINDOW);
    ShowWindow(hwnd, TRUE);
    SetFocus(hwnd);

    dc = GetWindowDC(hwnd);

    RECT rect;
    SetRect(&rect, 50,  // left
        50,  // top
        850, // right
        650); // bottom

// Save width and height off.
    width = rect.right - rect.left;
    height = rect.bottom - rect.top;

    PIXELFORMATDESCRIPTOR pfd;
    memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 24;
    int PixFormat = ChoosePixelFormat(dc, &pfd);

    PIXELFORMATDESCRIPTOR bestMatch_pfd;
    DescribePixelFormat(dc, PixFormat, sizeof(pfd), &bestMatch_pfd);
    SetPixelFormat(dc, PixFormat, &pfd);

    HGLRC glrc = wglCreateContext(dc); 
    wglMakeCurrent(dc, glrc); 


    while (1)
    {
        draw();
    }    
    DestroyWindow(hwnd);
    wglMakeCurrent(0, 0);
    wglDeleteContext(glrc);
}

void draw()
{
    // 1. set up the viewport
    glViewport(0, 0, g.width, g.height); // set viewport

    // 2. projection matrix
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0, (float)g.width / (float)g.height, 1, 1000);

    // 3. viewing transformation
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    gluLookAt(0, 0, 10,
        0, 0, 0,
        0, 1, 0);

    // 4. modelling transformation and drawing
    glClearColor(0.5, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    static float i = 0.01f;


    i += 0.001f;     // increase i by 0.001 from its
    // it had on the LAST FUNCTION CALL to the draw() function

    float c = cos(i);
    float s = sin(i);

    glBegin(GL_TRIANGLES);
    glColor3f(c, 0, 0);      // red
    glVertex3f(1 + c, 0 + s, 0);

    glColor3f(c, s, 0);      // yellow
    glVertex3f(0 + c, 1 + s, 0);

    glColor3f(s, 0.1f, s);   // magenta
    glVertex3f(-1 + c, 0 + s, 0);
    glEnd();

    //7.  SWAP BUFFERS.
    SwapBuffers(dc);

}

1

Вы можете видеть, что это работает очень хорошо, моя конфигурация среды: VS2017 Window 10

Обновлено:

2

Попробуйте связать "Glu32.lib" и "Opengl32.lib"

Обновлено:

Попробуйте следующие два метода:

  1. Видеокарта не поддерживает текущую версию OpenGL, загрузите EVEREST Ultimate Edition, нажмите на дисплейное устройство> OpenGL по очереди после установки и эксплуатации, чтобы проверить, поддерживает ли она соответствующую информациюв противном случае вы можете только заменить видеокарту или заменить ее на поддерживаемую версию OpenGL для решения проблемы.

  2. Драйвер видеокарты не поддерживается.Достаточно обновить драйвер видеокарты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...