找不到 GLSL 着色器统一位置

dra*_*gon 5 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;
}
Run Code Online (Sandbox Code Playgroud)

骨骼变换制服似乎没有正确设置;如果我查询现役制服

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;

    }
Run Code Online (Sandbox Code Playgroud)

我总是得到零;但是,如果我只是输入 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);
Run Code Online (Sandbox Code Playgroud)

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

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

Fra*_*ler 0

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

改变这个:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * totalLocalPos;
Run Code Online (Sandbox Code Playgroud)

对此:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(totalLocalPos.xyz, 1.0);
Run Code Online (Sandbox Code Playgroud)

看看这是否对您有帮助。我不知道这是否是您问题的原因,但从您所展示的情况来看,除此之外您的着色器似乎没问题。