Qual é a boot apropriada do OpenGL na Intel HD 3000?

Eu tenho um problema com charts Intel HD 3000 no notebook Toshiba (OS Win7 x32, lang C ++) .

Os aplicativos OpenGL de contexto único clássico funcionam bem, mas em vários contextos OpenGL no único App cria um comportamento estranho:

  1. em versões mais antigas dos meus aplicativos, o driver Intel não pode criar o segundo contexto de renderização.
  2. depois de grandes mudanças no meu comportamento de arquitetura de software baseado em OpenGL mudou

    Agora eu sou capaz de criar o segundo contexto de renderização, mas depois de liberá-lo (depois de usar / fechar janela) o driver não pode criar qualquer contexto de renderização seguinte. Isso foi testado em mais de um aplicativo e se comporta da mesma maneira o tempo todo. Eu queria superar isso mantendo o segundo contexto ativo em todos os momentos, mas ele também não funciona (de alguma forma, o contexto de renderização é invalidado na Intel). Para maior clareza, o segundo contexto de renderização OpenGL é usado para as checkboxs de diálogo Abrir / Salvar (sub-janelas de visualização).

Informação do driver:

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

Inicie e saia do código OpenGL (do meu mecanismo 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; } //------------------------------------------------------------------------------ 

agora as perguntas:

  1. Estou fazendo algo errado?

    O motor é totalmente funcional GL, GLSL, VBO, VAO … e testado por anos. Comportamento estranho está presente apenas na Intel . Cards da nVidia funciona bem e ATI / AMD funciona quase bem (existem alguns problemas, mas eles são drivers de bugs relacionados como sempre para ATI especialmente para VBO com índices tudo o resto funciona bem)

  2. Existe uma maneira melhor de iniciar / sair do OpenGL?

  3. Como alternar corretamente entre diferentes contextos de renderização?

    Eu estou usando wglMakeCurrent(hdc,hrc) por enquanto, mas pode ser que eu estou faltando alguma coisa ou há alguma solução alternativa para isso.

Seu uso do WGL parece correto para mim (incluindo o uso de wglMakeCurrent), mas eu não uso há algum tempo, então minha memory pode ficar embaçada (para responder Q1 e Q3).

No entanto, existe uma maneira melhor de inicializar o OpenGL: use uma biblioteca de carregador, conforme detalhado aqui . Como o wiki diz, é altamente recomendável usar uma biblioteca de carregadores em vez de tentar fazê-lo sozinho.

Eu gosto de usar SFML para criar o contexto OpenGL e janela, além de GLEW (apenas necessário para o Windows) para configurar as funções de contexto do núcleo OpenGL. Eu também tive sucesso com o glfw, o que é bom para carregar o OpenGL 3.2+