在3D图形中向深度缓冲区绘制三角形

4

我正在尝试使用不依赖于任何3D库,如Java3D、OpenGL、DirectX等的3D图形。我已经拥有了一个工作的Z缓冲区(又称“深度缓冲区”),但我无法想到一种在缓冲区中绘制三角形的方法。(每个三角形由3D中的三个点指定。)

请问是否可以提供绘制三角形到Z缓冲区的伪代码?


1
你尝试过在Google上搜索“画三角形的伪代码”吗?前几页可能包含你所需的内容。 - kolenda
3个回答

5
你的问题的答案涉及复杂的算法,完整的答案需要很多章节。我只提供关键词和链接。首先,你需要在2D空间中投影你的三角形的三个3D坐标(通常称为顶点)。你可以从这篇文章3D projection开始了解。如果你不熟悉向量运算、矩阵变换、世界空间和视图/相机空间,那么在获得结果之前可能需要长时间学习。正交或透视投影,由你选择(尽管我想你希望进行透视投影)。我只提供一个维基百科的链接(未来更不容易失效),因此它主要讲述了它背后的数学知识。但通过这些关键词,你应该能够找到成千上万篇有关该主题的好文章和源代码。

一旦你将三维坐标在视图/相机空间中进行转换(投影),你的X和Y坐标就是二维三角形的顶点坐标(假设你决定X从左到右,Y从上到下,这很常见)。然后你需要将这个三角形栅格化到缓冲区中(基本上是一个二维位图)。这里有一篇三角形栅格化文章,它会教你使用C语言源代码实现流行的技术来完成这个过程(尽管这仅涉及使用固定颜色的栅格化,但原理仍然相同)。

下一步是不再为所有像素编写常量颜色,而是需要一个可变的深度值。现在可以利用投影顶点中的三个Z值了。对于每条水平线,您需要找到最左和最右像素的Z深度(使用从顶部顶点Z到底部顶点Z的线性插值,只需小心,因为一侧可能有顶部,中间和底部顶点,所以这里必须从上面插值到中间,然后从中间插值到下面。如果您按照文章中描述的将三角形分成两部分,则无需担心)。然后编写它们之间的所有像素,同时线性插值您的左Z和右Z。

2
你能将某物体栅格化到z缓冲器中吗?问题是如何将三角形栅格化呢?在 Chris Hecker的技术文章中,他有一篇专门讲栅格化的。这是透视纹理映射系列的一部分,当人们不得不自己编写代码时,大家都会参考这个。它们非常详尽,但初读可能看起来很困难。

0

如果你想在三维空间中呈现某些东西,可以试着从搜索中去除"深度缓冲区"这个词。深度缓冲区是一个特定的缓冲区,不一定需要用于绘制基本的三维空间对象(但对于绘制相互作用的对象非常有用)。

无论如何,熟悉所使用系统的总体架构是一个好主意。例如,DirectX有文档以及其管线的摘要。通常情况下,与深度缓冲区的交互会根据您在调用图形库或包装器时设置的标志自动处理。虽然有理由仅写入深度缓冲区,但那些更先进的渲染技术通常是为了特定目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接