我正在做2遍渲染,第一遍我正在渲染到纹理,第二遍我正在渲染到屏幕。
我在两个传递中渲染相同的多边形,但我使用不同的着色器。特别是,第二遍使用着色器,该着色器将第一遍生成的纹理作为参数。
目前我的第一个传递有一个帧缓冲区,其中包含颜色附件的纹理和深度附件的渲染缓冲区(禁用模板处理),而第二个传递渲染到默认的帧缓冲区(0)。
我想到,因为我在pass-2中渲染完全相同的多边形,所以深度缓冲区最终看起来与我的pass-1深度缓冲区相同。如果我能以某种方式将pass-2深度缓冲区初始化为pass-1的深度缓冲区,那么我可以将深度测试函数更改为GL_LEQUAL并避免对pass-2的片段着色器进行大量不必要的工作。此传递也可以禁用深度写入。
所以......有什么办法可以做到以下其中一种吗?
我能想到的唯一解决方法(我还没有尝试过,所以我不知道这会对性能产生什么样的影响)是让第二遍也渲染到纹理,然后有第三遍,只是将纹理“闪烁”到屏幕上。
答案 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好,因为它在其他地方被用作默认值。