opengl-es – OpenGL ES 2.x:重用深度缓冲区以进行屏幕外和屏幕渲染的方法吗?

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

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

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

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

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

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

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

最佳答案
从阅读OpenGL® ES Common Profile Specification Version
2.0.25

似乎这些都不可能.

第4.4.2节说:

Framebuffer-attachable images may be attached to, and detached from,
application-created framebuffer objects. In contrast, the image attachments of the
window-system-provided framebuffer may not be changed by OpenGL ES
.

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

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

A renderbuffer object cannot be created with the
name zero. If renderbuffer is zero, then any previous binding to target is broken
and the target binding is restored to the initial state.

In the initial state, the reserved name zero is bound to RENDERBUFFER. There is
no renderbuffer object corresponding to the name zero, so client attempts to modify
or query renderbuffer state for the target RENDERBUFFER while zero is bound will
generate errors.

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

转载注明原文:opengl-es – OpenGL ES 2.x:重用深度缓冲区以进行屏幕外和屏幕渲染的方法吗? - 代码日志