问题解决了!该解决方案的灵感来自评论中的建议:
我刚刚更新了图形驱动程序,现在我的所有代码都能正常工作。 有关信息,提到的驱动程序是“ Inter(R)UHD Graphics 620”,我将其更新为版本25.20.10.6472(10/12/2018)。
给您带来的不便,我们深表歉意。感谢您的支持。
使用 ScreenToGif (感谢 Strive Sun ),如下所示:主(OpenGL)窗口是某种太空船的外部视图(带有彩色助推器),在右下角的(GDI)窗口是AI飞行员的视图,该驾驶员正在学习吃绿色的牙龈,避免红色的牙龈。
StackOverflow先生,如果您认为这种杂乱的做法不合适,请删除它...
下面是原始问题:
我在Windows下有一小段OpenGl代码,可以在Windows 7 + Visual Studio 2010上正常工作。 但是在装有Windows 10 + Visual Studio 2017的新PC上,未显示OpenGL渲染窗口。 编译正常,在执行过程中不返回错误。
因此,为了将它发布到这里而又不打扰您,我编写了我的代码的简短摘录。 它仅使用标准win API(gl.h / glu.h)提供的基本本机gdi + opengl函数,而不使用任何其他库(如glew / glut / freeglut /...)。
在Windows7 + VS2010中,我有3个窗口:GDI渲染,OpenGL渲染和控制台。
在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() ;
}
答案 0 :(得分:1)
您所谈论的是幽灵窗口是由以下代码创建的。
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);
}
您可以看到它运行良好,我的环境配置为:VS2017 Window 10
已更新:
尝试链接“ Glu32.lib”和“ Opengl32.lib”
已更新:
尝试以下两种方法:
图形卡不支持当前的OpenGL
版本,请下载EVEREST Ultimate Edition,在安装和操作后依次单击显示设备> OpenGL
,以检查其是否支持相关版本。信息,否则,您只能替换图形卡或将其替换为受支持的OpenGL
版本以解决该问题。
不支持图形卡驱动程序。更新显卡驱动程序就足够了。