无法找到GLSL着色器统一位置

时间:2017-06-02 09:04:46

标签: c++ opengl glsl

我正在使用顶点蒙皮着色器,由于某种原因,我的程序无法找到统一的位置。

顶点着色器代码:

#version 330

const int MAX_JOINTS = 30;
const int MAX_WEIGHTS = 3;

in vec3 position;
in vec2 textureCoords;
in vec3 normal;
in ivec3 boneIndices;
in vec3 weights;

out vec4 fragPos;
out vec3 n;
out vec2 texCoords;
out vec4 mcolor;


uniform mat4 modelMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 normalMatrix;

uniform mat4[MAX_JOINTS] boneTransforms;


void main() {



vec4 totalLocalPos = vec4(0.0);
vec4 totalNormal = vec4(0.0);

for(int i = 0; i < 3; i++){
    mat4 boneTransform = boneTransforms[boneIndices[i]];
    vec4 posePosition = boneTransform * vec4(position, 1);
    totalLocalPos += posePosition * weights[i];

    vec4 worldNormal = boneTransform * vec4(normal, 1);
    totalNormal += worldNormal * weights[i];
}
texCoords = textureCoords;

fragPos = modelMatrix * vec4(position,1);

n = totalNormal.xyz;


gl_Position = projectionMatrix * viewMatrix * modelMatrix * totalLocalPos;
}

似乎没有正确设置boneTransforms制服;如果我用

查询活动制服
GLint uniforms;
    glGetProgramiv(shaderProgramID, GL_ACTIVE_UNIFORMS, &uniforms);
    for (int i = 0; i < uniforms; i++){
        int name_len = -1, num = -1;
        GLenum type = GL_ZERO;
        char name[100];
        glGetActiveUniform(shaderProgramID, GLuint(i), sizeof(name) - 1,
            &name_len, &num, &type, name);
        name[name_len] = 0;

    }

我总是零;但是,如果我只是把gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position,1)我得到了预期的结果(没有任何顶点蒙皮的正确渲染),所以尽管它告诉我他们没有,但其他变换似乎仍在工作存在?     编辑:这有时是这种情况,有时候我会将模型放在位置(0,0,0),但在其他方面正确地使用它。

我已经读过关于编译器剥离未使用/不活动的制服,但是如果我使用boneTransforms来计算totalLocalPos并将其用于gl_Positions,那么统一应该是活动的。

我尝试用

设置制服
vector<glm::mat4> boneTransforms = model.getBoneTransforms();
int location = glGetUniformLocation(shaderProgramID, "boneTransforms");
glUniformMatrix4fv(location, boneTransforms.size(), false, (GLfloat*)&boneTransforms);

位置始终为-1。 我试图设置这个特殊的制服是否有问题,或者是着色器代码中的错误?

EDIT2:我刚刚注意到当我在场景中添加或删除对象(使用不同的着色器)时,着色器的行为会发生变化。我不知道该怎么做。
编辑3:如果我从场景中删除所有其他网格,则着色器会因访问冲突而崩溃。只要渲染另一个对象,目前没有崩溃 另一个编辑:显然访问权重变量崩溃了我的着色器。

1 个答案:

答案 0 :(得分:0)

我正在阅读这篇关于顶点蒙皮着色器的快速教程:khronos它似乎使用了稍微旧版本的GLSL,但是他们确实提到了MVP矩阵的乘法(模型视图) proj矩阵)或在您的情况下PVM矩阵(项目视图模型矩阵),其中vec4用于您的总位置并将其存储回gl_Position并且他们声称w可能并不总是价值1所以为了安全起见,他们建议这样做,我会以你的代码为例来解决这个问题。

改变这个:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * totalLocalPos;

对此:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(totalLocalPos.xyz, 1.0);

看看这是否会帮助你。我不知道这是否是你问题的原因,但是你所展示的你的着色器似乎没有问题。