我正在试验 3D 图形而不依赖任何 3D 库,例如 Java3D、OpenGL、DirectX 等。我有一个工作 Z 缓冲区(又名“深度缓冲区”),但我想不出绘制三角形的方法到那个缓冲区。(每个三角形都由 3D 中的三个点指定。)
任何人都可以提供在 Z 缓冲区中绘制三角形的伪代码吗?
您的问题的答案(按原样)涉及复杂的算法,完整的答案需要很多章节。我只会提供关键词和链接。
首先,您需要在 2D 空间中投影三角形的三个 3D 坐标(通常称为顶点,顶点为复数形式)。您可以从这篇关于3D 投影的文章开始。如果您不熟悉向量运算、矩阵变换、世界空间和视图/相机空间,请注意这可能需要很长时间才能获得结果。正交或透视投影,这是您的选择(尽管我想您希望透视投影)。我只提供了维基百科文章的链接(将来不太可能打破),因此它主要谈论其背后涉及的数学。但是有了这些关键词,你应该能够找到数千篇关于这个主题的好文章和源代码。
一旦你在视图/相机空间中转换(投影)了你的 3D 坐标,你的 X 和 Y 坐标就是 2D 三角形角/顶点坐标(假设你决定 X 从左到右,Y 从上到下,这个很常见)。然后您需要将这个三角形光栅化到您的缓冲区中(它基本上是一个 2D 位图)。这是一篇三角形光栅化文章,它将教您(使用类似 C 的源代码)执行此操作的流行技术(尽管这只是关于具有恒定颜色的光栅化,但原理保持不变)。
下一步是,您需要一个可变的深度值,而不是为所有像素编写一个恒定的颜色。是时候在投影顶点中使用这 3 个 Z 值了。对于每条水平线,您必须找到最左侧和最右侧像素的 Z 深度(使用从顶部顶点 Z 到底部顶点 Z 的线性插值,请小心,因为一侧可能有顶部、中间和底部顶点,所以在这里你必须从顶部到中间,然后从中间到底部进行插值。如果你像文章中描述的那样将你的三角形一分为二,则无需费心)。然后在它们之间写入所有像素,同时线性插入左 Z 和右 Z。