c – 无法找到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)我得到了预期的结果(没有任何顶点蒙皮的正确渲染),所以尽管它告诉我他们没有,但其他变换似乎仍在工作存在? 我已经读过关于编译器剥离未使用/不活动的制服,但如果我使用boneTransforms来计算totalLocalPos并将其用于gl_Positions,则统一应该是活动的. 我试着设置制服 vector<glm::mat4> boneTransforms = model.getBoneTransforms(); int location = glGetUniformLocation(shaderProgramID,"boneTransforms"); glUniformMatrix4fv(location,boneTransforms.size(),false,(GLfloat*)&boneTransforms); 位置始终为-1. EDIT2:我刚注意到当我从场景中添加或删除对象(使用不同的着色器)时,着色器的行为会发生变化.我不知道该怎么做. 解决方法
我正在阅读这篇关于顶点蒙皮着色器的快速教程:
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); 看看这是否有助于你.我不知道这是否是你问题的原因,但是从你所展示的你的着色器看起来除了那个之外似乎还可以. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |