2012-03-24 96 views
9

我正在尝试编写一个将视频相机帧写入四元组的程序。 我看到教程解释说帧缓冲可以更快,但仍然在学习如何去做。 但是除了framebuffer之外,我发现还有渲染缓冲区。GLSL Renderbuffer真的需要吗?

问题是,如果目的只是将纹理写入填充屏幕的四边形,我是否真的需要渲染缓冲区?

我知道renderbuffers是用于深度测试的,我认为这只是用于检查像素的Z位置,因此,为我的场景创建渲染缓冲区是正确的吗?

回答

10

A framebuffer object是一个粘贴图像的地方,以便您可以渲染它们。颜色缓冲区,深度缓冲区等全部进入帧缓冲区对象。

一个renderbuffer就像一个纹理,但有两个重要的区别:

  1. 它始终是二维和没有的贴图。所以它总是只有1张图片。
  2. 不能从读取渲染缓冲区。你可以将它们附加到一个FBO并渲染给它们,但你不能从它们中抽取纹理访问或其他东西。

所以你说的是两个大体上分离的概念。渲染缓冲区不要已将“进行深度测试”。这是渲染缓冲区的常见用例,因为如果要将颜色渲染为纹理,通常不会在意深度。您需要需要深度,因为您需要进行隐藏表面去除的深度测试。但你不需要样本从那个深度。因此,您不需要制作深度纹理,而是创建一个深度渲染缓冲区。

但是,renderbuffers也可以使用颜色而不是深度格式。你不能将它们作为纹理附加。你仍然可以从/向他们传递信息,你仍然可以用glReadPixels阅读它们。你无法在着色器中读取它们。

奇怪的是,这并没有回答你的问题:

的问题是,如果目的仅仅是写一个纹理到四会填满屏幕,我真的需要一个渲染?

我不明白为什么你需要一个framebuffer或任何形式的渲染缓冲区。纹理是纹理;只是画一个纹理四。

+0

我需要使用framebuffer的原因是因为我在某些页面阅读是进行乒乓渲染的唯一方法。我的意图是使用这种技术来应用几种滤镜效果,所以我需要一种方法在穿过片段着色器之后重用纹理的输出,以根据需要传递一些其他效果。 – PerracoLabs 2012-03-24 10:25:47

+1

@ user848253:未来,如果您更了解自己的实际情况,您将更有可能获得准确的信息,而不是提供尽可能少的信息。在你的问题中你所说的全部是你正在尝试写一个纹理作为全屏四元组。 – 2012-03-24 10:27:59

+2

好吧,我仍然把所有的东西放在一起,因为所有的东西都是我的新东西,我正在阅读几个教程,但是找不到一个直接显示所有概念的教程。总体思路是使用着色器处理视频帧,应用多个滤镜,然后将其输出到屏幕中的四边形。 – PerracoLabs 2012-03-24 10:31:07