【问题标题】:Drawing a triangle in 3D to a depth buffer将 3D 三角形绘制到深度缓冲区
【发布时间】:2015-09-08 01:46:25
【问题描述】:

我在不依赖任何 3D 库(例如 Java3D、OpenGL、DirectX 等)的情况下试验 3D 图形。我有一个有效的 Z 缓冲区(又名“深度缓冲区”),但我想不出办法向该缓冲区绘制一个三角形。 (每个三角形都由 3D 中的三个点指定。)

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

【问题讨论】:

  • 您是否尝试过在 Google 上搜索“用于绘制三角形的伪代码”?很少有首页可能包含您需要的内容。

标签: 3d depth-buffer


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您是否已经能够将 某物 光栅化到 z 缓冲区?问题是如何栅格化三角形?在Chris Hecker's technical articles,他有一个专用于rasterization。它是透视纹理映射系列的一部分,当人们不得不自己编写时,每个人都会提到它。它们非常透彻,但乍一看可能会让人望而生畏。

    【讨论】:

      【解决方案3】:

      如果您希望在一般的 3D 空间中渲染某些东西,请尝试从搜索中删除术语“深度缓冲区”。深度缓冲区是一种特定的缓冲区,不一定非要用于在 3D 空间中绘制基本对象(但对于绘制相互交互的对象很有用)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-18
        • 2021-09-02
        • 1970-01-01
        • 2020-06-20
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 2020-12-15
        相关资源
        最近更新 更多