ОБНОВЛЕНО
Если вы хотите, чтобы полный исходный код этого приложения подвергался сомнению, вы можете разветвлять его из моего репозитория 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
в этом коде? Спасибо