2012-04-01 80 views
3

我正在做2遍渲染,第一遍渲染到纹理,第二遍渲染到屏幕。OpenGL ES 2.x:重新使用深度缓冲区进行离屏和屏幕渲染的任何方式?

我在两次渲染中渲染相同的多边形,但我使用了不同的着色器。特别是,第二遍使用着色器,将第一遍生成的纹理作为参数。

目前我的第一遍有一个带有用于颜色附件的纹理的framebuffer和用于深度附件的渲染缓冲器(禁用了stenciling),而第二遍渲染为默认帧缓冲区(0)。

我想到,由于我在pass-2中渲染了完全相同的多边形,所以深度缓冲区最终看起来与我的pass-1深度缓冲区相同。如果我能以某种方式将pass-2深度缓冲区初始化为pass-1的深度缓冲区,那么我可以将我的深度测试函数更改为GL_LEQUAL,并避免为pass-2的片段着色器做大量不必要的工作。深度写入也可以禁用此传递。

所以......有没有办法做到以下一种?

  • 创建自己的帧缓存,它使用屏幕的深度缓冲(但仍写的颜色纹理)
  • 附上我自己的渲染到默认的帧缓冲的深度附着

我能想到的唯一解决方法(并且我还没有尝试过这个,所以我不知道这会对性能产生什么样的影响)是让第二遍渲染纹理,然后进行第三遍,只是“点击”纹理到屏幕。

回答

0

从阅读OpenGL® ES Common Profile Specification Version 2.0.25 看来,这些都是不可能的。

第4.4.2节说:

Framebuffer的可附着的图像可以被附连到和从 应用创建的帧缓冲区的对象分离。相比之下,OpenGL ES可能不会更改窗口系统提供的帧缓冲区的图像附件

(强调我的)所以问题中的第二个选项是不可能的。

第4.4.3节表明,第一个选项是不可能的要么...

一个渲染对象不能与 名零创建。如果渲染缓冲区为零,则以前与目标的任何绑定都会中断 ,并且目标绑定会恢复到初始状态。

在初始状态下,保留名0被绑定到RENDERBUFFER。 没有与名称零对应的渲染缓冲区对象,因此客户端尝试修改 或查询目标RENDERBUFFER的渲染缓冲区状态,而零被绑定将会导致 生成错误。

...虽然这不太明确。目前尚不清楚是否有其他一些 名称可用于引用默认帧缓冲区的 渲染缓冲区,尽管很难想象哪个名称会使得更多 的传感比0更有意义,因为它被用于其他地方的默认设置。

+0

它可能不在规范中,但我重新使用了带有屏幕外渲染的FBO的深度缓冲区,并在iOS上为屏幕绘制了一些内容。苹果公司的实施支持这一点,但他们有一个轻微的小故障,Y轴在他们的屏幕外深度缓冲区和屏幕之间翻转。他们正在解决这个问题,但我还没有在更新的iOS版本上再次尝试过。 – 2012-04-05 17:58:09

+0

@BradLarson互动。你如何告诉屏幕外FBO使用屏幕上的深度缓冲区?将0绑定到深度附件? – 2012-04-05 20:27:32

+1

至少在iOS上,您仍然需要手动为屏幕上的内容创建深度缓冲区,然后将其附加到与承载OpenGL ES内容的CAEAGLLayer关联的帧缓冲区。除了创建新的深度缓冲区并将其附加到显示帧缓冲区之外,您可以将之前使用的缓冲区重新附加到显示帧缓冲区。再次,这在iOS上可行,但其他平台可能不一样。 – 2012-04-05 21:16:21

相关问题