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

Fej*_*win 18 opengl indexing textures vertex

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

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

Nic*_*las 11

不,不是一个简单的方法.

您可以使用缓冲区纹理和着色器逻辑来实现它.但是没有简单的API可以按照您的方式进行属性索引.所有属性都从相同的索引中采样(除非使用了实例化数组除数,但这对您也没有帮助).

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

只有在内存非常宝贵时才应该这样做.


dat*_*olf 6

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

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

  • 位置
  • 正常
  • 纹理坐标
  • 其他属性

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