当有多个着色器程序时使用 glClear()



假设我想在两个视口中渲染一个OpenGL场景。第一个视口呈现彩色图像,第二个视口渲染深度图像。每个都有自己的顶点着色器和片段着色器,并且每个都有自己的着色器程序。着色器相似,唯一的区别是,对于彩色图像,顶点颜色在顶点着色器中根据顶点法线定义,而对于深度图像,顶点颜色在片段着色器中根据顶点深度定义。为了执行渲染,我glUseProgram()颜色着色器程序,绘制颜色场景,然后glUseProgram()深度着色器程序,并绘制深度场景。

我不确定的是,当有两个着色器程序时,glClear()是如何工作的。我是否需要在每个渲染循环中调用它两次 - 一次在渲染彩色图像之前,一次在渲染深度图像之前?当我只调用一次它时,它似乎有效,但这对我来说似乎很奇怪。我本以为每个着色器程序都会写入一次颜色和深度缓冲区。因此,在渲染深度图像时,它会有渲染彩色图像时剩余的缓冲区......但事实似乎并非如此。有人可以向我解释一下吗?谢谢!

我不确定的是,当有两个着色器程序时,glClear() 是如何工作的。

如果您不确定清除如何与着色器交互,那么您对正在发生的事情有某种误解。

glClear清除帧缓冲。使用什么着色器程序在该帧缓冲中创建像素是完全无关紧要的。使用多少程序生成像素数据并不重要。

从概念上讲,它与此没有什么不同:

int foo = <insert large expression here>;
foo = 5;

无论初始化表达式有多大和复杂,将 5 写入变量都会覆盖那里的任何内容。就像清除帧缓冲将清除帧缓冲一样,无论它是如何到达那里的。

我是否需要在每个渲染循环中调用它两次 - 一次在渲染彩色图像之前,一次在渲染深度图像之前?

视口不是OpenGL中的真实构造。它们只是 NDC 到窗口空间转换的一部分。裁剪后,折点将转换为窗口中的某个位置;视口只是让您决定它们在窗口中的位置。您看不到视口之外的部分,因为这些顶点被剪切阶段剪裁了。

视口不会创建帧缓冲、子帧缓冲、迷你帧缓冲或与帧缓冲相关的任何内容。视口只是基元的转换技巧。

帧缓冲清除操作不涉及基元。因此,帧缓冲区清除不关心当前视口。它们将影响整个帧缓冲。

帧缓冲清除确实遵循剪刀盒,如果在发出清除时启用了剪刀测试。但视口与清除无关。

相关内容

  • 没有找到相关文章

最新更新