我正在使用顶点蒙皮着色器,由于某种原因,我的程序无法找到统一的位置。
顶点着色器代码:
#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:如果我从场景中删除所有其他网格,则着色器会因访问冲突而崩溃。只要渲染另一个对象,目前没有崩溃
另一个编辑:显然访问权重变量崩溃了我的着色器。
答案 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);
看看这是否会帮助你。我不知道这是否是你问题的原因,但是你所展示的你的着色器似乎没有问题。