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

时间:2015-06-22 14:39:57

标签: 3d depth-buffer

我正在尝试3D图形而不依赖任何3D库,例如Java3D,OpenGL,DirectX等。我有一个工作的Z缓冲区(又名。"深度缓冲区"),但我不能想一种向该缓冲区绘制三角形的方法。 (每个三角形由3D中的三个点指定。)

任何人都可以提供伪代码来绘制Z缓冲区的三角形吗?

3 个答案:

答案 0 :(得分:3)

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

首先,您需要在2D空间中投影三角形的三个3D坐标(通常称为顶点,复数形式的顶点)。您可以从这篇关于3D projection的文章开始。如果您不熟悉矢量运算,矩阵变换,世界空间和视图/相机空间,请注意在获得结果之前可能需要很长时间。正交或透视投影,它是你的选择(虽然我想你希望透视投影)。我只提供了维基百科文章的链接(未来破解的可能性较小),因此主要讨论其背后的数学问题。但是有了这些关键词,你应该能够通过源代码找到成千上万篇关于这个主题的好文章。

在视图/相机空间中转换(投影)3D坐标后,您的X和Y坐标是2D三角形/顶点坐标(让我们假设您确定X从左到右,Y从上到下,这很常见)。然后,您需要将此三角形栅格化到缓冲区(基本上是2D位图)。这里有一篇triangle rasterization文章,它将教你(使用类似C的源代码)流行技术(尽管这只是关于使用恒定颜色的光栅化,原理保持不变)。

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

答案 1 :(得分:2)

你能够将某些东西光栅化到z缓冲区了吗?问题是如何栅格化三角形?在Chris Hecker's technical articles中,他有一个致力于rasterization的人。它是透视纹理映射系列的一部分,当人们不得不自己编写时,每个人都会提到它。它们非常彻底,但最初可能看起来令人生畏。

答案 2 :(得分:0)

如果您想要在3D空间中渲染某些内容,请尝试删除术语"深度缓冲区"从你的搜索。深度缓冲区是一个特定的缓冲区,它不一定必须用于在3D空间中绘制基本对象(但对于绘制彼此交互的对象非常有用)。

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