C++ 多个wxGLCanvas与OpenGL wxPaintDC图形组合

C++ 多个wxGLCanvas与OpenGL wxPaintDC图形组合,c++,opengl,windows-7,wxwidgets,C++,Opengl,Windows 7,Wxwidgets,我有一个应用程序,它有两个扩展wxGLCanvas的类和一个扩展wxWindow的类。它们实现了3种可能的用户对象可视化。同时只显示其中一个。两个wxGLCanvas包含一个OpenGL场景和一些使用wxPaintDC叠加的文本的组合。wxWindow使用wxBufferedPaintDC绘制所有内容 问题1:在某些计算机中,当从一个wxGLCanvas交换到另一个wxGLCanvas时,在场景的第一次渲染期间,背景图像将显示,直到第一个渲染图像出现。我发现的这个背景图片来自wxGLCanvas

我有一个应用程序,它有两个扩展wxGLCanvas的类和一个扩展wxWindow的类。它们实现了3种可能的用户对象可视化。同时只显示其中一个。两个wxGLCanvas包含一个OpenGL场景和一些使用wxPaintDC叠加的文本的组合。wxWindow使用wxBufferedPaintDC绘制所有内容

问题1:在某些计算机中,当从一个wxGLCanvas交换到另一个wxGLCanvas时,在场景的第一次渲染期间,背景图像将显示,直到第一个渲染图像出现。我发现的这个背景图片来自wxGLCanvas背景

问题2:在出现问题1的同一台机器中,当使用函数wxClientDC.Blit时,不是使用叠加文本拍摄OpenGL场景,而是使用叠加文本拍摄wxGLCanvas背景图像(与问题1相同);因此,它采用的是画布上下文,不包括OpenGL场景。在其他机器中,屏幕截图的结果是正确的

信息:当我选择wxWindow视图时,所有视图都是使用wxBufferedPaintDC绘制的,问题1和问题2的背景图像都会更新为wxWindow显示的帧。如果我现在在wxglcanvas之间切换,我将看到wxWindow视图的“flash”

截图代码(类内扩展wxGLCanvas):

显示场景OpenGL的代码,后跟覆盖的文本(类内扩展wxGLCanvas):


wxWidgets论坛对此处发布的同一问题的回答,全部归功于他们:)

小结:不要混合使用OpenGL和wxPaintDC。要拍摄带有重叠文本的openGL屏幕截图,有两个很好的可能性:

1-使用OpenGL放置叠加文本,例如叠加正交投影。然后使用函数glReadPixels()拍摄屏幕截图

2-如果使用DC覆盖文本,要拍摄屏幕截图,首先要求OpenGL返回数组中的所有视口。将此数组转换为wxImage,以在重绘事件中重叠文本的方式重新呈现图像中的文本,使用dc.Blit函数复制图像

wxClientDC lv_contexteVue(this);
int lv_largeurVue;
int lv_hauteurVue;

lv_contexteVue.GetSize(&lv_largeurVue,&lv_hauteurVue);

wxBitmap lv_vue(lv_largeurVue,lv_hauteurVue);

wxMemoryDC lv_contexteAux;

lv_contexteAux.SelectObject(lv_vue);
lv_contexteAux.Blit(0,0,lv_largeurVue,lv_hauteurVue,&lv_contexteVue,0,0);

lv_vue.SaveFile(wxString(er_cheminSauvegarde.c_str(),wxConvLibc,er_cheminSauvegarde.size()),wxBITMAP_TYPE_BMP);

lv_contexteAux.SelectObject(wxNullBitmap);
wxPaintDC dc(this);
//dc.Clear();
dc.SetBackground(*wxBLACK);
dc.SetBackgroundMode(wxSOLID);
dc.SetTextBackground(*wxBLACK);
dc.SetTextForeground(*wxWHITE);

SetCurrent(mv_contexte);

if (!mv_estInitialise)
{
    initialiser();
    mv_estInitialise = true;
}

Evenement lv_demandeDessin(DEMANDE_AFFICHAGE_2DPLUS);
mp_controleur->traiterEvenement(lv_demandeDessin);

SwapBuffers();


//dc.ClearCache();
wxColour lv_couleurEspaceLibre = *wxWHITE;
dc.SetBrush(wxBrush(lv_couleurEspaceLibre));
dc.SetPen(wxPen(lv_couleurEspaceLibre, 1));
//Overlay Text 
wxSize screenSize = this->GetSize();
//dc.SetTextForeground(wxColour(240, 240, 240, 255));
wxFont font(8, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false);
dc.SetFont(font);
//dc.SetTextBackground(wxColour(0, 0, 0, 200));
string formated = ConstantesATLAS::FILIGRANE_PRE+Constantes::VERSION+Constantes::FILIGRANE_POS;
wxString mystring = wxString::FromAscii(formated.c_str());
//dc.DrawText(mystring,5,screenSize.GetY()-20);
dc.DrawText(mystring,5,5);