首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL + Visual 2017 :未显示呈现窗口(Visual2010没有问题)

OpenGL + Visual 2017 :未显示呈现窗口(Visual2010没有问题)
EN

Stack Overflow用户
提问于 2019-06-24 17:41:39
回答 1查看 509关注 0票数 0

更新:

问题解决了!该解决方案的灵感来源于评论中的一项建议:

我刚刚更新了图形驱动程序,现在我所有的代码都正常工作了。有关信息,上述驱动程序是“Interinter(R) UHD Graphics 620”,我将其更新到25.20.10.6472 (10/12/2018)版本。

非常抱歉给您带来不便,谢谢您的支持。

使用ScreenToGif (感谢“奋斗太阳”)这里是这样的:主窗口(OpenGL)是某种宇宙飞船的外部视图(带有彩色助推器),右下角的(GDI)窗口是AI领航员的视图,后者正在学习吃绿色牙龈并避免使用红色牙龈)。

如果你,StackOverflow先生,认为这种杂乱无章是不合适的,请删除它.

下面,最初的问题:

我在windows下有一个OpenGl代码的小示例,它可以很好地工作在windows 7+ visual 2010中。但是在我的带有windows 10 + visual studio 2017的新PC上,OpenGL呈现窗口没有显示。编译正常,在执行过程中不返回错误。

因此,为了在这里发布它而不需要大量的内容,我编写了一个简短的代码摘录。它只使用标准win API (gl.h/gl.h)提供的基本原生gdi+opengl函数,而不使用任何附加库(如glew/glut/freeglut/.)。

使用Windows7+VS2010,我有3个窗口: GDI呈现、OpenGL呈现和控制台。

  • 在第一个:一些交叉的蓝线(使用"LineTo")。
  • 在第二个:一个紫色三角形(使用"glVertex3d")。
  • 在控制台上,有一条消息告诉我,所有函数都返回得很好。

对于Windows10+VS2017,OpenGL窗口是不可见的。我玩alt键的时候连鬼都没看见。

我想API里有些东西变了,但我不知道.

这是我的密码:

代码语言:javascript
复制
#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() ;
    }
EN

回答 1

Stack Overflow用户

发布于 2019-06-25 09:11:55

你要说的是鬼窗口是由下面的代码创建的。

代码语言:javascript
复制
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循环一直在球面矩阵周围循环。

为了测试目的,我正在尝试用我的代码替换你的一些代码。

代码语言:javascript
复制
#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);

}

您可以看到它运行得很好,我的环境配置: 10 2017窗口10

更新:

试着连接"Glu32.lib“和"Opengl32.lib”

更新:

尝试以下两种方法:

  1. 图形卡不支持当前的OpenGL版本,下载珠穆朗玛峰终极版后,依次点击显示设备> OpenGL,检查其是否支持相关信息,如果不支持,只能更换图形卡或用支持的OpenGL版本来解决问题。
  2. 不支持图形卡驱动程序。更新显卡驱动程序就足够了。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56741521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档