我是OpenGL的新手,我似乎遇到了一些困难.我在GLSL中编写了一个简单的着色器,它应该通过给定的联合矩阵变换顶点,允许简单的骨架动画.每个顶点最多有两个骨骼影响(存储为Vec2的x和y分量),索引和与变换矩阵数组相关联的相应权重,并在我的着色器中指定为"属性变量",然后设置使用"glVertexAttribPointer"函数.
这就是问题出现的地方......我已经设法正确设置了"统一变量"矩阵数组,当我在着色器中检查这些值时,所有这些值都被正确导入并且它们包含正确的数据.但是,当我尝试设置关节Indices变量时,顶点乘以任意变换矩阵!它们跳到空间中看似随机的位置(每次都是不同的)我假设索引设置不正确并且我的着色器正在读取超过我的关节矩阵数组的末尾到下面的内存中.我不确定为什么,因为在阅读了关于这个主题的所有信息之后,我很惊讶地看到他们的例子中的相同(如果不是非常相似)代码,它似乎对他们有用.
我已经尝试解决这个问题很长一段时间了,它真的开始让我神经紧张......我知道矩阵是正确的,当我手动将着色器中的索引值更改为任意整数时,它会读取正确的矩阵值和它应该的方式工作,通过该矩阵转换所有顶点,但是当我尝试使用我写的代码来设置属性变量时,它似乎不起作用.
我用来设置变量的代码如下......
// this works properly...
GLuint boneMatLoc = glGetUniformLocation([[[obj material] shader] programID], "boneMatrices");
glUniformMatrix4fv( boneMatLoc, matCount, GL_TRUE, currentBoneMatrices );
GLfloat testBoneIndices[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
// this however, does not...
GLuint boneIndexLoc = glGetAttribLocation([[[obj material] shader] programID], "boneIndices");
glEnableVertexAttribArray( boneIndexLoc );
glVertexAttribPointer( boneIndexLoc, 2, GL_FLOAT, GL_FALSE, 0, testBoneIndices );
Run Code Online (Sandbox Code Playgroud)
我的顶点着色器看起来像这样......
// this shader is supposed to transform the bones by a skeleton, a maximum of two
// bones per vertex with varying …Run Code Online (Sandbox Code Playgroud)