情况
我正在编写图像合成器,并且正在使用 FBO。
由于 gl 无法读取它当前正在写入的纹理,目前我正在使用伪“Fbo Flip Chain”逻辑。我创建了一个大约 10 个 FBO 的列表,每次渲染时,我都会移动到下一个 FBO,它可以愉快地从以前的 FBO 纹理之一中读取。
然而,这是有很大缺陷的,因为我目前进行堆肥的方式可以在当前状态下仍需要 fbo 时覆盖它。我绑定了一个“锁定/解锁”逻辑,但它很脆弱。
图像当前经历以下阶段:
- 将图像绘制到纹理(使用 fbo)
- fbo翻转
- 将所有图像“孩子”合成到图像上
- 每个孩子的fbo翻转这是问题
- 将图像转换为目标类型
- fbo翻转
- 将图像与其目的地混合
- fbo翻转
- 传递纹理以与兄弟姐妹一起堆肥
我决定重新考虑这个翻转链合成的想法。在我看来,最好执行以下操作之一:
可能的解决方案
- 每个图像将包含自己的多个 fbo,每个都有自己的渲染目标,在每个阶段切换到指定的 fbo*
- 每个图像将包含一个 fbo 和多个纹理目标,更改每个阶段的附件*
- 每个图像将有2 个渲染目标(“前”、“后”),将有1 个主 fbo,主 fbo 将覆盖“前”纹理,同时从“后”纹理读取(更像是后缓冲区和一个前缓冲区)。在每个阶段*结束时交换它们。
*(每个阶段 = 当前执行翻转的位置)
我目前倾向于数字 2,每个图像最终都会有 4/5 纹理,这将被指定给每个阶段。当图像被“绘制”时,它可以测试它是否可以从不同的阶段开始绘制。
例如,图像已经绘制并且已经转换为正确的类型,所以采用“post_convert”纹理并混合。
问题:
- 我不确定哪个更快,附加和分离渲染目标。或绑定 FBO...
- 目前有大量的纹理和 fbos 被抛出。而且我非常警惕我在 C# 中使用 GL 进行编程,因此我需要确定一个与 C#s GC 一起管理 gl 内存的系统。