【问题标题】:OpenGL - Associate Texture Coordinates Array With Index Array Rather Than Vertex Array?OpenGL - 将纹理坐标数组与索引数组而不是顶点数组相关联?
【发布时间】:2011-12-09 12:50:19
【问题描述】:

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

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

【问题讨论】:

  • 如何检查歧义?具有不同 uv 坐标的顶点不同的顶点。
  • 不会出现歧义,因为索引数组中的不同位置会自动创建“不同”的顶点。这样就可以将整个 3D 顶点地图上传到顶点数组中,并使用空间中的这些离散点将任何东西绘制到其中,而无需更新实际的顶点数据。
  • 我一直在想:你需要一个和你的索引数组一样大的 uv 数组。否则,您的 uv 数组将与您的顶点数组一样长。大多数时候,我会假设顶点数组比索引数组短。但是是的,我会给你这样做的权利,但它似乎很可能不在 opengl 中。
  • 关键是,如果离散顶点经常被几个图元使用,那么只有一个更长的索引数组比拥有更长的索引和顶点数组要好得多。我真的希望这在 OpenGL 中是可能的。让我们拭目以待,看看大师们怎么说! =)
  • 但是如果你要使用这种方法,你需要一个更长的 uv-array 对吧?假设您的索引数组是 1,1,1,1,1,1,1,0。然后,您需要为每个条目单独设置 uv 坐标,而不仅仅是 0 和 1。

标签: opengl indexing textures vertex


【解决方案1】:

没有。不是以简单的方式。

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

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

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

【讨论】:

  • 非常不幸... :/ 但感谢您的回答!我希望这些缓冲区纹理是在 OpenGL 3.0 或更早版本中引入的!不然我就完蛋了! =)
  • @Fejwin:当缓冲纹理进入 OpenGL 时,我链接你的页面确切地告诉你。它在页面的右侧;我不知道你是怎么错过的。另外,请参阅我的编辑。
  • 是的,你是对的!我在写的时候还没有访问过那个链接。但更重要的是,我在哪里可以向建筑审查委员会提交改进建议?
  • 缓冲纹理方法似乎没有回报,谢谢您的澄清。
  • @Fejwin:“我在哪里可以向建筑审查委员会提交改进建议” 十多年来,人们一直在寻求这样的功能。它没有发生;最好接受这一点并继续前进。
【解决方案2】:

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

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

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

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

【讨论】:

  • 事实证明,这在 OpenGL 中是正确的。但从数学上讲,两个四边形可以很好地共享一个顶点。也许将来会提供该功能...
  • Fejwin:这是 OpenGL 和 GPU 的一般术语。而且它不太可能改变,因为它当前定义的方式是 GPU 可以最好地消化数据的方式。这都是关于顶点缓存和缓存局部性的。
  • 我明白了。因此,在实施方面,原因更为根本。很高兴知道,谢谢!
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多