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