首页 > 解决方案 > 渲染到目标。有些有 MSAA,有些没有

问题描述

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

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

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

glTexImage2D( ... );

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

我试过了,但我得到了错误36182
来自多采样帧渲染对象和深度缓冲区。错误意味着: -

如果所有附加纹理的 GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 的值不同,也会返回 GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;或者,如果附加图像是渲染缓冲区和纹理的混合,则所有附加纹理的 GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 的值不是 GL_TRUE。

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

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

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

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

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

^ 然而,有一些我不知道的技术词汇。

标签: c++openglframebuffer

解决方案


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

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


固定样本位置上的东西是一个完全独立的问题。

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

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


推荐阅读