【发布时间】:2017-11-03 15:03:59
【问题描述】:
我正在开发一个顶点蒙皮着色器,由于某种原因我的程序找不到统一的位置。
顶点着色器代码:
#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:我刚刚注意到,当我从场景中添加或删除对象(使用不同的着色器)时,我的着色器的行为发生了变化。我不知道该怎么做。
EDIT3:如果我从场景中删除所有其他网格,着色器会因访问冲突而崩溃。只要正在渲染另一个对象,当前就没有崩溃。
另一个编辑:显然访问 weights 变量会使我的着色器崩溃。
【问题讨论】:
-
您应该检查
glGetProgramiv和glGetActiveUniform不会引发任何错误。 -
我怀疑正如上面的海报所说,你的程序编译失败,这就是为什么你得到 0 个找到的制服。
-
我检查了 glGetError() 并没有收到任何错误代码。如果程序无法编译,那是否意味着我根本不会输出?
-
glGetError不会报告着色器编译失败 -
再一次,如果着色器没有编译它根本不会渲染网格,对吧?它确实被渲染了,只是不正确。编辑:显然我确实遇到了着色器错误,但为什么在这种情况下我什么都看不到?