管道中的多重采样

deb*_*air 1 opengl graphics multisampling

在多重采样中,在光栅化期间,每个像素中存在多个采样点,并且确定构成基元的采样点.

哪个属性对于像素中的每个样本都相同?我在某处读到颜色和纹理值相同,但像素中样本的深度和stensil值不同.但是,当为每个采样点执行片段着色器时,它们应该是不同的.

此外,在片段着色器之后,何时在管道中解析多个样本?它们是线性平均的吗?

And*_*man 6

首先,您必须了解多重采样的工作原理以及创建原因.

我将从抗锯齿的角度来看待这个问题,因为这是多重采样的主要用例,直到在GL3中引入多重采样纹理.

当某些内容被多重采样时,这意味着每个采样点都包含多个样本.如果基元具有相对均匀的特性(例如,各处具有相同的深度),则这些样本可以彼此相同,并且智能GL /硬件实现能够通过智能地读取/写入共享样本来识别这种情况并减少存储器带宽(类似于颜色) /深度缓冲压缩).然而,4x MSAA帧缓冲器所需存储的成本与4x SSAA相同,因为GL必须适应最坏情况,其中4个样本中的每一个都是唯一的.

像素中每个样本的哪些属性相同?

每个片段可以覆盖多个样本点以获取诸如颜色,纹理坐标等属性.不是频繁地调用片段着色器4x来实现4x抗锯齿,而是设计了一个技巧,其中每个属性将在片段中心进行采样(这是默认值)然后写入每个覆盖的样本位置的单个输出.在片段的中心不是实际覆盖区域的一部分的情况下,默认行为有点缺乏 - 为此,引入了质心采样...顶点属性将在片段内的图元的覆盖区域的中心进行插值而不是片段本身的中心.

之后,当需要将颜色写入帧缓冲区时,需要对所有这些样本进行平均以产生单个像素; 我们称之为多重采样解析.这适用于某些事情,但它没有解决片段着色本身期间出现的别名问题.

纹理在片段着色器执行期间发生,这意味着纹理的采样频率保持不变,因此MSAA通常无法帮助进行纹理混叠.因此,虽然超采样抗锯齿改善几何边缘处的混叠纹理/着色器混叠(像镜面反射高光),但多重采样通常只能减少"锯齿".

我在某处读到颜色和纹理值相同,但像素中样本的深度和stensil值不同.

简而言之,片段着色器中计算的任何内容对于所有覆盖的样本都是相同的.片段着色(例如深度)之前可以确定的任何事物都可以变化.

对每个子样本评估诸如深度/模板的片段测试.但是多重采样深度缓冲区有一些限制.直到D3D 10.1,硬件不需要支持多重采样深度纹理,因此您无法在片段着色器中对多重采样深度缓冲区进行采样.

但是,当为每个采样点执行片段着色器时,它们应该是不同的.

有一个称为样本着色的功能,它可以通过改善阴影碎片和光栅化过程中生成的样本之间的比率,强制MSAA的实现更像SSAA.但默认情况下,您描述的行为不是多重采样.

片段着色器后,多个样本何时在管道中解析?它们是线性平均的吗?

多重采样分辨率发生的片段着色,任何时候你有一个多采样缓冲区的内容写入一个singlesampled缓冲.这包括类似的东西glBlitFramebuffer (...).如果使用多重采样纹理,也可以片段着色器中自己手动实现多重采样分辨率.

最后,关于用于多重采样分辨率的过程,这是特定于实现的样本布局.如果您打开显示驱动程序的控制面板并查看可用的无数抗锯齿选项,您将看到多个样本布局选项和MSAA解析算法.


我强烈建议你看一下这篇文章.虽然它与D3D10 +有关,而与OpenGL无关,但一般规则适用于两种API(D3D9的规则略有不同),图表的质量非常出色.

特别要特别注意三角形的MSAA光栅化规则部分,其中规定:

对于三角形,对每个样本位置(不是像素中心)执行覆盖测试.如果覆盖了多个样本位置,则像素着色器将运行一次,并在像素中心插入属性.对于通过深度/模板测试的像素中的每个覆盖样本位置,存储(复制)结果.