2011-02-08 5 views
0

J'ai créé un shader qui fonctionne parfaitement dans Firefox, mais dans Chrome le fragment et le vertex shader ne peuvent pas être liés. Ils compilent très bien, mais à la partie de liaison quelque chose ne va pas. Je localisé le problème au bit pour avoir de code:Shaders GLSL et problème 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);     
     } 
} 

Ce petit morceau de code calcule la couleur diffuse réfléchie à partir d'un point de lumière. Cela fait partie d'une plus grande boucle. Comme il est montré ici, il ne sera pas un lien du tout, mais si je retire uLightAttenuation de calcul att, comme ceci:

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

cela fonctionne très bien. Si je le remplace par un autre uniforme, disons uLightIntensity,

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

encore une fois cela ne fonctionnera pas. Si je le remplace par un simple variabile constant value/float, il compile assez étrangement. Et ce qui est encore plus étrange est, si je retire att de calculer la couleur, mais garde l'uniforme à sa position actuelle, il fonctionne très bien:

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

L'uniforme est une valeur flottante, et même si elle était un problème avec le moulage de type, il devrait échouer à la compilation, pas de liaison.
Voici les shaders complets, peut-être que j'ai manqué quelque chose ailleurs dans le code.

Fragment Shader
Vertex Shader

+0

Veuillez modifier le titre pour refléter la question posée. Cette question n'a rien à voir avec des limites de composants uniformes. –

Répondre

2

J'ai réussi à le faire fonctionner, il se trouve que j'avais 2 problèmes. On est avec la division par 0 lors du calcul att. Cela me permettrait de diviser quelque chose sur un uniforme flottant, donc j'ai combiné uLightAttenuation et uLightIntensity en un seul uniforme vec2, après que cette partie a fonctionné. Deuxièmement, lors du calcul de la couleur, je devais référencer chaque composant individuellement (couleur [0], couleur [1] etc ...) et travailler uniquement avec des variables flottantes et non vectorielles. Après cela, il a fonctionné correctement en chrome.

Questions connexes