OpenGL ES 2.x:为屏幕外和屏幕渲染重用深度缓冲的任何方法?

时间:2012-04-01 18:25:46

标签: opengl-es opengl-es-2.0

我正在做2遍渲染,第一遍我正在渲染到纹理,第二遍我正在渲染到屏幕。

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

目前我的第一个传递有一个帧缓冲区,其中包含颜色附件的纹理和深度附件的渲染缓冲区(禁用模板处理),而第二个传递渲染到默认的帧缓冲区(0)。

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

所以......有什么办法可以做到以下其中一种吗?

  • 创建我自己的使用屏幕深度缓冲区的帧缓冲区(但仍然将颜色写入纹理)
  • 将我自己的渲染缓冲区附加到默认的帧缓冲区的深度附件

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

1 个答案:

答案 0 :(得分:1)

阅读OpenGL® ES Common Profile Specification Version 2.0.25 似乎这些都不可能。

第4.4.2节说:

  

可附加帧缓冲的图像可以附加到其上,也可以从中删除   应用程序创建的帧缓冲对象。相比之下,的图像附件   Windows系统提供的帧缓冲区可能不会被OpenGL ES 更改。

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

第4.4.3节建议第一种选择也不可能......

  

无法使用。创建renderbuffer对象   名字为零。如果renderbuffer为零,则先前对目标的任何绑定都会被破坏   并且目标绑定将恢复到初始状态。

     

在初始状态下,保留名称零绑定到RENDERBUFFER。有   没有与名称零对应的renderbuffer对象,因此客户端尝试修改   或查询目标RENDERBUFFER的renderbuffer状态,而零绑定将   产生错误。

......虽然这不太明确。目前尚不清楚是否还有其他一些 可用于引用默认帧缓冲区的名称 渲染缓冲区,虽然很难想象会有更多的名称 感觉比0好,因为它在其他地方被用作默认值。