将 3D 三角形绘制到深度缓冲区

Drawing a triangle in 3D to a depth buffer

我在不依赖任何 3D 库(例如 Java3D、OpenGL、DirectX 等)的情况下试验 3D 图形。我有一个可用的 Z 缓冲区(又名。"depth buffer"),但我想不出一种向该缓冲区绘制 三角形 的方法。 (每个三角形由 3D 中的三个点指定。)

谁能提供在 Z 缓冲区中绘制三角形的伪代码?

您问题的答案(原样)涉及复杂的算法,完整的答案需要很多章节。我只会提供关键词和 links.

首先,您需要将三角形的三个 3D 坐标(通常称为顶点,复数形式的顶点)投影到 2D space。可以从这篇关于3D projection的文章入手。如果您不熟悉矢量运算、矩阵变换、世界 space 和 view/camera space,请注意可能需要很长时间才能得到结果。正交或透视投影,这是您的选择(尽管我想您希望使用透视投影)。维基百科的文章我只提供了一个link(以后破解的可能性较小),所以主要讲背后涉及的数学。但是有了这些关键词,您应该能够找到数以千计关于该主题的带有源代码的好文章。

一旦您在 view/camera space 中转换(投影)了您的 3D 坐标,您的 X 和 Y 坐标就是二维三角形 corners/vertices 坐标(假设您决定 X 去从左到右,Y 从上到下,这很常见)。然后您需要将这个三角形光栅化到您的缓冲区(基本上是一个 2D 位图)。这是一篇 triangle rasterization 文章,它将教您(使用类似 C 的源代码)执行此操作的流行技术(虽然这只是关于具有恒定颜色的光栅化,但原理保持不变)。

下一步是,您需要一个可变的深度值,而不是为所有像素编写一个恒定的颜色。是时候在投影顶点中使用这 3 个 Z 值了。对于每条水平线,您必须找到最左侧和最右侧像素的 Z 深度(使用从顶部顶点 Z 到底部顶点 Z 的线性插值,请小心,因为一侧可能有顶部、中间和底部顶点,所以在这里你必须从上到中插值,然后从中到下插值。如果你像文章中描述的那样将三角形分成两部分,则无需费心)。然后在它们之间写入所有像素,也线性插值你的左 Z 和右 Z。

您是否已经能够将 某些内容 光栅化到 z 缓冲区?问题是如何光栅化三角形?在Chris Hecker's technical articles, he has one dedicated to rasterization。它是透视纹理贴图系列的一部分,当人们不得不自己编写时,每个人都会提到该贴图。它们非常详尽,但乍一看似乎令人望而生畏。

如果您一般希望以 3D space 形式呈现某些内容,请尝试从您的搜索中删除术语 "depth buffer"。深度缓冲区是一种特定的缓冲区,不一定非要用于绘制 3D 基本对象space(但对于绘制相互交互的对象很有用)。

无论如何,熟悉您所使用系统的整体架构是个好主意。例如,DirectX 有 documentation 及其管道的摘要。通常,与深度缓冲区的交互是根据您在调用图形库或包装程序时设置的标志自动处理的。专门写入深度缓冲区是有原因的,但这些是更高级的渲染技术,通常用于特定目的。