渲染到目标。有些有 MSAA,有些没有

Posted

技术标签:

【中文标题】渲染到目标。有些有 MSAA,有些没有【英文标题】:Render to targets. Some have MSAA, some don't 【发布时间】:2021-07-15 09:33:24 【问题描述】:

我有 6 个纹理。 有些是通过以下方式初始化的:-

void glTexImage2DMultisample(   GLenum target,
    GLsizei samples,
    GLenum internalformat,
    GLsizei width,
    GLsizei height,
    GLboolean fixedsamplelocations);

一些(例如用于描边/延迟着色/特殊效果)通过以下方式初始化:-

glTexImage2D( ... );

(主要问题) 是否可以一次渲染给所有这些?即如何混合 MSAA 类型的渲染目标?

我已经尝试过了,但我收到了错误36182。 来自Multi-sampling Frame Render Objects and Depth Buffers。错误意味着:-

GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 如果值 GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 对于所有附加的都不相同 纹理;或者,如果附加的图像是渲染缓冲区和 纹理,GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 的值不是 所有附加纹理的 GL_TRUE。

或许,这样的操作是不允许的?我已经搜索了一些解释:-

    来自https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2DMultisample.xhtml :-

fixedsamplelocations = 指定图像是否将使用相同的样本位置和相同数量的样本 图像中的纹素,并且样本位置将不依赖于 图像的内部格式或大小。 ,

    https://learnopengl.com/Advanced-OpenGL/Anti-Aliasing 说:-

如果最后一个参数(fixedsamplelocations)设置为 GL_TRUE,图像将使用相同的 每个纹素的样本位置和相同数量的子样本。

^ 不过,有一些技术术语我不知道。

什么是sample locationsample locations 在 glsl 着色器中是否意味着 glLocation? 我猜它与GLsizei samples 相同,例如多为 1 或 4。如果是 4,则 1 个像素 =4 个样本。 internal format 是否意味着类似于GL_[components​][size​][type​]? 为什么the sample locationsinternal format 相关? 因此我不明白fixedsamplelocations 的真正含义。 许多示例使用 GL_TRUE。什么时候应该是 GL_FALSE?

【问题讨论】:

您在示例位置上完全走错了路。您引用的错误描述以“GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE is also returned if [...]”开头,这里的“also”强烈暗示还有其他情况也会返回此错误。这些“其他”情况之一实际上是主要情况:如果并非所有附件都具有相同的样本计数,则会生成此错误。您不能在同一个绘图调用中混合多重采样和非多重采样缓冲区。 【参考方案1】:

在单个 FBO 中,图像要么全部经过多重采样,要么全部不经过多重采样。否则(即使 MS 图像的样本计数为 1)将导致framebuffer completeness error。不仅所有图像必须经过多重采样或非多重采样,所有图像还必须具有相同的样本数(非多重采样图像的样本数为 0)。

所以你想要的东西是不允许的。


关于固定样本位置的内容是一个完全独立的问题。

特定样本计数的多样本图像在每个像素中具有相同数量的样本。但是,当出于抗锯齿目的进行渲染时,最好根据屏幕像素区域来改变这些样本的位置。这提高了多重采样产生的抗锯齿的质量,因为它最大限度地减少了相邻样本模式之间的任何一致性。

如果您打开固定样本位置,您将强制实施不这样做。因此,您将获得降低的抗锯齿质量。如果您有一些依赖于样本的一致位置的着色器计算,您只需要打开它。这通常是因为您手动进行多样本解析(而不是使用 blit)。

【讨论】:

感谢详细的解释。 要进行需要非抗锯齿位置纹理的笔触后处理,是否需要另一个绘图调用? ( ╥ω╥ )

以上是关于渲染到目标。有些有 MSAA,有些没有的主要内容,如果未能解决你的问题,请参考以下文章

Unity自定义SRP(十五):SSAO

在 OpenGL ES 2.0 中渲染到纹理时的抗锯齿

机器视觉识别技术有些啥种类

回顾2017,展望2018

WebGPU学习:MSAA

简单易懂 | 机器学习如何快速入门?