渲染时如何按正确顺序绘制形状?

How to draw shapes in the proper order when rendering?

我正在尝试编写 3d 图形引擎,但我在按正确顺序绘制形状时遇到了一些问题。

当我将三角形的点转换为 window space,即除了 x 和 y 之外直接与屏幕上的位置相关的二维 space每个点的位置,我还为它们分配了一个深度变量,该变量存储该点在 3d space.

中与观察者的距离

目前,我正在渲染的唯一形状是三角形。我当前的渲染顺序算法 根据三角形的 3 个点的平均深度对三角形进行排序。 当我开始使用它时我就知道它并不完美,但我想要一个用于测试的占位符。

出于测试目的,我构建了一个顶部敞开的方形盒子,每边颜色不同,由 2 个三角形组成,如下所示:

从上图可以看出,我使用的算法大部分时间都有效。但是,在某些角度和位置,三角形会以错误的顺序呈现,如下所示:

如您所见,框底部的青色三角形之一绘制在侧面的黄色三角形之一之前。显然,按点的平均深度对三角形进行排序并不令人满意。

是否有更好的排序形状的方法,以便它们以正确的顺序呈现?

以正确的深度顺序绘制 3D 的标准方法是使用 Z-buffer

基本上,想法是对于您在颜色缓冲区中设置的每个像素,您还在 z(深度..)缓冲区中设置它的插值深度。每当您要绘制下一个像素时,您首先检查该 z 缓冲区以验证新像素是否在已绘制像素的前面。

除此之外,您还可以添加各种优化,例如对三角形进行排序,以最大程度地减少实际绘制颜色缓冲区的次数。

另一方面,为了正确处理透明度或其他 "advanced" 效果,有时需要做完全相反的事情。