【问题标题】:How to use different indices for tex coords array and vertex array using glDrawElements如何使用 glDrawElements 对 tex 坐标数组和顶点数组使用不同的索引
【发布时间】:2011-08-06 13:22:11
【问题描述】:

我一直在尝试在基于图块的 2D OpenGL 游戏中使用 glDrawElements。但是,当我绘制瓷砖时,同一顶点的不同面的 tex 坐标可能会有所不同:例如,这里的 texcoords 对于公共顶点处的 2 个四边形会有所不同:

___|
___|___
   |___
   |___

问题是glDrawElements 只需要一个索引数组,所以看起来我每个顶点只能使用一个 tex 坐标。有什么办法可以克服这个限制吗?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    简答:你不知道。相反,您将顶点分解为唯一的顶点,以便您可以为每个属性拥有一个索引列表。如果您有多个索引列表,则需要遍历该索引列表,为任何不重复的索引集复制属性数据(位置、纹理坐标等)。

    长答案:不应该

    借助现代硬件功能技术(OpenGL 3.x 中的buffer textures 和/或 4.x 中的shader image load/store),您可以完全颠覆属性管道并从缓冲区对象中任意加载数据。但是,您不应期望这与以正确的方式做事几乎一样快。

    除非你有一些明确的需要来这样做(我的意思不仅仅是你的模型格式提供这样的数据),否则你最好正确地做事。请记住:这是每个在渲染中使用数组的图形应用程序在过去十五年中所做的事情。您不会错过任何特殊的硬件功能或任何东西。

    【讨论】:

    • 所以你的意思是不要打扰使用 glDrawElements 而是使用每个面重复顶点一次的传统方法?
    • 没有。您使所有属性都使用 single 索引数组。这将涉及复制一些顶点数据。
    • 您会认为所有重复的顶点数据都会非常浪费内存。对于我正在加载的模型,我有 2084 个独特的顶点位置和 4019 个独特的顶点法线。 (OpenGL 考虑的)唯一顶点的数量最终为 12492,这意味着使用单个索引存储顶点数据需要大约 4 倍的内存。这听起来像是一个巨大的相对增加,但实际上顶点数据大小仅从 69KB 增加到 285KB。我怀疑这就是 API 从来不支持多个顶点属性数组索引的原因。
    猜你喜欢
    • 2011-09-24
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2011-12-09
    • 1970-01-01
    相关资源
    最近更新 更多