我想为角色动画提供每个顶点权重,所以我想在我的顶点着色器中有如下所示的东西:
attribute float weights[25];
我如何从我的C& OpenGL程序?我在另一个question中看到,我可以获取数组属性的属性位置,然后将索引添加到该位置.有人可以给我一个例子,我的相当大的数组?
谢谢.
解决方法
现在几乎没有现在的硬件会赋予浮动权重[25];编译.虽然着色器可以具有属性数组,但每个数组索引表示一个新的属性索引.而在所有硬件上,当前存在的属性索引的最大数量是… 16.你需要25,这只是为了权重.
现在,您可以通过记住您可以使用vec4属性来轻松缓解这个问题.因此,您将每四个数组元素存储在单个属性中.你的数组将是属性vec4权重[7];这是可行的.当然,你的体重增长逻辑将不得不改变.
即使如此,您似乎并没有接受这些对您的顶点数据实际意义的影响.每个属性表示顶点数据的一个组件.渲染调用的每个顶点将具有相同的数据量;该数据的内容会有所不同,但数据量不大.
为了做你所建议的,网格中的每一个顶点都需要25个描述重量的浮点.即使这是存储为无符号字节的标准,这仍然是至少25个额外的字节值的数据.好多啊.特别考虑到绝大多数顶点,这些值中的大多数将为0.即使在最坏的情况下,您也许会看到可能会影响单个顶点的6-7个骨骼.
通常在顶点着色器中进行剥皮的方法是将影响单个顶点的骨数限制为四个.这样,你不使用一系列属性;你只需要使用一个vec4属性的权重.当然,你现在还需要说明哪种骨骼与哪种重量有关.所以你有一个第二个vec4属性,指定该权重的骨骼索引.
这取得了很好的平衡.您只占用2个额外的属性(可以是大小无符号字节).而绝大多数的顶点,你永远都不会注意到,因为大多数顶点只受1-3个骨头的影响.一些用法4,少用5.在这些情况下,您只需切断最低权重,并按比例重新计算其他权重.