2017-06-02 61 views
4

我正在處理頂點蒙皮着色器,出於某種原因,我的程序找不到統一的位置。無法找到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:如果我從場景中刪除所有其他網格,着色器會因訪問衝突而崩潰。只要其他對象正在渲染,目前沒有崩潰。
另一個編輯︰顯然訪問權重變量崩潰我的着色器。

+1

你應該檢查'glGetProgramiv'和'glGetActiveUniform'不會引發任何錯誤。 –

+0

我懷疑上面的海報已經說過你的程序未能編譯,這就是爲什麼你找到0個發現的制服。 – PaulHK

+0

我用glGetError()檢查過,沒有得到任何錯誤代碼。 如果程序編譯失敗並不意味着我不會輸出? – dragon

回答

0

我正在閱讀關於這裏找到的頂點蒙皮着色器的快速教程:khronos它似乎在使用GLSL的稍舊版本,他們如何提到MVP矩陣(模型視圖proj矩陣)或在你的情況PVM矩陣(proj查看模型矩陣)與vec4在你的情況下的總位置,並將其存回gl_Position,他們聲稱w可能並不總是值爲1爲了安全起見,他們建議這樣做相反,我會用你的代碼作爲他們的例子來解決這個可能的問題。

更改此:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * totalLocalPos; 

要這樣:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(totalLocalPos.xyz, 1.0); 

要看看這可以幫助你。我不知道這是否是你的問題的原因,但從你已經顯示你的着色器似乎沒有問題以外。

+0

感謝您的建議,我會改變這一點。目前我的問題是沒有加載制服,所以totalLocalPos無法正確計算.. – dragon

+0

@dragon我明白,但從我見過的東西我不知道爲什麼。你的制服似乎是「拼寫正確」。然而這條線可能是一個問題:'glUniformMatrix4fv(location,boneTransforms.size(),false,(GLfloat *)&boneTransforms);'...'glUniformMatrix4fv'期待位置,大小,布爾值和起始位置浮點數組。在我的一般着色器的源代碼中,我有:'glUniformMatrix4fv(it-> second.uLocation,1,false,&m4Matrix [0] [0]);''m4Matrix'是'glm :: mat4'對象,不是他們的一個矢量...... –

+0

@dragon ...(續)我不知道如何將'glm :: mat4'對象的'vector'傳遞給這個函數。然後你又把它重新放回到一個'(GLFloat *)'。你可能不得不索引到這個向量的第一個元素。 '(GLFloat *)&boneTransforms [0])'?雖然不確定。 –