Как правильно визуализировать текстуру в мультипортовом приложении OpenGL VC ++? - PullRequest
1 голос
/ 22 мая 2011

ОБНОВЛЕНО

Если вы хотите, чтобы полный исходный код этого приложения подвергался сомнению, вы можете разветвлять его из моего репозитория github: OpenGLModeler

Я создал приложение 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);

    }

РЕДАКТИРОВАНИЕ: объяснить измененный код Я заимствовал этот код из codeproject и изменил его, чтобы иметь функциональность нескольких окон просмотра. Это, я думаю, важная модификация: во-первых, создание OpenGL Viewport:

    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
        }
    }

Как я могу использовать wlgShareList в этом коде? Спасибо

An OpenGL Scene with Two Objects

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Если у вас несколько контекстов GL, вам нужно разделить текстуры между контекстами, чтобы они могли быть созданы в одном контексте и отображены в другом.

Вы можете взглянуть на wglShareLists который вызывается после создания ваших «вторичных» контекстов («основным» контекстом является первый созданный контекст).

Вы можете вызывать 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 );            

Обратите внимание, что важно, чтобы контексты 'glFront' и 'glTop' не содержали никакой существующей текстуры при вызове wglShareLists.

1 голос
/ 22 мая 2011

Просто предложение: не разделяйте настройки состояния OpenGL на несколько функций.Всегда устанавливайте нужное вам состояние OpenGL, когда вам это нужно.Так что в вашем случае вместо установки области просмотра и проекции в обработчике изменения размера, сделайте это в функции отображения.Аналогичным образом, включите / отключите текстуры таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...