Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 每次绑定具有不同分辨率的帧缓冲区时都必须调用glViewport吗?_Opengl_Viewport_Resolution_Framebuffer - Fatal编程技术网

Opengl 每次绑定具有不同分辨率的帧缓冲区时都必须调用glViewport吗?

Opengl 每次绑定具有不同分辨率的帧缓冲区时都必须调用glViewport吗?,opengl,viewport,resolution,framebuffer,Opengl,Viewport,Resolution,Framebuffer,我有一个程序,大约有3个大小不同的帧缓冲区。我在开始时初始化它们,为它们指定适当的渲染目标,并更改每个目标的视口大小 我原本以为只有在初始化帧缓冲区时才需要调用glViewport,但是这会在我的程序中产生问题,所以我认为这是错误的?因为它们的分辨率都不同,现在在每个帧中渲染时,我绑定第一个帧缓冲区,更改视口大小以适合该帧缓冲区,绑定第二个帧缓冲区,更改视口大小以适合第二个帧缓冲区的分辨率,绑定第三个帧缓冲区,更改视口大小以适合它,然后绑定窗口帧缓冲区并将视口大小更改为窗口的分辨率 这是必要的,

我有一个程序,大约有3个大小不同的帧缓冲区。我在开始时初始化它们,为它们指定适当的渲染目标,并更改每个目标的视口大小

我原本以为只有在初始化帧缓冲区时才需要调用
glViewport
,但是这会在我的程序中产生问题,所以我认为这是错误的?因为它们的分辨率都不同,现在在每个帧中渲染时,我绑定第一个帧缓冲区,更改视口大小以适合该帧缓冲区,绑定第二个帧缓冲区,更改视口大小以适合第二个帧缓冲区的分辨率,绑定第三个帧缓冲区,更改视口大小以适合它,然后绑定窗口帧缓冲区并将视口大小更改为窗口的分辨率

这是必要的,还是程序中的其他原因造成的?这是每一帧都要做的,所以我担心如果我不必做的话,它会有一点不必要的开销

我原本以为只有在初始化帧缓冲区时才需要调用glViewPort,但是这会在我的程序中产生问题,所以我认为这是错误的

是的,这是一个错误的假设(可能是由于无数错误的教程错误地放置了glViewport)


glViewport始终属于图形代码。在将某些内容绘制到帧缓冲区之前,始终使用正确的参数调用glViewport。glViewport设置的参数在转换管道中使用,因此您应该将glViewport视为类似于glTransform(在固定函数管道中)或glUniform的命令。

在开始绘制不同大小的帧缓冲区之前,始终需要调用
glViewport()
。这是必需的,因为视口不是帧缓冲区状态的一部分

例如,如果您查看OpenGL 3.3规范,第6.2节标题为“状态表”,从第278页开始,包含具有整个状态的表,显示每个状态的范围:

  • 第299页的表6.23列出了“每个帧缓冲区对象的状态”。列出的唯一状态是绘制缓冲区和读取缓冲区。如果视口是帧缓冲区状态的一部分,则将在此处列出
  • 视口在表6.8“变换状态”中列出。这是全局状态,不与任何对象关联
OpenGL 4.1引入了多个视口。但它们仍然是全球转型国家的一部分

如果你想知道为什么会这样,唯一真正的答案是它是这样定义的。看看图形管道,它确实有意义。虽然调用
glViewport()
使其看起来像是在帧缓冲区中指定要渲染到的矩形,但该调用实际上定义了一个变换,该变换作为固定功能块的一部分应用于顶点着色器(或几何体着色器,如果有)和片段着色器之间。视口设置确定NDC(标准化设备坐标)如何映射到窗口坐标

另一方面,帧缓冲区状态决定如何将片段着色器输出写入帧缓冲区。因此,它控制着管道的一个完全不同的部分

从应用程序通常使用视口的方式来看,我认为将视口作为帧缓冲区状态的一部分更有意义。但OpenGL实际上是一个API,旨在作为图形硬件的抽象,从这个角度来看,视口独立于帧缓冲区状态。

谢谢!:)我在所有教程中使用了与窗口相同的帧缓冲区分辨率。