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

Render to targets. Some have MSAA, some don't

我有 6 个纹理。 有些是通过 :-

初始化的
void glTexImage2DMultisample(   GLenum target,
    GLsizei samples,
    GLenum internalformat,
    GLsizei width,
    GLsizei height,
    GLboolean fixedsamplelocations);

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

glTexImage2D( ... );

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

我已经试过了,但出现错误 36182
来自 。错误意味着:-

GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE is also returned if the value of GL_TEXTURE_FIXED_SAMPLE_LOCATIONS is not the same for all attached textures; or, if the attached images are a mix of renderbuffers and textures, the value of GL_TEXTURE_FIXED_SAMPLE_LOCATIONS is not GL_TRUE for all attached textures.

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

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

fixedsamplelocations = Specifies whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not depend on the internal format or size of the image. ,

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

If the last argument (fixedsamplelocations) is set to GL_TRUE, the image will use identical sample locations and the same number of subsamples for each texel.

^不过,还是有一些专业术语我不会。

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

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


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

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

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