2013-09-30 70 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

相關問題