原始装配性能

Primitive assembly performance

我目前正在试验一些 terrain/height-map 渲染。该地形的每个图块都使用 VBO 和 IBO 进行渲染。为了能够轻松绘制子图块,我使用莫顿编码对索引进行了排序,此时我想到了一些关于原始组装的问题。

原始组装发生在顶点处理之后,但是

  1. GPU 如何知道要处理哪些顶点?也许其中一些没有索引。他们还会得到处理吗?
  2. GPU 如何知道顶点的处理顺序?也许一个三角形使用 VBO 的第一个和最后一个顶点,所以原始组装阶段必须等到整个 VBO 被处理?

How does the GPU know which vertices to process? Maybe some of them are not indexed. Do they still get processed?

您的索引缓冲区和绘图调用中的顶点范围决定了处理哪些顶点,并且还定义了图元组装期间的使用顺序。不在vertices/indices范围内的任何顶点都不需要处理。

How does the GPU know in which order the vertices have to be processed? Maybe a triangle uses the first and the last vertex of the VBO, so primitive assembly stage would have to wait until the whole VBO is processed?

处理的顺序顶点在您到达原始装配时并不是特别重要;在顶点着色器级别没有顺序依赖性(据您所知,顶点可能已经全部并行处理)。您只需要知道顶点着色器的结果会附加到称为 post-变换缓存的特殊缓冲区。

几何着色器(可编程原始程序集)将从 post 变换缓存中获取其输入顶点,并且它将按特定顺序执行 that。给定 post-transform 缓存的传统 FIFO 实现,顺序决定缓存替换,基于条带的基元往往会在基元组装期间最大化缓存命中率。 post-transform 缓存中的缓存未命中会导致停顿,但仅适用于不在缓存中的顶点 - 当顶点缓冲区中的每个顶点都被不必要地处理时,它不会停顿。

好消息是现在大多数建模软件都以缓存有效的顺序输出顶点,而且缓存比以往任何时候都更大、更智能,所以这不是您经常需要担心的事情。 15 年前,顶点缓存是一个非常热门的话题,与您交谈的每个人都会对什么最有效有自己的理论,现在这在很大程度上是在浪费时间,而 strip-order 可能是您想要的。