顶点着色器(GLSL)奇怪的行为;不画画

时间:2014-02-11 11:11:02

标签: opengl animation glsl shader vertex-shader

我正在尝试使用我的顶点着色器实现骨架动画。我将顶点的索引和权重作为属性传递,在绘制时,我将每个骨骼的动画矩阵作为数组传递给我的着色器。

现在出于某种原因,当我将计算添加到我的着色器时,我的模型消失了。即使我在着色器中不使用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,也不会显示任何内容。

1 个答案:

答案 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)。

相关问题