【问题标题】:Why does this OpenGL split screen code work? Unidentified texture?为什么这个 OpenGL 分屏代码有效?质地不明?
【发布时间】:2014-06-01 06:19:30
【问题描述】:

所以我有一个分屏的 OpenGL 程序。经过研究,我的代码如下所示:

   glEnable(GL_DEPTH_TEST);
   glClear(GL_COLOR_BUFFER_BIT);

   // 1
   // ----- Camera -----
   glViewport(0, 0, _windowW/2, _windowH);
   //  Tell OpenGL we want to manipulate the projection matrix
   glMatrixMode(GL_PROJECTION);
   //  Undo previous transformations
   glLoadIdentity();
   //  Perspective transformation
   gluPerspective(_fov,_asp,_worldSize/_trolly,_trolly*_worldSize);
   // Move main camera
   _cameraLook[0] = _cameraLoc[0] + Sin(_th1)*Cos(_ph1)*_lookDistance;
   _cameraLook[1] = _cameraLoc[1] +           Sin(_ph1)*_lookDistance;
   _cameraLook[2] = _cameraLoc[2] + Cos(_th1)*Cos(_ph1)*_lookDistance;
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   gluLookAt(_cameraLoc[0], _cameraLoc[1], _cameraLoc[2], _cameraLook[0], _cameraLook[1], _cameraLook[2], 0, 1, 0);

   // ----- Drawing of scene -----
   drawSceneContents();

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glClear(GL_DEPTH_BUFFER_BIT);

   //glBindTexture(GL_TEXTURE_2D,_framebufImg1);
   glBegin(GL_QUADS);
   glTexCoord2f(0.25, 0.0); glVertex2f(-1.0, -1.0);
   glTexCoord2f(0.25, 1.0); glVertex2f(-1.0, +1.0);
   glTexCoord2f(0.75, 1.0); glVertex2f(+0.0, +1.0);
   glTexCoord2f(0.75, 0.0); glVertex2f(+0.0, -1.0);
   glEnd();

   // 2
   // ----- Camera -----
   glViewport(_windowW/2, 0, _windowW/2, _windowH);
   //  Tell OpenGL we want to manipulate the projection matrix
   glMatrixMode(GL_PROJECTION);
   //  Undo previous transformations
   glLoadIdentity();
   //  Perspective transformation
   gluPerspective(_fov,_asp,_worldSize/_trolly,_trolly*_worldSize);

   // Move main camera
   _cameraLook[0] = _cameraLoc[4] + Sin(_th2)*Cos(_ph2)*_lookDistance;
   _cameraLook[1] = _cameraLoc[5] +           Sin(_ph2)*_lookDistance;
   _cameraLook[2] = _cameraLoc[6] + Cos(_th2)*Cos(_ph2)*_lookDistance;
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   gluLookAt(_cameraLoc[4], _cameraLoc[5], _cameraLoc[6], _cameraLook[0], _cameraLook[1], _cameraLook[2], 0, 1, 0);

   // ----- Drawing of scene -----
   drawSceneContents();

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glClear(GL_DEPTH_BUFFER_BIT);

   //glBindTexture(GL_TEXTURE_2D,_framebufImg1);
   glBegin(GL_QUADS);
   glTexCoord2f(0.25, 0.0); glVertex2f(-0.0, -1.0);
   glTexCoord2f(0.25, 1.0); glVertex2f(-0.0, +1.0);
   glTexCoord2f(0.75, 1.0); glVertex2f(+1.0, +1.0);
   glTexCoord2f(0.75, 0.0); glVertex2f(+1.0, -1.0);
   glEnd();

但是,我不明白它为什么会起作用,而且我一定错过了 OpenGL 所做的一些基本工作。 我不明白的部分是在每个“屏幕”的末尾,我在其中绘制了一个带纹理的四边形(最后 5 行代码)。但是这种纹理是从哪里来的呢?为什么它恰好是我为该屏幕绘制的场景的纹理?我从来没有做过 glBindTexture 或 glEnable(GL_TEXTURE_2D) 任何事情,事实上在所有这些代码之前我可以放一个 glDisable(GL_TEXTURE_2D) 并且代码仍然有效!如何?除了纹理坐标之外,如何在代码中不提及纹理的情况下获得纹理四边形?

【问题讨论】:

    标签: opengl textures


    【解决方案1】:

    编辑:由 datenwolf 进行更正,这里有很好的解释 => 10. The Viewport Does Not Clip or Scissor

    根据您的纹理名称 (_framebufImg1),drawSceneContents 应实现对 FBO 的屏幕外渲染,该 FBO 应将纹理附加为颜色附件。

    glViewport 将投影坐标映射到屏幕宽度的一半,这样您就可以在两个不同的位置绘制具有相同顶点的纹理四边形

    glViewport(0, 0, _windowW/2, _windowH);
    //first pass
    glViewport(_windowW/2, 0, _windowW/2, _windowH);
    //second pass
    

    没有drawSceneContents 的详细信息,我不能说更多......

    【讨论】:

    • 实际上视口只设置了从 NDC 到窗口坐标的映射,但并不限制渲染。东西仍然可以出现在视口之外。此外,您必须使用剪刀测试,以限制视口内的内容。 glEnable(GL_SCISSOR_TEST); glScissor(<same values as for glViewport>);
    • @datenwolf:在stackexchange 上尝试像在游戏中那样获得积分肯定有点愚蠢,但实际上我正在学习很多东西。
    • @datenwolf:值得注意的是,任何通过正常顶点管道的东西都会被剪裁,因此永远不会出现在视口之外。在某些极端情况下,可能会出现视口外写入,但无论如何,它们中的大多数都已被弃用。剩下的几件事之一就是glClear
    • @derhass:像glBlitFramebuffer 这样的帧缓冲复制操作也会受到剪刀测试的影响。
    • @datenwolf:是的,你就在这里。大概还有几个。我不想说您的原始评论是错误的或无用的。我只是觉得有必要补充一下,那些“视口外”的写入是一种特殊的操作,在许多情况下无需剪刀测试就可以逃脱。 YMMV。
    猜你喜欢
    • 2023-04-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多