21

每当我们使用索引数组通过 glDraw*Elements* 渲染纹理多边形时,我们可以提供一个顶点数组和一个纹理坐标数组。那么索引数组中的每一个索引都是指顶点数组中某个位置的一个顶点和纹理数组中同一位置对应的纹理坐标。现在,例如,如果几个单独的图元(如 QUADS)共享一个顶点,但该顶点需要不同的纹理坐标,则我们必须在数组中复制该顶点的次数,因为我们有不同的纹理坐标。因此,如果纹理坐标数组可以与索引数组中的位置关联起来会方便得多。这样就不需要重复顶点来将一个特定的顶点与不同的纹理坐标相关联。

这可能吗?如果是,使用什么语法?

4

3 回答 3

11

不,不是以简单的方式。

您可以使用缓冲区纹理和着色器逻辑来实现它。但是没有简单的 API 可以按照您想要的方式制作属性索引。所有属性都从同一个索引中采样(除非使用实例化数组除数,但这也无济于事)。

请注意,这样做将是内存/性能的权衡。使用缓冲区纹理访问顶点数据将占用更少的内存,但与仅使用常规属性相比,它会明显更慢且限制更多。您将无法访问规范化的顶点属性,因此压缩顶点数据将需要显式着色器逻辑。并且访问缓冲区纹理总体上更慢。

只有在内存非常宝贵的情况下,您才应该这样做。

于 2011-10-17T19:07:40.050 回答
6

现在,例如,如果几个单独的图元(如 QUADS)共享一个顶点,但该顶点需要不同的纹理坐标,则我们必须在数组中复制该顶点的次数,因为我们有不同的纹理坐标。

如果纹理坐标在共享顶点位置的图元上不同,则整个顶点不共享!顶点是由以下组成的单个向量

  • 位置
  • 普通的
  • 纹理坐标
  • 其他属性

你改变其中任何一个,你最终会得到一个不同的顶点。因为顶点共享不是你想象的那样。

于 2011-10-17T19:40:43.763 回答
0

您可以复制顶点,以便 1 具有 1 个纹理坐标,而另一个具有另一个。唯一的缺点是如果您需要变形表面 - 您可以移动 1 个顶点,但不能同时移动两者。当然可以“势在必行”地做到这一点 - 即当你只是通过一个循环运行并使用不同的纹理坐标时 - 但这不会是 VBO 并且要慢得多

于 2016-01-15T20:17:28.630 回答