1

我有以下问题(还没有代码):

我们有一个 4000 x 256 的数据集,分辨率为 16 位,我需要编写一个程序来显示这些数据。我想使用 DirectX 或 OpenGL 来执行此操作,但我不知道正确的方法是什么。

我是创建一个具有 4000 x 256 三角形且分辨率为 y 轴的缓冲区,还是继续创建一个四边形,然后使用镶嵌来处理数据?

我什么时候会在曲面细分上使用大顶点缓冲区,反之亦然?

4

1 回答 1

2

这真的取决于很多因素。你想渲染一张大约 100 万像素\顶点的地图。根据您的硬件,这可以通过最直接的技术来实现。

在我的脑海中,我可以想到 3 种技巧:

1)创建一个 4000x256 顶点的网格,并根据数据的高度图图像设置它们的高度。您在创建时设置一次数据。着色器将仅绘制静态缓冲区并将单个变换矩阵(世界\视图\投影)应用于所有顶点。

2) 创建一个高度为 0 的 4000x256 顶点的网格,并通过采样的高度图数据在顶点着色器内转换每个顶点的高度。

3) 与 2) 相同,只是您添加了一个细分阶段。

进行曲面细分的优点是您可以使用较小的顶点缓冲区,并且您可以在运行时动态曲面细分。这意味着您可以使网格的一部分更加细分,而部分网格的细分更少。例如,您可能只想在用户查看网格的位置进行更多细分。

顺便说一句,您不能将一个四边形细分为一百万个四边形,单个四边形可以细分多少是有限制的。但是你可以对它进行很多细分,无论如何你都会获得几个减少网格大小的因素。

如果您从未使用过 DirectX 或 OpenGL,我会选择 1。看看它是否足够快,只有在不够快的情况下才使用 2,最后使用 3。

您了解 3D 图形渲染背后的理论这一事实并不意味着您可以轻松学习 DirectX 或 OpenGL。它们很难理解和学习,因为它们作为 API 非常复杂。

如果您愿意,可以查看我使用 DirectX11 所做的一些细分:

http://pompidev.net/2012/09/25/tessellation-simplified/

http://pompidev.net/2012/09/29/tessellation-update/

于 2013-09-29T17:27:48.283 回答