【问题标题】:OpenGL - Does MSAA not support floating-point texture?OpenGL - MSAA 不支持浮点纹理吗?
【发布时间】:2021-11-03 09:28:14
【问题描述】:

事情是这样的,我正在尝试使用多重采样纹理进行延迟着色。 为了创建 GBuffer,我创建了一个带有多样本纹理附件的帧缓冲区以供绘制,并创建一个带有普通纹理附件的帧缓冲区以复制结果。 (因为我不能直接读取多重采样纹理)。

光照通过后,我发现边缘没有正确抗锯齿,见下图。

(你可以看到光影之间的拼图)

所以我查看了 gbuffer 内容,似乎使用 float 纹理格式的 Position 缓冲区是抗锯齿的。但是使用unsigned byte纹理格式的Albedo缓冲区看起来不错。

这些缓冲区的外观如下,上面的缓冲区是Position 缓冲区,底部的是Albedo 缓冲区

有人可以解释一下吗?我是不是做错了什么?

【问题讨论】:

    标签: opengl-4 deferred-rendering


    【解决方案1】:

    我创建了一个带有多样本纹理附件的帧缓冲区以供绘制,并创建了一个带有普通纹理附件的帧缓冲区以复制结果。

    你的问题;这实际上是行不通的。

    在您的光照通过之前进行多重采样解析是没有意义的。您实际上是在不同对象上的两个位置之间进行混合。这不会产生有意义的结果。

    如果您要在延迟渲染中进行多重采样,您必须在片段着色器中使用per-sample shading 并读取每个样本(使用texelFetch on sampler2DMS)来进行光照通道。您还将写入多样本图像。

    只有最后一张图像是对其进行多重采样解析操作的图像。

    【讨论】:

    • 但是最后两个图像都附加到同一个帧缓冲区,我使用相同的过滤方法对帧缓冲区的每个附件进行 blit。为什么只有最后一个得到解决?
    • 对于位置缓冲区,当我将格式更改为 ubyte 时,我可以看到 msaa 工作。但是这个值是固定的,它对阴影贴图不起作用。
    • @xubury:“为什么只有最后一个得到解决?”你误会了。我解释的是在使用延迟渲染执行 MSAA 时您应该做什么,而不是您当前在做什么。您从不解析您的法线、位置或任何其他 gbuffer。您只需对从光照通道计算的最终数据进行解析。
    • 好的。所以你的意思是几何缓冲区不能像其他缓冲区那样直接拥有MSAA?我尝试了“texelFetch”,但得到了相同的结果。
    • @xubury:我说过你不能解析缓冲区。您的 gbuffers 可以进行多重采样,但您的光照通道必须单独读取所有样本,对它们进行光照,然后将这些值写入最终图像的每个样本。那就是您要解析的图像。
    猜你喜欢
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多