2011-02-08 126 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中正常工作。