【问题标题】:How can I specify multiple UV coordinates for same vertexes with VAOs/VBOs? [duplicate]如何使用 VAO/VBO 为相同顶点指定多个 UV 坐标? [复制]
【发布时间】:2016-07-31 16:25:20
【问题描述】:

我想使用 VAO/VBO 来回收相同的顶点并使用索引来加速渲染。

一切都很好,除了我的纹理模型使用 UV 坐标,并且对于相同的顶点(大约 >80%),我最终可能会根据我期望渲染的三角形有不同的 UV 坐标(事实上,我'我正在使用 md2 models 和纹理)。

这种渲染方式对于旧的 立即 模式来说很好而且很花哨;现在,解决这个问题并通过 VAO/VBO 进行渲染的最佳方法是什么?
我想到的是分解三角形并创建具有重复顶点的非常大的 VBO,以便我可以将正确的 UV 坐标链接到每个“相同”。

我不得不说我不喜欢这个...有什么想法吗?

附言。对于不了解格式的人:如果您想使用纹理映射,我相信您必须使用基于您正在渲染的三角形的自定义 UV 坐标。不然贴图颜色都乱了!

【问题讨论】:

  • "我最终可能会根据要渲染的三角形获得不同的 UV 坐标" 嗯...为什么?
  • @NicolBolas 这是 md2 规范(Quake 1/2)。在过去的美好时光(我说的是 2000 年初),相同的顶点具有不同的 UV 坐标,具体取决于渲染到哪个三角形 - 在某些情况下甚至是 4。正如您可以想象的那样,使用 VAO/VBO,您只能拥有一个 UV( AFAIK ofc :) 这在 compacted 形式中根本不起作用。查看我提供的链接以获取更多信息。
  • "同一顶点具有不同的 UV 坐标,具体取决于渲染到哪个三角形 - 在某些情况下甚至是 4。" 这并不能解释 为什么我> 你想要那个。这种能力有什么作用?谁在乎 MD2 格式是否允许?如果它没有任何用处,则不应使用它。
  • @NicolBolas 也许你不明白……如果我不指定多个不同的 UV 坐标,纹理映射对象就会全部混乱。我想要使用纹理映射,这就是纹理映射的定义方式!
  • 如果您将几何图形拆分为不同的数组,放置在一个数组中,将 uv1 放在一个 uv2 中,等等。您可以按照您想要的任何组合绑定您想要的(事件绑定子范围)。

标签: opengl vbo texture-mapping uv-mapping vao


【解决方案1】:

一切都很好,除了我的纹理模型使用 UV 坐标,并且对于相同的顶点(大约 >80%),我最终可能会根据我预期渲染的三角形有不同的 UV 坐标

那么它们是不同的顶点。顶点是其所有属性(位置、法线、颜色、纹理坐标等)的整体组合。如果这些值中只有一个不同,那么您正在处理一个完全不同的顶点。

【讨论】:

  • 好吧,你是说凭借不同的 UV 坐标,唯一的解决方案是在它们的 UV 不同时复制 xyz 值?没有其他方法可以通过索引压缩它吗?
  • @Emanuele:没错,你不能进一步压缩它。在 OpenGL 中,索引只能引用整个顶点(XYZ + UV),不能有单独的 XYZ 和 UV 索引。
  • @dietrichep 谢谢,请将其发布为答案,我会标记它。我无法相信我们仍然没有解决方案。现代发动机有什么用?他们是扩展还是使用了哪些其他技术?
  • @Emanuele:有一个解决方案。解决方案是复制 XYZ 数据。我不明白这如何“不是解决方案”。如果您打算为 UV 和 XYZ 数据使用单独的索引,您最终会得到更差的性能和额外的内存使用,因为额外的索引将占用比您在 10,000 个三角形模型上删除几百个顶点所节省的内存更多的内存.它也会彻底破坏缓存。如果你真的尝试,你实际上可以让它工作,但是......只需复制数据。它更容易、更快捷。
  • @Emanuele:关于 GPU 的矛盾之处(正如我最近在 AMD Radeon 技术集团主办的研讨会上了解到的)是,压缩数据会降低性能,您通常可以通过以下方式获得巨大的性能提升将数据扩展为 GPU 的本机数据类型(例如使用 32 位值作为通过采样器访问的内存)。
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
相关资源
最近更新 更多