当前位置: 首页 > 知识库问答 >
问题:

为什么OpenGL分屏代码可以工作?不明纹理?

张兴旺
2023-03-14

所以我有一个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),代码仍然有效!怎样除了纹理坐标,我怎么能拥有一个纹理四边形而不在代码中提及纹理呢?

共有1个答案

高展
2023-03-14

编辑:datenwolf应用更正,这里有详细解释=

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

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

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

如果没有drawSceneContents细节,我就说不出更多了。。。

 类似资料:
  • 我想将两个1d纹理传递到片段着色器中。我正在创建两个sampler1d纹理,将它们绑定到我的着色器程序,但似乎两个采样器使用相同的纹理。当我对texture1使用采样texelFetch时,它使用了我在texture2中定义的错误颜色。 当我希望看到红色屏幕时,下面的着色器程序会返回绿色屏幕。播放参数我看到,纹理1的buf中的任何变化都会改变纹理2的颜色。有什么办法解决吗? 这是我将着色器采样器绑

  • 我想了两个小时,为什么这段代码不能产生预期的结果。如果我输入3个整数,比如3、4和5,它应该给出所有27个可能的和(假设数字可以是正的、负的或零) 因此,它应该产生以下内容: -3-4-5=-12 -3-4 0 = -7 -4-4 5=3 等等

  • 下面是一个链表的简单实现。我刚刚添加了相关代码。首先,我向列表中添加一些值,10,990和10000。当我搜索相同的值时,对于key=10,我得到true,但是对于key=990和key=10000得到false,尽管它应该是true。另外,如果我将第二个值从990更改为99,并搜索key=99,这一次我得到的是true。 我不确定是否使用泛型类型。我想我在那里做错了什么。因为如果我用int替换泛

  • 在以下Java代码中 我在控制台中得到以下输出 在使用next()或nextFoo()后,从扫描仪查看答案时跳过nextLine()?,我们必须添加Cmd8的原因是,nextInt()一直读取输入,直到将输入发送到程序,并将输入放回输入流的前面。现在,当“Cmd8”中的nextLine()开始读取它时,它会在输入流的开始处发现前面没有任何字符串,它假定用户没有输入任何内容,因此将空字符串作为输入并

  • 我有以下Sikuli代码在JMeter这是不工作。 我尝试了Beanshell采样器和JSR223采样器,但在这两种情况下都不起作用。这是我得到的错误。 JSR223采样器 响应消息:javax。剧本脚本异常:javax。剧本ScriptException:FindFailed:C:\scripts\patterns\vnc\vncviewer。png:(32x31)在R[0,0 1920x108

  • 我正在尝试利用gpu的并行性来制作图像处理应用程序。我有一个着色器,它采用两种纹理,并基于一些统一的变量计算输出纹理。但是不是透明度alpha值,每个纹理像素需要一个额外的元数据字节,这在计算中是强制性的: 因此,我考虑每帧运行着色器两次,一次将动态元数据计算为单字节纹理,一次计算生成的Paint Texture,我需要3个字节(以限制内存使用,因为可能有相当多这样的纹理一次加载)。 我发现上面的