Visual c++ 如何在多视口openglvc++;应用

Visual c++ 如何在多视口openglvc++;应用,visual-c++,opengl,Visual C++,Opengl,已更新 如果您想获得此应用程序的完整源代码,可以从my github存储库中获取: 我已经建立了一个Visual C++ .NET 2008应用程序,显示三个视口。一切都很好,直到我实现了纹理功能。从我的截图中可以看到,只有“前”视口渲染了纹理。这是我根据定义的视口类型处理其绘图方法的代码。如果您愿意,我可以向您提供完整的源代码,但以下是代码片段: public: GLvoid ReSizeGLScene(GLsizei width, GLsizei height){

已更新

如果您想获得此应用程序的完整源代码,可以从my github存储库中获取:

我已经建立了一个Visual C++ .NET 2008应用程序,显示三个视口。一切都很好,直到我实现了纹理功能。从我的截图中可以看到,只有“前”视口渲染了纹理。这是我根据定义的视口类型处理其绘图方法的代码。如果您愿意,我可以向您提供完整的源代码,但以下是代码片段:

public:
        GLvoid ReSizeGLScene(GLsizei width, GLsizei height){        // Resize and initialise the gl window
        MySetCurrentGLRC();
        if (height==0)                                      // Prevent A Divide By Zero By
        {
            height=1;                                       // Making Height Equal One
        }

        glViewport(0,0,width,height);                       // Reset The Current Viewport

        glMatrixMode(GL_PROJECTION);                        // Select The Projection Matrix
        glLoadIdentity();                                   // Reset The Projection Matrix


        // Calculate The Aspect Ratio Of The Window
        switch(cameraType){
            case 1:                 
                gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); 
                gluLookAt(
                    -4,4,4,//eye
                    0,0,0,//center
                    0,1,0);//up
                break;
            case 2://front : texture rendered correctly
                glOrtho(-2,2,-2,2,-50,50);
                gluLookAt(
                    0,0,2,//eye 0,0,2
                    0,0,0,//center 0,0,0
                    0,1,0);//up 0,1,0
                break;
            case 3://top
                glOrtho(-2,2,-2,2,-50,50);
                gluLookAt(
                    0,2,0,//eye
                    0,0,0,//center, 0
                    0,0,-1);//up
                break;
        }


        glMatrixMode(GL_MODELVIEW);                         // Select The Modelview Matrix
        glLoadIdentity();                                   // Reset The Modelview Matrix


        UINT flags = SWP_NOZORDER | SWP_NOACTIVATE;
        SetWindowPos((HWND)this->Handle.ToPointer() , 0, 0, 0, 
                   width, height, flags);

    }
编辑:解释修改的代码 我从中借用了这段代码,并将其修改为具有多视口功能。我认为这些是重要的修改:首先,OpenGL视口的实例化:

    glPerspective = gcnew COpenGL(picPerspective, picPerspective->Width, picPerspective->Height,1);
        glFront = gcnew COpenGL(picFront, picFront->Width, picFront->Height,2);
        glTop = gcnew COpenGL(picTop, picTop->Width , picTop->Height,3);            
COpenGL的最后一个参数是视口的类型:透视(1)、前(2)和顶(3)。第二个修改是我画场景的方式。它使用一个计时器,如下所示:

    private: System::Void timerRefreshPicture_Tick(System::Object^  sender, System::EventArgs^  e) {
             UNREFERENCED_PARAMETER(sender);
             UNREFERENCED_PARAMETER(e);

             glPerspective->Render(daftarObject);
             glPerspective->SwapOpenGLBuffers();

             glTop->Render(daftarObject);
             glTop->SwapOpenGLBuffers();

             glFront->Render(daftarObject);
             glFront->SwapOpenGLBuffers();
         }
我尝试禁用绘制glFront的代码,是的,glTop的纹理正确。如果我禁用glTop,也会发生同样的情况。我怀疑这个代码:

virtual System::Void MySetCurrentGLRC()
    {
        if(m_hDC)
        {

            if((wglMakeCurrent(m_hDC, m_hglrc)) == NULL)
            {
            MessageBox::Show("wglMakeCurrent Failed");
            }
            //wglShareLists(m_hglrc,m_hglrc);<== not working
        }
    }
虚拟系统::Void MySetCurrentGLRC()
{
如果(m_hDC)
{
如果((wglMakeCurrent(m_hDC,m_hglrc))==NULL)
{
MessageBox::Show(“wglMakeCurrent失败”);
}

//wglShareLists(m_hglrc,m_hglrc)建议:不要将OpenGL状态设置拆分为多个函数。在需要时,始终正确设置所需的OpenGL状态。因此,在您的情况下,不要在调整大小处理程序中设置视口和投影,而是在显示函数中设置。类似地,也可以这样启用/禁用纹理。

如果您有多个GL上下文,您可以编辑以在上下文之间共享纹理,使它们能够在一个上下文中创建并在另一个上下文中显示

您可以在创建“次要”上下文后查看要调用的上下文(“主要”上下文是创建的第一个上下文)

创建各种上下文后,可以调用wglShareLists:

glPerspective = gcnew COpenGL(picPerspective, picPerspective->Width, picPerspective->Height,1);
glFront = gcnew COpenGL(picFront, picFront->Width, picFront->Height,2);
glTop = gcnew COpenGL(picTop, picTop->Width , picTop->Height,3);

wglShareLists( glPerspective->m_hglrc, glFront->m_hglrc );            
wglShareLists( glPerspective->m_hglrc, glTop->m_hglrc );            

请注意,在调用wglShareLists时,“glFront”和“glTop”上下文不包含任何现有纹理非常重要。

我将尽快报告您的建议。这似乎让我陷入了困境something@rotoglup好的,我先检查一下链接。然后试试我的best@rotoglup我知道这是正确的答案,但我没有成功地解决我的问题问题。我尝试只创建一个视口,然后创建两个。纹理只在最后一个视口中渲染。我编辑了我的问题以显示更多的片段。任何帮助都可以appreciated@swdev-我添加了一些示例代码,您需要访问GL上下文的句柄,该句柄可能在您的COpenGL类中是私有的,因此您可以进行访问r、 或者在你的COpenGL类中添加一个“ShareList”方法。@rotoglup-好的,我已经检查过了,尽快在这里报告。Thanks@rotoglup-是的!是的!是的!它很有魅力!谢谢@rotoglup。它真的救了我一天!我爱你,伙计……)