第一部分:可视和遮挡
一、深度缓存算法
※补充:画家算法:
画家算法从远到近绘制面。
画家算法不适用与两个平面互相穿插的情形。
深度缓存算法:
要正确实现三角形遮挡关系,而不需要管三角形渲染次序,渲染引擎会使用称为深度缓冲(depth-buffer, z-buffer)的技术。
深度缓冲是全屏缓冲,每个像素含有16位或24位深度数据。
伪代码:
for(each triangle T)
{
for(each sample in T)
{
if(z < zbuffer[x, y])//深度测试
{
frameBuffer[x, y] = rgb;//写入帧缓冲
zBuffer[x, y] = z;//更新深度
}
else
}
}
深度冲突和W缓冲:
当渲染非常接近的平行表面时,由于深度缓冲仅含有限的精确度,会造成称为深度冲突(f-fighting)的视觉瑕疵。
Cre:非常接近是相对的(即浮点数字接近)。当两个面的绝对距离并不小但是两个面离世界原点非常大时候也会造成深度冲突。
Z缓冲对于远近的平面的深度有不同的精确度。裁剪空间的Z深度并非均匀分布于近平面和远平面之间,因为该深度是观察空间的Z坐标的倒数,所以深度缓冲的大部分精确度集中于近摄像机的地方。
要实现整个深度范围内都有均匀精确度,就要存储观察空间的Z坐标,而非裁剪空间的Z坐标。此技术称为W缓冲,因为观察空间的Z坐标恰好出现在齐次裁剪空间的W分量里(Z缓冲和W缓冲都是指裁剪空间的坐标)。
W缓冲比Z缓冲更加耗时,因为W缓冲不能直接对深度插值,必须计算其倒数才能插值,然后再算倒数以存储于W缓冲。