我正在进行双通道渲染,第一通道我渲染到纹理,第二通道我渲染到屏幕。
我在两次渲染过程中渲染相同的多边形,但使用不同的着色器。特别是,第二遍使用着色器,该着色器将第一遍生成的纹理作为参数。
目前,我的第一遍有一个帧缓冲区,其中包含用于颜色附件的纹理和用于深度附件的渲染缓冲区(模板已禁用),而第二遍则渲染到默认帧缓冲区 (0)。
我突然想到,由于我在第 2 通道中渲染完全相同的多边形,因此深度缓冲区最终看起来与第 1 通道深度缓冲区相同。如果我能以某种方式将 pass-2 深度缓冲区初始化为 pass-1 的深度缓冲区,那么我就可以将深度测试函数更改为 GL_LEQUAL,并避免 pass-2 片段着色器的大量不必要的工作。此通道也可以禁用深度写入。
那么...有什么方法可以执行以下操作之一吗?
- 创建我自己的帧缓冲区,它使用屏幕的深度缓冲区(但仍将颜色写入纹理)
- 将我自己的渲染缓冲区附加到默认帧缓冲区的深度附件
我能想到的唯一解决方法(我还没有尝试过,所以我不知道这会对性能产生什么样的影响)是让第二遍也渲染到纹理,然后进行第三遍这只是将纹理“传输”到屏幕上。
从阅读OpenGL® ES 通用配置文件规范版本
2.0.25看来这两者都不可能。
第 4.4.2 节说:
可附加帧缓冲区的图像可以附加到或分离
应用程序创建的帧缓冲区对象。相比之下,的图像附件
OpenGL ES 可能无法更改窗口系统提供的帧缓冲区.
(强调我的)所以问题中的第二个选项是不可能的。
第 4.4.3 节表明第一个选项也不可能......
无法使用以下命令创建渲染缓冲区对象
名字为零。如果渲染缓冲区为零,则先前与目标的任何绑定都会被破坏
并且目标绑定恢复到初始状态。
在初始状态下,保留名称零绑定到RENDERBUFFER
。有
没有与名称零对应的渲染缓冲区对象,因此客户端尝试修改
或查询目标的渲染缓冲区状态RENDERBUFFER
当零被束缚时
产生错误。
...虽然这不太明确。不清楚是否还有其他
可用于引用默认帧缓冲区的名称
渲染缓冲区,尽管很难想象什么名字会带来更多
意义大于 0,因为它在其他地方用作默认值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)