2013-09-30 72 views
5

我有东芝笔记本(OS Win7的32倍,郎C++)英特尔显卡HD 3000问题。英特尔HD 3000上正确的OpenGL初始化是什么?

古典单个上下文的OpenGL应用程序工作正常,但在多个的OpenGL上下文在单一的应用程序创建怪异的行为:

  1. 在旧版本我的应用程序的英特尔驱动程序无法在所有创建第二渲染上下文。
  2. 在我的OpenGL基于软件的架构的行为发生重大变化后改变

    现在我能够创造第二渲染上下文,但释放它(使用后/关闭窗口)后,司机无法创造任何未来渲染环境。这已经在多个应用程序上进行了测试,并且始终具有相同的行为。我希望通过让第二个上下文始终处于活动状态来解决这个问题,但它不能工作(某种程度上,渲染上下文在英特尔上无效)。为了清晰起见,第二个OpenGL渲染上下文用于打开/保存对话框(预览子窗口)。

驱动程序信息:

Intel(R) HD Graphics 3000 
OpenGL ver: 3.1.0 - Build 9.17.10.2932 

初始化和退出的OpenGL代码(从我的的OpenGL引擎):

//------------------------------------------------------------------------------ 
int OpenGLscreen::init(void *f,int textures) 
    { 
    if (_init) exit(); 
    frm=(formtype*)f; 
    hdc = GetDC(frm->Handle);  // get device context 
    int i; 
    if (!_used) 
     { 
     int i,_pfid=-1,_zbit=0; 
     PIXELFORMATDESCRIPTOR _pfd; 
     #define pfd_test i=ChoosePixelFormat(hdc,&pfd); DescribePixelFormat(hdc,i,sizeof(_pfd),&_pfd); if (_zbit<_pfd.cDepthBits) { _zbit=_pfd.cDepthBits; _pfid=i; } 
     pfd.cColorBits = 32; pfd.cDepthBits = 32; pfd_test; 
     pfd.cColorBits = 24; pfd.cDepthBits = 32; pfd_test; 
     pfd.cColorBits = 16; pfd.cDepthBits = 32; pfd_test; 
     pfd.cColorBits = 32; pfd.cDepthBits = 24; pfd_test; 
     pfd.cColorBits = 24; pfd.cDepthBits = 24; pfd_test; 
     pfd.cColorBits = 16; pfd.cDepthBits = 24; pfd_test; 
     pfd.cColorBits = 32; pfd.cDepthBits = 16; pfd_test; 
     pfd.cColorBits = 24; pfd.cDepthBits = 16; pfd_test; 
     pfd.cColorBits = 16; pfd.cDepthBits = 16; pfd_test; 
     #undef pfd_test 
     pfd.cDepthBits = _zbit; // iba koli warningu 
     DescribePixelFormat(hdc,_pfid,sizeof(pfd),&pfd); 
     pfid=ChoosePixelFormat(hdc,&pfd); 
     SetPixelFormat(hdc,pfid,&pfd); 
     DescribePixelFormat(hdc,pfid,sizeof(pfd),&pfd); 

     znum=1<<(pfd.cDepthBits-1); 
     } 

    // create current rendering context 
    hrc = wglCreateContext(hdc); 

    if(hrc == NULL) 
     { 
     ShowMessage("Could not initialize OpenGL Rendering context !!!"); 
     _init=0; 
     return 0; 
     } 
    if(wglMakeCurrent(hdc, hrc) == false) 
     { 
     ShowMessage("Could not make current OpenGL Rendering context !!!"); 
     wglDeleteContext(hrc);   // destroy rendering context 
     _init=0; 
     return 0; 
     } 
    if (!_used) glewInit(); 
    _init=1; 
    _used=1; 
    resize(0,0,128,128); 

// glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
// glFrontFace(GL_CCW);     // predna strana je proti smeru hod. ruciciek 
// glEnable(GL_CULL_FACE);     // vynechavaj odvratene steny 
// glEnable(GL_TEXTURE_2D);    // pouzivaj textury, farbu pouzivaj z textury 
// glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
// glEnable(GL_BLEND);      // priehladnost 
// glBlendFunc(GL_SRC_ALPHA,GL_DST_ALPHA); 
/* 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_COLOR_MATERIAL); 

    GLdouble MaterialAmbient [] = {0.25, 0.25, 0.25, 1.00}; 
    GLdouble MaterialDiffuse [] = {0.25, 0.25, 0.25, 1.00}; 
    GLdouble MaterialSpecular [] = {0.50, 0.50, 0.50, 1.00}; 
    GLdouble MaterialShininess[] = {15.0};     // 0-ufocused, 128 max focus 
    glMaterialfv(GL_FRONT, GL_AMBIENT , MaterialAmbient ); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE , MaterialDiffuse ); 
    glMaterialfv(GL_FRONT, GL_SPECULAR , MaterialSpecular); 
    glMaterialfv(GL_FRONT, GL_SHININESS, MaterialShininess); 
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 

    GLdouble LightPosition [] = {0.00, 0.00, 0.00, 0.0}; 
    GLdouble LightAmbient [] = {0.10, 0.10, 0.10, 1.0}; 
    GLdouble LightDiffuse [] = {0.20, 0.20, 0.20, 1.0}; 
    GLdouble LightSpecular [] = {1.00, 1.00, 1.00, 1.0}; 
    glLightfv(GL_LIGHT0,GL_AMBIENT ,LightAmbient); 
    glLightfv(GL_LIGHT0,GL_DIFFUSE ,LightDiffuse); 
    glLightfv(GL_LIGHT0,GL_SPECULAR,LightSpecular); 
    glLightfv(GL_LIGHT0,GL_POSITION,LightPosition); 
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, LightAmbient); 
*/ 
    glEnable(GL_DEPTH_TEST);    // Zbuf 
    glShadeModel(GL_SMOOTH);    // gourard shading 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // background color 
    glDepthFunc(GL_LEQUAL); 

    const GLubyte *p; char a;    // get extensions list 
    extensions=""; 
    #define ext_add if ((extensions!="")&&(extensions[extensions.Length()]!=' ')) extensions+=' '; for (i=0;;i++) { a=p[i]; if (!a) break; extensions+=a; } 
    p=glGetString(GL_EXTENSIONS); ext_add; 
    if (wglGetExtensionsStringARB) p=wglGetExtensionsStringARB(hdc); ext_add; 
    if (wglGetExtensionsStringEXT) p=wglGetExtensionsStringEXT(); ext_add; 

// int hnd=FileCreate("glext.txt"); FileWrite(hnd,scr.extensions.c_str(),scr.extensions.Length()); FileClose(hnd); 

    OpenGLtexture txr; 
    txrs.alloc(textures);   // allocate textures name space 
    font_init(txr); 
    font=txrs.add(txr); 
    s3dl=txrs.add(txr); txrs.sizes[s3dl]._mode=GL_MODULATE; 
    s3dr=txrs.add(txr); txrs.sizes[s3dr]._mode=GL_MODULATE; 
    return 1; 
    } 
//------------------------------------------------------------------------------ 
void OpenGLscreen::exit() 
    { 
    if (!_init) return; 
    wglMakeCurrent(hdc,hrc);  // use this context if multiple OpenGLs are used 
    txrs.free(); 
    wglMakeCurrent(NULL, NULL);  // release current rendering context 
    wglDeleteContext(hrc);   // destroy rendering context 
    hrc=NULL; 
    _init=0; 
    } 
//------------------------------------------------------------------------------ 

现在的问题:

  1. 我做错了什么?

    发动机功能齐全GL,GLSL,VBO,VAO,......并测试多年。奇怪的行为只出现在英特尔。从的nVidia工作正常,并ATI/AMD作品几乎罚款卡(也有一些问题,但它们是相关一如继往地为ATI尤其是对VBO与指标一切正常工作越野车司机)

  2. 有没有更好的方法来初始化/退出OpenGL?

  3. 如何正确切换不同的渲染上下文?

    我使用wglMakeCurrent(hdc,hrc)现在,但可能是我失去了一些东西或者有英特尔的一些解决方法这一点。

+0

你是否使用WGL绑定? –

+0

@MattFichman是的 – Spektre

回答

0

您使用WGL的看起来是正确的,我(包括您使用wglMakeCurrent的),但我还没有在使用了一段时间,所以我的记忆可能有雾(回答Q1和Q3)。

但是,更好的初始化OpenGL的方法:使用加载器库,as detailed here。正如维基所说,强烈建议使用加载程序库,而不是试图自己做。

我喜欢使用SFML来创建OpenGL上下文和窗口,再加上GLEW(仅在Windows中需要)才能设置OpenGL核心上下文功能。我也成功使用了glfw,这对加载OpenGL 3.2+有好处

+0

我已经使用GLEW和OpenGL 4.2 for decend gfx卡,但对于英特尔而言,由于驱动程序不好而无法使用。我不喜欢这个想法为Intel的init OpenGL上下文添加另一个第三方lib,但不知道它是否真的有帮助(我的问题看起来像驱动程序中的一个bug)以及诸如连续性,兼容性等许多其他原因......我的软件长期运行 – Spektre

+0

卡/驱动程序配置只允许OpenGL 3.1.0上下文没有lib会帮助那些只有像nvemulate这样的模拟器......或者更好的驱动程序,它不会存在(至少不会存在于英特尔) – Spektre

相关问题