Snowdream

I'm awake but my world is half asleep
posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Sampling

Posted on 2007-12-14 13:42 ZelluX 阅读(302) 评论(0)  编辑  收藏 所属分类: Laboratory

CAL样例程序里面出现很多sample指令,google到的简单介绍:

Antialias (抗锯齿)

虽然减小像素的大小可以使图像可以更加精细,一定程度上减轻了锯齿,但是只要像素的大小大到可以互相彼此区分,那么锯齿的产生是不可避免的!抗锯齿的方法一般是多点(注意此处是“点”而不是“像素”,后面可以看出它们间的区别)采样。

一、        理论与方法:

1 Oversampling (重复取样):

1 )方法:

 首先,将场景以比你的显示器(前缓冲)更高分辨率进行渲染:

假设当前的(前 / 后缓冲)的分辨率是 800 × 600 ,那么可以先将场景渲染到 1600 × 1200 的渲染目标上(纹理);

 然后,从高分辨率的渲染目标得到低分辨率的场景渲染结果:

      此时取每 2 × 2 个像素块颜色的平均值为最终渲染的像素颜色值。

2 )优点:可以显著地改善锯齿导致的失真。

3 )缺点:需要更大的缓冲,同时填充缓冲导致性能消耗变大;

           进行多个像素的取样,导致性能下降;

           由于以上缺点, D3D 并没有采用这种抗锯齿方法。

2 Multisampling (多取样):

1 )方法:

只需要对像素进行一次取样,而是在每个像素中取 N 个点(取决于具体的取样模型),该像素的最终颜色 = 该像素原先的颜色 *  多边形覆盖的点数  /  总的取样点数;

2 )优点:可以改善锯齿带来的失真的同时而不会增加取样次数,同时比起 Oversampling 它也不需要更大的后备缓冲。

3 )缺点:原本当一个多边形覆盖了一个像素的中心点时,该像素的颜色才会由该多边形决定(在像素管线阶段典型的就是寻址到合适的纹理颜色与顶点管线输出的颜色进行调制),但是 Multisampling 中,如果该多边形覆盖了其中一部分取样点却未覆盖像素中心点,该像素颜色仍然由此多边形决定。如此一来,纹理寻址可能出现错误,这对于纹理集( atlas )会出现另一种失真效果:多边形边缘颜色错误!

3 Centriod Sampling (质心采样):

1 )方法:

     为了解决在使用 Multisampling 导致的在纹理集中进行纹理寻址带来的错误,不再采用像素中心的颜色作为“该像素原先的颜色”,而是用“该像素中被多边形覆盖的那些取样点的中心点的颜色”。这样就保证了被渲染的像素点始终是多边形的内部(也就是说纹理地址不会超出多边形的范围)。

2 )如何使用:

         ①任何有COLOR语义作为输入的Pixel Shader会自动运用质心采样;

     ②在Pixel Shader的输入参数的语义后中手动加入 _centroid 扩展,例如:

   float4  TexturePointCentroidPS( float4 TexCoord : TEXCOORD0_centroid ) : COLOR0

{

  return tex2D( PointSampler, TexCoord );

}

3 )注意:

    质心采样主要用于采用纹理集的 Multisampling ,对于一整张纹理对应一个的多边形网格的情况,采用质心采样反而会导致错误!


只有注册用户登录后才能发表评论。


网站导航: