镶嵌是不可预测的吗?

问题描述 投票:0回答:1

我正在 Vulkan 中开发 3D 渲染器/游戏引擎。我目前正在考虑使用 GPU 曲面细分使用高度图进行地形渲染(并且对曲面细分如何一般用于各种 LOD 解决方案感兴趣),并且我对曲面细分的工作原理有疑问,这使得它看起来完全不可预测,因此对我来说几乎无法使用,除非我误解了它是如何工作的。请注意,我正在使用 Vulkan,我的问题与 Vulkan 特别相关(基于 Vulkan 的规范),但我想这对于其他渲染 API 可能同样适用。

对于上下文 - 我现在正在考虑的具体情况是通过对四边形面片进行细分来生成地形网格,然后使用高度图(经典高度映射)偏移生成的顶点。

让我们考虑一个简单的四边形细分案例,其中我们将一个四边形细分为 2 个三角形。镶嵌可以通过两种不同的方式执行:

根据四边形分割成 2 个三角形的方式,生成的几何图形将完全不同(对于相同的点 v0..v3)。让我们考虑一下,点 v0 和 v3 在 3D 空间中比点 v1 和 v2 更高。如果我们像左图一样执行分割,得到的几何图形最终将成为一种向下塌陷的沟槽:

(https://i.stack.imgur.com/IG0wE.png)

如果我们像右边那样进行分割,我们会得到更多的帐篷形状,就像这样:

(https://i.stack.imgur.com/P3FT1.png)

对于这样一个简单的情况,在细分面片中生成三角形的方式对生成的几何图形有巨大的影响。如果我们将面片细分为许多三角形,则对于更复杂的网格,效果会更加显着。

因此,如果我们不知道面片将如何细分为三角形,那么在使用曲面细分时,我无法看到如何获得任何可预测的结果。根据细分的执行方式,生成的网格可能会呈现完全不同的形状。

如果可以保证细分的执行方式,那么这不会是问题。但根据Vulkan的规范(https://registry.khronos.org/vulkan/specs/1.3/pdf/vkspec.pdf):

Vulkan 规范,第 22.7 章 - 四边形曲面细分:

用于将 (u,v) 空间中的矩形域细分为各个三角形的算法是

依赖于实现。然而,生成的三角形集将完全覆盖

域,域的任何部分都不会被多个三角形覆盖。

根据该段落,以及 Vulkan 规范中专门用于曲面细分的整个部分,我的理解是,实际上并不能保证曲面细分补丁将如何划分,而且它实际上取决于实现,这意味着对于不同的 Vulkan/驱动程序版本,曲面细分可能会在不同的 GPU 上甚至在同一 GPU 上以不同的方式执行。

在使用高度贴图生成地形网格的情况下 - 我可以使用 GPU 曲面细分生成所有顶点,并从高度图中采样正确的高度,并且所有顶点都将具有正确的坐标,但地形的实际形状将根据不同的方式而有所不同镶嵌将顶点连接成三角形,这显然取决于实现......

如果我对上述内容的理解是正确的 - 如果生成的几何形状如此不可预测,那么如何使用曲面细分?有什么办法可以解决这个问题吗?还是我上面的理解不正确?

3d rendering vulkan terrain tesselation
1个回答
0
投票

对于这样一个简单的情况,在细分面片中生成三角形的方式对生成的几何图形有巨大的影响。如果我们将面片细分为许多三角形,则对于更复杂的网格,效果会更加显着。

实际上,对于更复杂的网格,效果不太很显着。

单个四边形的效果之所以“引人注目”,是因为……它只是一个四边形。它在屏幕上很大,而且这条线的走向对最终的几何图形有很大的影响。特别是,最重要的是参数的插值。当值在这些多边形的面上进行插值时,您获得的值将有很大不同。

如果您将其细分为 1000 个三角形,那么这些三角形的具体形成方式并不那么重要,因为每个三角形在结果图像中贡献的像素要少得多。镶嵌中的任何小差异都无关紧要,因为差异本身很小。

本质上,曲面细分旨在用于为网格添加小细节和平滑度。您不应该关心具体如何三角测量的细节;任何三角测量都应该“足够好”以满足您的需求。

如果三角测量的差异对您的用例很重要,那么您不应该使用曲面细分;你应该使用手工制作的 LOD 模型。

© www.soinside.com 2019 - 2024. All rights reserved.