使用Z缓冲区与根据深度优先考虑像素的优点

Eri*_*tto 2 opengl graphics zbuffer

这是一个学术问题.事实上,我正在准备考试,我只是想真正理解这个概念.

请允许我解释一下上下文.当前的问题是在绘制到屏幕时将对象(或更具体地说是多边形)隐藏在彼此之后.需要进行计算以确定哪一个最后绘制,因此最后绘制.

在前几天的讲座中,我的教授表示,按照深度值对像素进行优先排序是计算效率低下的.然后他给我们简要解释了Z缓冲区以及它们如何测试像素的深度值,并将它们与缓冲区中像素的深度值进行比较.这有什么不同,然后'根据深度优先考虑像素'.

谢谢!

Dam*_*mon 6

确定片段属于哪个多边形是非常昂贵的,因为这需要为每个像素找到最接近的多边形(并且在像素着色期间具有可用的整个几何信息!).

根据它们的深度,对整个对象进行排序很容易,几乎是微不足道的,每个对象由许多三角形组成(多边形不超过一个或几个三角形).然而,这只是一个粗略的近似,附近的物体将重叠并产生人工制品,因此需要做一些事情来使像素完美.

这就是z缓冲区的用武之地.如果事实证明片段的计算深度大于已经存储在z缓冲区中的深度,这意味着片段"落后于某物",因此它被丢弃.否则,将片段写入颜色缓冲区,并将深度值写入z缓冲区.当然这意味着当20个三角形相互在后面时,相同的像素将被遮蔽19次是徒劳的.唉,运气不好.

现代图形硬件通过实际着色像素之前进行z测试来解决这个问题,根据三角形顶点的插值深度(如果计算每像素深度,这种优化显然是不可能的).

此外,它们采用保守的(有时是分层的,有时只是平铺的)优化,可以快速丢弃整组碎片.为此,z缓冲区保存一些额外的(未知)信息,例如渲染到64x64矩形区域的最大深度.利用该信息,它可以立即丢弃该屏幕区域中大于该区域的任何片段,而不实际查看存储的深度,并且它可以完全丢弃属于所有顶点具有更大深度的三角形的任何片段.因为,显然,没有办法可以看到任何一个.
这些是实现细节,而且非常特定于平台.

编辑:虽然这可能是显而易见的,但我不确定我是否明确表达了这一点:在进行z-culling的排序时,你会做与绘画算法完全相反的事情.你想要最先绘制的东西(粗略地,不必100%精确),所以不是在"最后一个人站立"的意义上确定一个像素的最终颜色,而是在"先到先得"的意义上服务,只有一个服务".