OpenGL - 使用索引数组而不是顶点数组关联纹理坐标数组?

时间:2011-10-17 18:51:03

标签: opengl indexing textures vertex

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

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

3 个答案:

答案 0 :(得分:11)

没有。不是一个简单的方法。

您可以使用buffer textures和着色器逻辑来实现它。但是没有简单的API可以按照您的方式进行属性索引。所有属性都是从同一个索引中采样的(使用instanced array divisors时除外),但这也无济于事。)

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

如果内存非常珍贵,你应该只 这样做。

答案 1 :(得分:6)

  

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

如果纹理坐标在共享顶点位置的图元上不同,那么整个顶点不会被共享!顶点是由

组成的单个向量
  • 位置
  • 正常
  • 纹理坐标
  • 其他属性

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

答案 2 :(得分:0)

你可以复制顶点,使1有1个纹理坐标&另一个有另一个。唯一的缺点就是你需要变形表面 - 你可以移动1个顶点而不是两个顶点。当然,有可能“命令性地” - 即当你只是通过一个循环&使用不同的纹理坐标 - 但这不是VBO&慢得多