处理具有多种顶点格式的 GLTF 节点

Handling GLTF nodes with multiple vertex formats

我正在使用 Vulkan 和 C++ 在爱好渲染器中实现对 GLTF 2.0 的支持。 https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html

最初,我实现了对一些测试 GLTF 文件的基本支持。然而,在仔细阅读规范后,我发现了一些难以处理的细节。

根据规范,一个节点由一个或多个网格组成,一个网格由一个或多个基元组成。在同一个Node中,每个Primitive可以使用不同的顶点格式,包括:

在我看来,这会产生一种情况,为了制作一个可以处理一般 GLTF 模型的强大渲染器,需要创建一堆着色器排列图元可能使用的各种顶点格式。到目前为止,我想到的关于如何避免着色器排列爆炸的唯一想法如下:

我尝试了上面的变体,加载模型非常慢。此外,这似乎是一种脆弱的方法。

还有什么方法可以减轻对单个节点进行大量管道更改的潜在需求? and/or 需要为所有不同的情况定义许多着色器?

每个图元都旨在成为一个单独的绘制调用,可能带有一个单独的着色器程序。

请注意,图元的不同之处不仅仅在于顶点属性。图元包含自己的 material 引用,因此它可以与同一网格拥有的其他图元完全分开 material。

基元的存在是为了提供一种在单个网格中包含多个 material 的机制,但它们需要单独的绘制调用和单独的着色器来实现。这个在Meshes Overview section.

里面有讲到