我正在尝试使用我的顶点着色器实现骨架动画。我将顶点的索引和权重作为属性传递,在绘制时,我将每个骨骼的动画矩阵作为数组传递给我的着色器。
现在出于某种原因,当我将计算添加到我的着色器时,我的模型消失了。即使我在着色器中不使用ANYWHERE的计算结果,也会导致着色器消失。没有错误。
我做了很多测试,发现只有当我尝试访问animationMatrices时才会发生这种情况[60]。据我所见,任何指数低于60的作品。这很奇怪,因为我的模型中只有53个骨骼。
为了说明,以下代码不会绘制任何内容:
#version 330
uniform vec3 light = vec3(10,2,8);
uniform mat4 modelmatrix;
uniform mat4[64] animationMatrices;
attribute vec3 a_tangent;
attribute vec4 a_boneIndices;
attribute vec4 a_boneWeights;
out vec3 lightVec;
out vec3 eyeVec;
out vec4 test;
void main()
{
vec4 newVert = (animationMatrices[60] * gl_Vertex) * a_boneWeights.x + gl_Vertex;
vec4 vertPos = modelmatrix * gl_Vertex;
gl_Position = gl_ModelViewProjectionMatrix * vertPos;
eyeVec = normalize(-vec3(gl_ModelViewMatrix*vertPos));
gl_TexCoord[0] = gl_MultiTexCoord0;
//some more stuff here but not important
}
如果我注释掉newVert行,我的模型会出现。
因此,如果我删除或注释掉这一行,着色器工作正常(或将索引更改为低于60的值):
vec4 newVert = (animationMatrices[60] * gl_Vertex) * a_boneWeights.x + gl_Vertex;
一旦我重新引入此行,即使在着色器中的任何地方都没有使用newVert,也不会显示任何内容。
答案 0 :(得分:0)
假设modelmatrix
不是单位矩阵,则表示您正在错误地转换顶点。
vec4 vertPos = modelmatrix * gl_Vertex;
gl_Position = gl_ModelViewProjectionMatrix * vertPos; // vertPos is in world-space!!!
您需要停止这样做,或隔离您的视图和投影矩阵。
1. vertPos = gl_Vertex;
2. gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
3. gl_Position = projectionmatrix * viewmatrix * vertPos;
eyeVec
的东西:eyeVec = normalize(-vec3(gl_ModelViewMatrix*vertPos));
您可能根本不应该触及vertPos
,此着色器正常工作的唯一方法是vertPos
= gl_Vertex
(可能的解决方案#1)。