我正在處理頂點蒙皮着色器,出於某種原因,我的程序找不到統一的位置。無法找到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。 我是如何嘗試設置這種特定製服的,或者是着色器代碼中的錯誤?我只是注意到,當我從場景中添加或刪除對象(使用不同的着色器)時,我的着色器的行爲發生了變化。我不知道該怎麼做。
EDIT3:如果我從場景中刪除所有其他網格,着色器會因訪問衝突而崩潰。只要其他對象正在渲染,目前沒有崩潰。
另一個編輯︰顯然訪問權重變量崩潰我的着色器。
你應該檢查'glGetProgramiv'和'glGetActiveUniform'不會引發任何錯誤。 –
我懷疑上面的海報已經說過你的程序未能編譯,這就是爲什麼你找到0個發現的制服。 – PaulHK
我用glGetError()檢查過,沒有得到任何錯誤代碼。 如果程序編譯失敗並不意味着我不會輸出? – dragon