我目前正在尝试一些地形/高度图渲染。该地形的每个图块都使用 VBO 和 IBO 进行渲染。为了能够轻松绘制子图块,我使用 Morton 编码对索引进行了排序,此时我想到了一些关于原始组装的问题。
原始组装发生在顶点处理之后,但是
- GPU如何知道要处理哪些顶点?也许其中一些没有被索引。他们还得到处理吗?
- GPU如何知道必须以哪个顺序处理顶点?也许三角形使用 VBO 的第一个和最后一个顶点,所以原始组装阶段必须等到整个 VBO 被处理?
我目前正在尝试一些地形/高度图渲染。该地形的每个图块都使用 VBO 和 IBO 进行渲染。为了能够轻松绘制子图块,我使用 Morton 编码对索引进行了排序,此时我想到了一些关于原始组装的问题。
原始组装发生在顶点处理之后,但是
GPU如何知道要处理哪些顶点?也许其中一些没有被索引。他们还得到处理吗?
您的索引缓冲区和绘图调用中的顶点范围决定了处理哪些顶点,并定义了图元组装期间的使用顺序。不需要处理该顶点/索引范围内未覆盖的任何顶点。
GPU如何知道必须以哪个顺序处理顶点?也许三角形使用 VBO 的第一个和最后一个顶点,所以原始组装阶段必须等到整个 VBO 被处理?
当您到达原始装配时,处理的顶点顺序并不是特别重要;在顶点着色器级别没有顺序依赖性(据您所知,顶点可能已经全部并行处理)。您只需要知道顶点着色器的结果会附加到一个称为转换后缓存的特殊缓冲区中。
几何着色器(可编程原始程序集)将从转换后的缓存中获取其输入顶点,并将按特定顺序执行此操作。给定转换后缓存的传统 FIFO 实现,顺序决定缓存替换,基于条带的基元倾向于在基元组装期间最大化缓存命中率。转换后缓存中的缓存未命中会导致停顿,但仅限于不在缓存中的顶点 - 当您的顶点缓冲区中的每个顶点都被不必要地处理时,它不会停顿。
好消息是现在大多数建模软件都以缓存有效的顺序输出顶点,并且缓存比以往更大更智能,所以这不是你经常需要担心的事情。15 年前,顶点缓存是一个非常热门的话题,与您交谈过的每个人都会有自己的理论来说明什么是最有效的,现在这在很大程度上是浪费时间,而条带顺序可能就是您想要的。