透视投影:3D图形的Z坐标、深度缓存Cache和透视投影

Z坐标和X、Y坐标在变换、裁减和透视除法后Z范围为-1.0~1.0DepthRange映射指定Z坐标变换这和用于将X和Y映射到窗口坐标视口变换类似但DepthRange映射又和视口映射有所区别深度缓存Cache硬件方案对应用来说是隐藏DepthRange参数是[0.0,1.0]片断相联Z值(深度值)表示到眼睛距离在默认情况下最接近眼睛片断(在近截面上)被映射到0.0离眼睛最远片断(在远截面上)映射到1.0片断可以映射为深度缓存Cache范围子集(通过在DepthRange中指定更小值)映射也可以相反这样话离眼睛最远片断在0.0最近片断在1.0(DepthRange(1.0,0.0))虽然这样反向映射是可以但对实际应用作用不大
要理解为什么渲染质量上会不最重要是要理解屏幕Z坐标特性Z值指定了从片断到眼睛距离在正交投影中距离和Z值关系是线性但在透视投影中却不是在透视投影中这种关系是非线性而且非线性程度和Frustumfar/near(或gluPerspectivezFar/zNear)成比例这种非线性在靠近近截面时增加了Z值精度而且增加了深度缓存Cache效率;但是在视见体其它部分则降低了精度也就减少了深度缓存Cache精确性根据经验far/near比值大于1000会有这种不好效果所以般far/near比值应小于1000要想解决这个问题最简单思路方法是通过将近截面远离眼睛来降低far/near比值其唯副作用是离眼睛很近物体可能会被裁减掉但在特定应用中这很少是个问题近截面位置对X、Y坐标投影没有影响因此这对图像影响很小
还有OpenGL光栅化和深度缓存Cache些其他方面值得个大问题是光栅化过程使用不精确算法所以很难处理共面图元除非它们共享相同平面方程这个问题在有限精度深度缓存Cache实现中更加严重这些问题包括:贴花(decaling)、隐藏线消除、轮廓多边形和阴影等不过现在已经提出许多思路方法来解决这些问题如PolygonOff技术等
深度缓存Cache位数是衡量深度缓存Cache精度参数深度缓存Cache位数越高则精确度越高目前显卡般都可支持16位ZBuffer些高级显卡已经可以支持32位ZBuffer般用24位ZBuffer就已经足够了
Tags:  透视投影矩阵的含义 透视投影变化矩阵 透视投影矩阵 透视投影

延伸阅读

最新评论

发表评论