14.3 OpenGL图元装配和光栅化:抗锯齿

抗锯齿 Antialiasing

多采样是一种在OpenGL中实现所有图形元素(点、线和多边形)抗锯齿的技术。其原理是在每个像素位置上对几何体进行多次采样,然后将这些颜色样本值合并成一个可显示的颜色以呈现平滑的边缘效果。在帧缓冲区中增加了一个称为多采样缓冲区的附加缓冲区,用于存储每个像素的多个采样结果,包括颜色、深度和模板信息。

在多采样渲染期间,每个像素片段包含覆盖值(SAMPLES位数)、SAMPLES个深度值及关联数据集。通过GetMultisamplefv函数可以查询特定样本的位置,但实际使用的样本点位置可能不固定且不可查询,它们可能是窗口边界对齐的,并不一定与返回的着色样本位置一致。

根据SAMPLE_BUFFERS参数的不同,光栅化过程会采用单采样或多采样模式。启用MULTISAMPLE后,对于包含有sample in限定符输入变量的片段着色器,相关数据将在每个样本位置独立计算。如果未启用MULTISAMPLE,则多采样渲染将退化为单采样渲染,只是覆盖值设为全覆盖。

多采样特别适用于处理多边形,因为它无需排序以消除隐藏表面,同时能正确处理相邻多边形、物体轮廓以及相交的情况。然而,仅针对线条渲染时,基础OpenGL提供的“平滑”抗锯齿机制可能提供更好的质量。此外,由于样本位置可能取决于像素位置,因此在多采样光栅化时放宽了部分不变性要求。

查询特定样本位置

void glGetMultisamplefv( enum pname, uint index, float *val );
  • pname:指定了要查询的信息类型。在这个函数中,pname必须被设置为 GL_SAMPLE_POSITION,表示我们要获取的是某个样本的位置。
  • index:指定要查询的样本索引。每个像素可以有多次采样,index就是这些采样中的一个索引号。
  • val:这是一个指向浮点数数组的指针,函数将返回的样本位置(x和y坐标)写入到这个数组中。通常数组至少需要包含两个元素,val[0] 存储x坐标,val[1] 存储y坐标。这两个坐标值都在归一化设备坐标系下,范围从0.0到1.0之间。

样本着色 Sample Shading

样本着色允许开发者指定每个片段至少处理的唯一样本数量。通过调用EnableDisable函数,并将目标设置为SAMPLE_SHADING来控制样本着色功能。

如果MULTISAMPLESAMPLE_SHADING被禁用,则样本着色不起作用。否则,实现必须为每个片段提供至少max([mss × samples], 1)组独立的片段着色器输入数据,其中mss是MIN_SAMPLE_SHADING_VALUE值,samplese是采样数(即SAMPLES值)。这些数据集以实现相关的方式与各个样本关联起来。

设置多采样渲染时的最小样本着色程度 MIN_SAMPLE_SHADING_VALUE

void glMinSampleShading(float value);

在这里,value参数被设置为所需的最小样本着色分数。当指定时,value会被限制在[0, 1]范围内。可以通过调用GetFloatv函数并设置pname为MIN_SAMPLE_SHADING_VALUE来查询样本着色分数。

当样本着色分数为1.0时,对每个样本都会单独评估一组颜色和其他相关数据,并且每组值都在样本的位置上进行计算。这意味着当着色分数最大时,每个像素的所有样本都会得到独立的着色处理和计算,从而实现最高级别的细节平滑度和抗锯齿效果。

你可能感兴趣的:(OpenGL,图形渲染)