光栅化基础知识——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)

来源:互联网 发布:php study 编辑:程序博客网 时间:2024/05/17 04:16

光栅化

光栅化是一种将基本图元转化为二维图像的处理。转化后的图像的每个像素点都包括诸如颜色和深度的信息。因此可见,基本图元的光栅化由两部分工作组成。第一部分工作是决定窗口坐标中的哪些整型栅格区域被基本图元占用;第二部分工作是分配一个颜色值和一个深度值到各个区域。处理的结果会被传递到GL的下一个平台(片元操作),在那里利用消息区更新帧缓存中的适当区域。

and1

图3.1图解光栅处理

一个栅格区域随同它分派的参数(颜色、深度(z),纹理坐标)一起被称为片元;参数全部作为片元的附属数据。一个片元通过它的左下角来定位,它取决于整型栅格坐标。光栅操作当然也涉及到片元的中心,中心从左下角开始做(1/2,1/2)偏移(因此它在半整型坐标上)。

事实上在GL中,栅格区域并不需要被方块化。光栅规则不会被实际的栅格区域的纵横比(屏幕高宽比)影响。尽管如此,显示一个无界的栅格,将会导致光栅点和线段显得在某一个方向上比其它方向远。我们假定片段是方形的,因为它使做抗锯齿和纹理化变得简单。

很多因素影响光栅化。点可能被赋予不同的直径,而线段被赋予不同的宽度。点和线段可能会用像素覆盖值来做抗锯齿(参看3.2),但多边形抗锯齿是不支持使用像素覆盖值的。多边形光栅抗锯齿必须使用多重取样(参看3.2.1)。

3.1不变性

考虑在窗口坐标中通过移位(x,y)转换一个基本图元p而得到一个基本图元p,其中x和y是整型的。如果p和p都是精确而未经裁剪的,那么事实上由p生成的片元f是和由p生成的f是一致的,除非f的中心是由f的中心直接移位(x,y)而来的。

3.2抗锯齿

点和线的抗锯齿是按如下方式工作的:光栅片元的R、G、B值是不受影响的,但是A值会被一个[0,1]之间的浮点数相乘,用来描述一个片元的屏幕像素覆盖值。GL的片元舞台会利用A值去混合新加入的片元和相应的已在帧缓存中存在的像素。

片元覆盖值抗锯齿计算的细节是很难简要描述的。原因是高质量的抗锯齿必须对感知效果和显示帧缓存内容的显示器特性同样重视。这些细节无法在这篇文档范围中详细叙述。而且,原始图元的一个片元的覆盖值的计算必须依赖图元和大量的栅格区域上的相邻单元的联系,而不仅仅只关系片元的栅格区域。另外一个要考虑的是,精确的计算覆盖值的计算量是非常巨大的。从而我们允许一个给定的GL去近似的计算覆盖值,通过使用快速而不是完全精确的覆盖值计算。

基于这些考虑,我们选择根据原型来说明准确的抗锯齿特性,那就是每个显示的像素点都是完全一样的精确的正方形。这些正方形又叫片元正方形,它拥有左下角坐标(x,y)和右上角坐标(x+1,y+1)。我们认识到这个简单的箱式滤器不能产生最好的抗锯齿结果,但是它能提供一个简单的、易于理解的模型。

受以下条件限制,一个GL的执行可能用其它模型去实现抗锯齿:

1.如果f1和f2是两个片元,而且f1的一部分被一些基本图元覆盖了,这些基本图元是相应的f2被覆盖的部分的一个子集。那么计算出的f1的覆盖值会小于或者等于f2的。

2.片元f的覆盖值计算可能会是局部的:它可能仅依赖于f和被光栅化的图元的边界的关系。它可能不依赖f的x、y坐标。

另外一个性质是值得注意的,但不是必须的:

3.光栅化一个特殊图元产生的所有片元的覆盖值的总数是恒定的,这不依赖任何在窗口坐标的栅格移动,只要这些片元位于窗口边缘。

在一些执行中,GL提供不同的抗锯齿质量(参看5.2),以允许用户在图像质量和计算速度中权衡。

3.2.1 多重采样

多重采样是一种对更多GL图元(点、线段、三角形)进行抗锯齿处理的技术。这种技术在每个像素中对图元多次采样。颜色的所有采样值融合为一个单一的可现实的颜色,并实时更新,所以抗锯齿在应用级别看起来是自动的。因为每个采样包含颜色、深度和图案信息,所以颜色(包括纹理操作),深度和图案信息函数显得和单采样模式是一样的。

一种称为多重采样缓存的副缓存被添加到帧缓存中。像素的采样值,包括颜色、深度和图案值,都保存在这种缓存里。当帧缓存包括一个多重采样缓存,那么它就不再拥有深度和图案缓存,即使多重采样缓存并没有保存深度和图案值。尽管如此,颜色缓存和多重采样缓存是共存的。

多重采样抗锯齿技术对于给三角形着色是非常有价值的,因为它不需要对隐面消除做排序,它可以正确的处理临近的三角形、目标轮廓和相交的三角形。如果仅仅只有点和线段被着色,由基本的GL规定的“平滑的”抗锯齿技术会得到一个更高质量的图像。这种技术被设计来允许多重采样和平滑抗锯齿技术在为单幅场景着色时可以自由切换。

如果SAMPLE_BUFFERS的值为1,图元光栅化都是不同的,并被称为多重采样光栅化。否则,基本图元光栅化被称为单样本光栅化。SAMPLE_BUFFERS的值会调用CetIntegerv函数来判断然后利用pname来设置。

多重采样在对像素片元内容着色时变为两种方法。第一,每个片元在SAMPLES中包含一个覆盖值。SAMPLES的值是一个依赖于执行的常量,它的值会调用CetIntegerv函数来判断然后利用pname来设置。

第二,每个片元都包含SAMPLES深度、颜色值,并设置纹理坐标,以替代保存在单一样本着色模式中的单一的深度值、颜色值和纹理坐标。一个执行可能选择分派相同的颜色值和相同的纹理值给不止一个样本。评估像素值和设置纹理坐标的位置可以是任意的,它将含有片元中心和任意样本位置的像素包含在内。颜色值和纹理坐标集合不需要在同一地方求值。因此每个像素片元由整型的x、y栅格坐标、SAMPLES颜色、深度值、SAMPLES的纹理坐标集合和一个由SAMPLES最大值的覆盖值组成。

多重采样光栅化由符号常量MULTISAMPLE来控制使用还是不使用。

如果MULTISAMPLE为“否”,图元的多重采样光栅化就和单采样(片元中心)光栅化是一致的,除非片元覆盖值设置为全覆盖。颜色、深度值和纹理坐标集合全部会被设置成单样本光栅化的值,或者被设置成如下描述的多重采样光栅化。

如果MULTISAMPLE为“是”,所有图元的多重采样光栅化完全不同于单采样光栅化。那么就不难理解,为什么帧缓存中每个像素点都分配一个SAMPLES储存单元。这些储存单元都有精确的位置,并不仅是区域或范围,每个都被称为一个采样点。与一个像素相联系的采样点可能定位在一个基本单元的内或者外,基本单元被认为是一个像素的范围。此外,在帧缓存中,联系的样本点储存单元可能是一致的,也可能是不同的。

如果样本存储单元逐像素点都有差别,他们会被排列在窗口上,而不是屏幕和边界。否则,着色的结果就会是特别的窗口位置。在3.1中介绍的不变性需求对于多重采样光栅化来说是不严格的,因为一个样本存储单元可能是一个像素储存单元的函数。

查询一个真实的像素样本存储单元是不可能的。