2011-02-08 123 views
0

我創建了一個在Firefox中完美工作的着色器,但在Chrome中,片段和頂點着色器無法鏈接。它們編譯得很好,但在鏈接部分出現問題。我已經在代碼的休閒位本地化了這個問題:GLSL着色器和WebGL問題

 else if (uLightType[i] == 1) { //point light 

     NdotL = dot(n, normalize(lightDir[i])); 

     if (NdotL > 0.0) { 
      distance = length(lightDir[i]); 
      att = (1.0/(uLightAttenuation[i] * distance * distance)); 
      color += vec3(uLightColor[i] * NdotL * uLightIntensity[i] * att);     
     } 
} 

這段小小的代碼計算從點光源反射的漫反射顏色。它是更大的for循環的一部分。正如本文表明,它不會鏈接可言,但如果我從ATT計算,像這樣刪除uLightAttenuation:

att = (1.0/(distance * distance));  

它工作得很好。如果我用任何其他制服替換它,比如說,uLightIntensity,

att = (1.0/(uLightIntensity[i] * distance * distance)); 

它再次不起作用。如果我用一個簡單的常量值/浮點型變量替換它,奇怪的是它編譯。什麼是更奇怪的是,如果我從計算色刪除ATT,但保持一致,在它的當前位置,它運行得很好:

att = (1.0/(uLightAttenuation[i] * distance * distance)); 
color += vec3(uLightColor[i] * NdotL * uLightIntensity[i]); 

的統一是一個浮點值,即使它是一個類型轉換的問題應該在編譯時失敗,而不是鏈接。
這裏是完整的着色器,也許我錯過了代碼中的其他地方。

Fragment Shader
Vertex Shader

+0

請修改標題以反映被問到的問題。這個問題與統一的組件限制無關。 – 2011-03-06 16:47:17

回答

2

我設法使它的工作,事實證明,我有兩個問題。一個是在計算att時除以0。它可以讓我在漂浮物上劃分一些東西,所以我把uLightAttenuation和uLightIntensity結合成一個單一的vec2制服,然後這部分工作。其次,在計算顏色時,我必須單獨引用每個組件(顏色[0],顏色[1]等等),並且僅使用浮點變量而不使用矢量。之後,它在Chrome中正常工作。