gpt4 book ai didi

opengl-es - OpenGL ES 2.x : any way to reuse depth buffer for off-screen and on-screen rendering?

转载 作者:行者123 更新时间:2023-12-01 05:33:47 26 4
gpt4 key购买 nike

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

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

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

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

那么......有没有办法做到以下之一?

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

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

    最佳答案

    从阅读 OpenGL® ES Common Profile Specification Version2.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 : any way to reuse depth buffer for off-screen and on-screen rendering?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9967014/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com