【问题标题】:Is it possible to depth test against a depth texture I am also sampling, in the same draw call?是否可以在同一个绘图调用中针对我也在采样的深度纹理进行深度测试?
【发布时间】:2020-08-23 01:27:47
【问题描述】:

上下文:

我正在使用延迟渲染设置,在第一阶段我有两个 FBO:一个是 GBuffer,用于存储所有可见片段的法线、反照率和材质信息。此 FBO 具有 32 位深度纹理。在计算任何光照之前,它会被绘制到几何通道中。

第二个 FBO 是纯颜色的,从黑色开始,但在多个通道中累积光照,来自从 GBuffer 采样并使用加法混合写入纯颜色缓冲区的光照着色器。

问题是,我真的很想利用早期深度测试来让我的光照只计算包含实际几何体(不仅仅是天空)的片段。我能想到的最好方法是使用深度测试来使在阳光下深度为 1 的任何像素失效,或者使位于点光源影响范围后面的任何像素失效。但是,我不认为我可以将此深度纹理​​绑定到我的颜色 FBO,因为我还在光照着色器中对其进行采样以计算片段在世界空间中的位置。

所以我的问题是:有没有办法为早期深度测试和着色器内部采样使用相同的深度纹理?或者,如果没有,是否有其他(合理的性能)方法来拒绝其中没有几何图形的像素?在我的光照通道中,我根本不会写入这个深度纹理。

我只需针对 PC 上的现代图形硬件(这样我就可以使用任何常见的扩展或 openGL 4.6 功能)。

【问题讨论】:

    标签: opengl fbo opengl-4 deferred-rendering


    【解决方案1】:

    OpenGL 中有一些规则可以读取着色器中的数据,这些数据也由于帧缓冲操作而更新。这些规则过去非常严格。事实上,在 GL 4.4 之前,rules were so strict 你试图做的实际上是未定义的行为。也就是说,如果纹理中的图像附加到渲染 FBO,并且您从该纹理中获取样本,使得它完全可能从附加的图像中读取,您得到未定义的行为。没关系,如果您的写入掩码意味着没有写入发生;是UB。

    幸运的是,它现在定义明确。只有在进行实际写入时才能获得 UB,而不仅仅是因为您将图像附加到 FBO。我所说的“现在”基本上是指过去 10 年制造的任何硬件。虽然ARB_texture_barrier and GL 4.5 是相当新的,但它们的前身 NV_texture_barrier 实际上已经很老了。尽管名称是 NVIDIA 扩展,但它是 so widely implemented,它是 even available on MacOS implementations

    【讨论】:

      猜你喜欢
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      相关资源
      最近更新 更多