我有一个模型,其中所有matdex
s (读取矩阵索引)都是 0、1 和 2 大致均匀分布。 bonebends[matdex[whichvertex]]
告诉我们应该在这个顶点上使用哪个矩阵。
初始化,C++:
std::vector< GLint > matdex; //initialized to 0, 1, or 2 for each vertex loaded, not shown for brevity
std::vector<glm::mat4> bonebends;
int frames=0;
bonebends.push_back(glm::mat4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)); //identity matrices initially
bonebends.push_back(glm::mat4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1));
bonebends.push_back(glm::mat4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)); // thats 3 bones
ver_ind = glGetAttribLocation(shaderID, "VER_IND");
boneID = glGetUniformLocation(shaderID, "BONE_MATRIX[0]");
glGenBuffers(1, &ind_buff);
glBindBuffer(GL_ARRAY_BUFFER, ind_buff);
glBufferData(GL_ARRAY_BUFFER, matdex.size() * sizeof(GLint), &matdex[0], GL_STATIC_DRAW);
定期在主循环中,c ++:
glEnableVertexAttribArray(3); //IND
glBindBuffer(GL_ARRAY_BUFFER, ind_buff);
glVertexAttribPointer( ver_ind, 1, GL_INT, GL_FALSE, 0, (void*)0 );
//ALSO LOOK HERE
glUniformMatrix4fv(boneID, 3 , GL_FALSE, &bonebends[0][0][0]);
frames+=1;
float cs=cos(3.14*2.0*(frames/100.0));
float sn=sin(3.14*2.0*(frames/100.0));
// LOOK HERE
bonebends[0]=glm::mat4(
cs , 0,-sn,0 ,
0 , 1, 0,0 ,
sn, 0, cs,0 ,
0 , 0, 0,1 );
在着色器中,glsl:
layout(location = 3) in int VER_IND;
uniform mat4 BONE_MATRIX[3];
在着色器的主要功能中,glsl:
gl_Position = BONE_MATRIX[VER_IND] * vec4(VER_POS,1); //VER_POS is the vertex's coordinates
我希望这会使所有重合matdex
为 0 的顶点旋转,其余的保持静止。相反,这会显示模型(否则会正确渲染)旋转,好像所有matdex
s 值都等于 0。一点点cout
告诉我它们不是。我不知道如何VER_IND
在着色器中调试。
我试过
- 使用
uint
而不是 的int
所有化身matdex
,这没有任何区别。 - 更改
BONE_MATRIX[VER_IND]
为BONE_MATRIX[0]
in shader,导致崩溃(???) - 以各种方式更改的第二个和第四个参数
glUniformMatrix4fv(boneID, 3 , GL_FALSE, &bonebends[0][0][0]);
没有帮助。 - 更改了
matdex
s 值,使得它们都不为 0,并且它仍然旋转,就好像着色器仅使用BONE_MATRIX[0]
. - 将下面的行更改
// LOOK HERE
为bonebends[1]=glm::mat4(
导致模型根本不旋转。
由此我得出结论,它只使用了第一个BONE_MATRIX[3]
,可能是因为着色器没有正确接收它。我可以发布整个内容,但它有点冗长。
我想知道我做错了什么以及如何从着色器中获取信息。