骨骼动画ussing ASSIMP和GLSL:骨骼均匀阵列大小
Skeletal Animation ussing ASSIMP and GLSL: bone uniform array size
我正在开发ASSIMP骨骼动画加载程序和渲染器,现在所有数据都已在当前时间段正确加载和插值。然而,仍然有一部分不能正常工作,那就是顶点着色器阶段。
通过VBO我传入两个vec4
,其中包含骨骼ID和每个顶点的权重(每个顶点最多4骨骼/权重),并且顶点着色器具有通过骨骼ID索引的100骨变换(按帧预计算)的矩阵阵列。
但是,骨骼统一似乎不包含适当的变换。出于调试目的,我用权重值和骨骼ID值为模型着色,它们包含一种颜色(因此也包含有效值)。然而,当我通过骨骼变换变换顶点并用结果给模型上色时,整个模型都是黑色的,这意味着变换矩阵都是0.0
。所以它们没有正确初始化。
我认为问题在于将矩阵传递到统一数组,或者可能是允许的统一的最大大小(我还尝试将统一矩阵的数量设置为32(当前模型上的骨骼数量),但没有效果)?
在将信息传递给着色器之前,变换矩阵确实是有效矩阵(而不是单位/空矩阵),因此故障可能出现在GLSL着色器或传递制服中。
以下代码来自顶点着色器:
#version 330
layout (location = 0) in vec3 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec3 tangent;
layout(location = 3) in vec3 color;
layout(location = 4) in vec2 texCoord;
layout(location = 5) in ivec4 boneIDs;
layout(location = 6) in vec4 weights;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform mat4 bones[100];
out vec2 TexCoord;
out vec4 colorz;
void main()
{
vec4 newPos = vec4(position, 1.0);
colorz = vec4(0.0, 1.0, 0.0, 1.0);
if (weights != vec4(0.0, 0.0, 0.0, 0.0))
{
mat4 boneTransform = bones[boneIDs[0]] * weights[0];
boneTransform += bones[boneIDs[1]] * weights[1];
boneTransform += bones[boneIDs[2]] * weights[2];
boneTransform += bones[boneIDs[3]] * weights[3];
// newPos = boneTransform * vec4(position, 1.0);
vec4 test = vec4(1.0);
colorz = boneTransform * test;
// newPos = boneTransform * newPos;
}
TexCoord = texCoord;
gl_Position = projection * view * model * newPos;
}
以下代码片段将矩阵数据传递给GLSL着色器:
// Sets bone transformation matrices
void Shader::SetBoneMatrix(GLint index, aiMatrix4x4 matrix)
{
glm::mat4 mat = glm::transpose(glm::make_mat4(&matrix.a1));
glUniformMatrix3fv(boneLocations[index], 1, GL_FALSE, glm::value_ptr(mat));
}
还有获取骨骼阵列所有统一位置的代码:
for(unsigned int i = 0; i < 100; i++)
{
string name = "bones[";
string number;
stringstream ss;
ss << i;
ss >> number;
name += number;
name += ']';
boneLocations[i] = glGetUniformLocation(this->program, name.c_str());
}
Oké,通过glslDevil,我在通过glUniformMatrix
将骨骼矩阵设置为着色器时遇到了连续的GL_INVALID_OPERATION
错误。问题的根源实际上是在程序将信息传递给着色器的阶段。
实际上,这是一个非常愚蠢的错误,因为我使用的是glUniformMatrix3f
而不是glUniformMatrix4f
。改变这一点确实解决了问题,动画现在运行得很完美。
相关文章:
- OpenMP阵列性能较差
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 当我的阵列太大时出现分段错误
- 位阵列上的快速AND运算
- 阵列必须使用大括号封闭的初始器进行初始化
- 没有从阵列<float>到阵列<int>的可行转换
- Opengl 3.1 GLSL 140 在 C++ 年输出白色在片段着色器中
- C++动态安全 2D 交错阵列
- 将平面阵列重塑为复杂的特征类型
- 如何使用英特尔 PIN 捕获阵列的所有负载?
- 为什么我能够为阵列分配比计算机实际拥有的内存更多的内存
- 库特<<恩德尔;不适用于打印 2D 阵列
- 数组类 阵列的打印输出
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- 在细胞中产生噪声 - CPP 和 GLSL
- 从较小的阵列到较大的阵列的元素级转换
- 仅在大型阵列上出现合并排序分段错误
- 将数据从STD ::向量传递到GLSL中的均匀阵列
- 骨骼动画ussing ASSIMP和GLSL:骨骼均匀阵列大小