Обновлено:
Проблема решена!Решение вдохновлено советом в комментариях:
Я только что обновил графический драйвер, и теперь весь мой код работает нормально.Для информации, упомянутым драйвером является «Inter (R) UHD Graphics 620», который я обновил до версии 25.20.10.6472 (10/12/2018).
Приносим извинения за неудобства и благодарю вас за всеВаша поддержка.
Использование ScreenToGif (благодаря Strive Sun ) выглядит следующим образом: главное (OpenGL) окно - это внешний вид некоторого видакосмический корабль (с разноцветными бустерами), а в правом нижнем углу окно (GDI) представляет собой вид от пилота ИИ, который учится есть зеленые десны и избегать красных).
Если вы, мистер 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() ;
}