如何在顶点着色器中传递骨架权重?

时间:2014-06-17 04:43:30

标签: c++ opengl glsl collada skeletal-mesh

我制作了一个c ++ collada读卡器,但我使用opengl直接模式在4ms内绘制了一个3K动画网格。那太慢了。

所以我决定使用顶点着色器。在骨架中,每个顶点对每个骨骼都有一个权重(零或更多)。 对于具有40个骨骼的3K网格,整个对象有120000个权重。

唯一的问题是在GLSL中你无法声明大尺寸的统一数组。

例如,这将编译(顶点着色器):

///////////////////////////////////////////

uniform float weights [10] ;

void main (void)

{
 float test= weights[0];

  gl_Position = ftransform();

}

///但不是这个:

uniform float weights [120000] ;

void main (void)

{
  float test= weights[0];

  gl_Position = ftransform();

}

//////////////////////////////////////////

我在一些页面中看到我可以使用glVertexAttribPointer()来设置每个顶点的属性。如果我有1到4个骨骼(我可以使用vecX属性),这将完成,但GLSL(在我的情况下为1.20)不 加入属性数组。

1 个答案:

答案 0 :(得分:1)

正如keltar和Andon M. Coleman所提到的,你应该使用vec4属性。 在某些情况下,一些顶点有超过4个控制它们的骨骼。你可以做的只是考虑具有最大权重的骨骼。