<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div>Hi, </div><div><div>  I found it difficult to achieve dynamic switching OpenGL context at run time.</div><div><br></div><div>  In the following code, I try to achieve this switching in a single thread(rendering thread not included), but I got a frozen window after pressing the switch key.</div><div><br></div><div>  My purpose is mainly to implement a quad-buffer switch option for users.</div></div><div><br></div><div>  Which step have made the froze of the main loop?</div><div><br></div><div>Codes:</div><div>------------------------------------------------------------------------------------------------------</div><div>1<span class="Apple-tab-span" style="white-space:pre">     </span>#include <windows.h><span class="Apple-tab-span" style="white-space:pre">                                                                                                                                  </span></div><div>2<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                            </span></div><div>3<span class="Apple-tab-span" style="white-space:pre">    </span>#include <osg/Node><span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span></div><div>4<span class="Apple-tab-span" style="white-space:pre">    </span>#include <osgGA/GuiEventHandler><span class="Apple-tab-span" style="white-space:pre">                                                                                                                                      </span></div><div>5<span class="Apple-tab-span" style="white-space:pre">    </span>#include <osgGA/TrackballManipulator><span class="Apple-tab-span" style="white-space:pre">                                                                                                                                 </span></div><div>6<span class="Apple-tab-span" style="white-space:pre">    </span>#include <osgViewer/Viewer><span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span></div><div>7<span class="Apple-tab-span" style="white-space:pre">    </span>#include <osgDB/ReadFile><span class="Apple-tab-span" style="white-space:pre">                                                                                                                                     </span></div><div>8<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                            </span></div><div>9<span class="Apple-tab-span" style="white-space:pre">    </span>osg::GraphicsContext* createGC(float x, float y, float w, float h, bool stereo)<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                     </span></div><div>10<span class="Apple-tab-span" style="white-space:pre">   </span>{<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span></div><div>11<span class="Apple-tab-span" style="white-space:pre">           </span>osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();<span class="Apple-tab-span" style="white-space:pre">                                                                                                                          </span></div><div>12<span class="Apple-tab-span" style="white-space:pre">           </span>osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                         </span></div><div>13<span class="Apple-tab-span" style="white-space:pre">           </span>traits->windowName = "";<span class="Apple-tab-span" style="white-space:pre">                                                                                                                               </span></div><div>14<span class="Apple-tab-span" style="white-space:pre">           </span>traits->windowDecoration = true;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                         </span></div><div>15<span class="Apple-tab-span" style="white-space:pre">           </span>traits->x = x;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span></div><div>16<span class="Apple-tab-span" style="white-space:pre">           </span>traits->y = y;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span></div><div>17<span class="Apple-tab-span" style="white-space:pre">           </span>traits->width = w;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                               </span></div><div>18<span class="Apple-tab-span" style="white-space:pre">           </span>traits->height = h;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                              </span></div><div>19<span class="Apple-tab-span" style="white-space:pre">           </span>traits->doubleBuffer = true;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                             </span></div><div>20<span class="Apple-tab-span" style="white-space:pre">           </span>traits->quadBufferStereo = stereo;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                               </span></div><div>21<span class="Apple-tab-span" style="white-space:pre">           </span>traits->alpha = ds->getMinimumNumAlphaBits();<span class="Apple-tab-span" style="white-space:pre">                                                                                                                         </span></div><div>22<span class="Apple-tab-span" style="white-space:pre">           </span>traits->stencil = ds->getMinimumNumStencilBits();<span class="Apple-tab-span" style="white-space:pre">                                                                                                                             </span></div><div>23<span class="Apple-tab-span" style="white-space:pre">           </span>traits->sampleBuffers = ds->getMultiSamples();<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                </span></div><div>24<span class="Apple-tab-span" style="white-space:pre">           </span>traits->samples = ds->getNumMultiSamples();<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span></div><div>25<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>26<span class="Apple-tab-span" style="white-space:pre">           </span>return osg::GraphicsContext::createGraphicsContext(traits.get());<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span></div><div>27<span class="Apple-tab-span" style="white-space:pre">   </span>}<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span></div><div>28<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>29<span class="Apple-tab-span" style="white-space:pre">   </span>bool _stereo = false;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                       </span></div><div>30<span class="Apple-tab-span" style="white-space:pre">   </span>osg::ref_ptr<osg::GraphicsContext> _newgc = NULL;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                     </span></div><div>31<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>32<span class="Apple-tab-span" style="white-space:pre">   </span>class SwitchGC : public osgGA::GUIEventHandler<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                      </span></div><div>33<span class="Apple-tab-span" style="white-space:pre">   </span>{<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span></div><div>34<span class="Apple-tab-span" style="white-space:pre">   </span>public:<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                     </span></div><div>35<span class="Apple-tab-span" style="white-space:pre">           </span>virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)<span class="Apple-tab-span" style="white-space:pre">                                                                                                                          </span></div><div>36<span class="Apple-tab-span" style="white-space:pre">           </span>{<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span></div><div>37<span class="Apple-tab-span" style="white-space:pre">                   </span>switch (ea.getEventType())<span class="Apple-tab-span" style="white-space:pre">                                                                                                                  </span></div><div>38<span class="Apple-tab-span" style="white-space:pre">                   </span>{<span class="Apple-tab-span" style="white-space:pre">                                                                                                                   </span></div><div>39<span class="Apple-tab-span" style="white-space:pre">                   </span>case osgGA::GUIEventAdapter::EventType::KEYDOWN:<span class="Apple-tab-span" style="white-space:pre">                                                                                                                    </span></div><div>40<span class="Apple-tab-span" style="white-space:pre">                   </span>{<span class="Apple-tab-span" style="white-space:pre">                                                                                                                   </span></div><div>41<span class="Apple-tab-span" style="white-space:pre">                                                                                                                   </span>   if (ea.getKey() == osgGA::GUIEventAdapter::KEY_S)<span class="Apple-tab-span" style="white-space:pre">                   </span></div><div>42<span class="Apple-tab-span" style="white-space:pre">                                                                                                                   </span>   {<span class="Apple-tab-span" style="white-space:pre">                   </span></div><div>43<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span>   //<span class="Apple-tab-span" style="white-space:pre">          </span></div><div>44<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span>   osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);<span class="Apple-tab-span" style="white-space:pre">                </span></div><div>45<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span>   if (viewer)<span class="Apple-tab-span" style="white-space:pre">         </span></div><div>46<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span>   {<span class="Apple-tab-span" style="white-space:pre">           </span></div><div>47<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span>   _stereo = !_stereo;<span class="Apple-tab-span" style="white-space:pre"> </span></div><div>48<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span>   _newgc = createGC(0, 0, 1000, 1000, _stereo);<span class="Apple-tab-span" style="white-space:pre">       </span></div><div>49<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span>   //viewer->getCamera()->setGraphicsContext(gc);<span class="Apple-tab-span" style="white-space:pre">        </span></div><div>50<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span>   osg::DisplaySettings::instance()->setStereo(_stereo);<span class="Apple-tab-span" style="white-space:pre">    </span></div><div>51<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span>   if (_stereo)<span class="Apple-tab-span" style="white-space:pre">        </span></div><div>52<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span>   {<span class="Apple-tab-span" style="white-space:pre">   </span></div><div>53<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span>   osg::DisplaySettings::instance()->setStereoMode(osg::DisplaySettings::QUAD_BUFFER);</div><div>54<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                     </span>   }<span class="Apple-tab-span" style="white-space:pre">   </span></div><div>55<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span>   }<span class="Apple-tab-span" style="white-space:pre">           </span></div><div>56<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>57<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span>   return true;<span class="Apple-tab-span" style="white-space:pre">                </span></div><div>58<span class="Apple-tab-span" style="white-space:pre">                                                                                                                   </span>   }<span class="Apple-tab-span" style="white-space:pre">                   </span></div><div>59<span class="Apple-tab-span" style="white-space:pre">                   </span>}<span class="Apple-tab-span" style="white-space:pre">                                                                                                                   </span></div><div>60<span class="Apple-tab-span" style="white-space:pre">                           </span>break;<span class="Apple-tab-span" style="white-space:pre">                                                                                                              </span></div><div>61<span class="Apple-tab-span" style="white-space:pre">                   </span>default:<span class="Apple-tab-span" style="white-space:pre">                                                                                                                    </span></div><div>62<span class="Apple-tab-span" style="white-space:pre">                           </span>break;<span class="Apple-tab-span" style="white-space:pre">                                                                                                              </span></div><div>63<span class="Apple-tab-span" style="white-space:pre">                   </span>}<span class="Apple-tab-span" style="white-space:pre">                                                                                                                   </span></div><div>64<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>65<span class="Apple-tab-span" style="white-space:pre">                   </span>return false;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                       </span></div><div>66<span class="Apple-tab-span" style="white-space:pre">           </span>}<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span></div><div>67<span class="Apple-tab-span" style="white-space:pre">   </span>private:<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                    </span></div><div>68<span class="Apple-tab-span" style="white-space:pre">   </span>};<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                  </span></div><div>69<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>70<span class="Apple-tab-span" style="white-space:pre">   </span>int main(int, char**)<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                       </span></div><div>71<span class="Apple-tab-span" style="white-space:pre">   </span>{<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span></div><div>72<span class="Apple-tab-span" style="white-space:pre">           </span>osgViewer::Viewer* viewer = new osgViewer::Viewer();<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                </span></div><div>73<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>74<span class="Apple-tab-span" style="white-space:pre">           </span>_stereo = !_stereo;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                         </span></div><div>75<span class="Apple-tab-span" style="white-space:pre">           </span>osg::GraphicsContext* gc = createGC(0, 0, 1000, 1000, _stereo);<span class="Apple-tab-span" style="white-space:pre">                                                                                                                             </span></div><div>76<span class="Apple-tab-span" style="white-space:pre">           </span>osg::DisplaySettings::instance()->setStereo(_stereo);<span class="Apple-tab-span" style="white-space:pre">                                                                                                                            </span></div><div>77<span class="Apple-tab-span" style="white-space:pre">           </span>if (_stereo)<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                </span></div><div>78<span class="Apple-tab-span" style="white-space:pre">           </span>{<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span></div><div>79<span class="Apple-tab-span" style="white-space:pre">                   </span>osg::DisplaySettings::instance()->setStereoMode(osg::DisplaySettings::QUAD_BUFFER);<span class="Apple-tab-span" style="white-space:pre">                                                                                                                      </span></div><div>80<span class="Apple-tab-span" style="white-space:pre">           </span>}<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span></div><div>81<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>82<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>83<span class="Apple-tab-span" style="white-space:pre">           </span>viewer->getCamera()->setGraphicsContext(gc);<span class="Apple-tab-span" style="white-space:pre">                                                                                                                          </span></div><div>84<span class="Apple-tab-span" style="white-space:pre">           </span>viewer->setSceneData(osgDB::readNodeFile("cow.osg"));<span class="Apple-tab-span" style="white-space:pre">                                                                                                                          </span></div><div>85<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>86<span class="Apple-tab-span" style="white-space:pre">           </span>osg::Camera* camera = viewer->getCamera();<span class="Apple-tab-span" style="white-space:pre">                                                                                                                               </span></div><div>87<span class="Apple-tab-span" style="white-space:pre">           </span>const osg::GraphicsContext::Traits* traits = gc->getTraits();<span class="Apple-tab-span" style="white-space:pre">                                                                                                                            </span></div><div>88<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>89<span class="Apple-tab-span" style="white-space:pre">           </span>camera->setClearColor(osg::Vec4(0.2, 0.2, 0.2, 1.0));<span class="Apple-tab-span" style="white-space:pre">                                                                                                                            </span></div><div>90<span class="Apple-tab-span" style="white-space:pre">           </span>camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));<span class="Apple-tab-span" style="white-space:pre">                                                                                                                               </span></div><div>91<span class="Apple-tab-span" style="white-space:pre">           </span>camera->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(traits->width) / static_cast<double>(traits->height), 1.0f, 10000.0f);<span class="Apple-tab-span" style="white-space:pre">                                                                                                                             </span></div><div>92<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>93<span class="Apple-tab-span" style="white-space:pre">           </span>viewer->addEventHandler(new SwitchGC());<span class="Apple-tab-span" style="white-space:pre">                                                                                                                         </span></div><div>94<span class="Apple-tab-span" style="white-space:pre">           </span>viewer->setCameraManipulator(new osgGA::TrackballManipulator);<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span></div><div>95<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                           </span></div><div>96<span class="Apple-tab-span" style="white-space:pre">           </span>while (!viewer->done())<span class="Apple-tab-span" style="white-space:pre">                                                                                                                          </span></div><div>97<span class="Apple-tab-span" style="white-space:pre">           </span>{<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span></div><div>98<span class="Apple-tab-span" style="white-space:pre">                   </span>if (_newgc.get() != NULL)<span class="Apple-tab-span" style="white-space:pre">                                                                                                                   </span></div><div>99<span class="Apple-tab-span" style="white-space:pre">                   </span>{<span class="Apple-tab-span" style="white-space:pre">                                                                                                                   </span></div><div>100<span class="Apple-tab-span" style="white-space:pre">                          </span>osg::GraphicsContext*oldgc =  viewer->getCamera()->getGraphicsContext();<span class="Apple-tab-span" style="white-space:pre">                                                                                                         </span></div><div>101<span class="Apple-tab-span" style="white-space:pre">                          </span>if (oldgc)<span class="Apple-tab-span" style="white-space:pre">                                                                                                          </span></div><div>102<span class="Apple-tab-span" style="white-space:pre">                          </span>{<span class="Apple-tab-span" style="white-space:pre">                                                                                                           </span></div><div>103<span class="Apple-tab-span" style="white-space:pre">                                  </span>oldgc->close(true);<span class="Apple-tab-span" style="white-space:pre">                                                                                                      </span></div><div>104<span class="Apple-tab-span" style="white-space:pre">                          </span>}<span class="Apple-tab-span" style="white-space:pre">                                                                                                           </span></div><div>105<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                          </span></div><div>106<span class="Apple-tab-span" style="white-space:pre">                          </span>viewer->getCamera()->setGraphicsContext(_newgc);<span class="Apple-tab-span" style="white-space:pre">                                                                                                              </span></div><div>107<span class="Apple-tab-span" style="white-space:pre">                          </span>_newgc = NULL;<span class="Apple-tab-span" style="white-space:pre">                                                                                                              </span></div><div>108<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                          </span></div><div>109<span class="Apple-tab-span" style="white-space:pre">                          </span>camera->setClearColor(osg::Vec4(0.2, 0.2, 0.2, 1.0));<span class="Apple-tab-span" style="white-space:pre">                                                                                                            </span></div><div>110<span class="Apple-tab-span" style="white-space:pre">                          </span>camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));<span class="Apple-tab-span" style="white-space:pre">                                                                                                               </span></div><div>111<span class="Apple-tab-span" style="white-space:pre">                          </span>camera->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(traits->width) / static_cast<double>(traits->height), 1.0f, 10000.0f);<span class="Apple-tab-span" style="white-space:pre">                                                                                                             </span></div><div>112<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                          </span></div><div>113<span class="Apple-tab-span" style="white-space:pre">                          </span>viewer->realize();<span class="Apple-tab-span" style="white-space:pre">                                                                                                               </span></div><div>114<span class="Apple-tab-span" style="white-space:pre">                          </span>viewer->addEventHandler(new SwitchGC());<span class="Apple-tab-span" style="white-space:pre">                                                                                                         </span></div><div>115<span class="Apple-tab-span" style="white-space:pre">                          </span>viewer->setCameraManipulator(new osgGA::TrackballManipulator);<span class="Apple-tab-span" style="white-space:pre">                                                                                                           </span></div><div>116<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                          </span></div><div>117<span class="Apple-tab-span" style="white-space:pre">                  </span>}<span class="Apple-tab-span" style="white-space:pre">                                                                                                                   </span></div><div>118<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                          </span></div><div>119<span class="Apple-tab-span" style="white-space:pre">                  </span>viewer->frame();<span class="Apple-tab-span" style="white-space:pre">                                                                                                                 </span></div><div>120<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                          </span></div><div>121<span class="Apple-tab-span" style="white-space:pre">          </span>}<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span></div><div>122<span class="Apple-tab-span" style="white-space:pre">          </span>return 0;<span class="Apple-tab-span" style="white-space:pre">                                                                                                                           </span></div><div>123<span class="Apple-tab-span" style="white-space:pre">  </span>}<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                   </span></div><div>124<span class="Apple-tab-span" style="white-space:pre">                                                                                                                                          </span></div><div><br></div></div><br><br><span title="neteasefooter"><p> </p></span>