2017-07-09 6 views
0

J'essaie d'échanger le frager-shader utilisé dans un programme. Les fragments-shaders ont tous les mêmes variables, juste des calculs différents. J'essaye de fournir des shaders alternatifs pour le matériel inférieur.webgl remplacer programme shader

Je finis par obtenir des sorties de couleur unique (au lieu d'une texture), est-ce que quelqu'un a une idée de ce que je pourrais faire de mal? Je sais que les shaders sont utilisés, en raison de la couleur qui change en conséquence.

 //if I don't do this: 
    //WebGL: INVALID_OPERATION: attachShader: shader attachment already has shader 
gl.detachShader(program, _.attachedFS); 
    //select a random shader, all using the same parameters 
attachedFS = fragmentShaders[~~(Math.qrand()*fragmentShaders.length)]; 
    //attach the new shader 
gl.attachShader(program, attachedFS); 
    //if I don't do this nothing happens 
gl.linkProgram(program); 
    //if I don't add this line: 
    //globject.js:313 WebGL: INVALID_OPERATION: uniform2f: 
    //location not for current program 
updateLocations(); 
+0

Vous devriez sans doute créer plusieurs programmes de shader, ne changeant pas les shaders sur un shader-programme existant. Créez des programmes de shader pour chaque combinaison de fonctionnalités que vous utilisez. – gman

Répondre

0

Je trouve la question, après avoir essayé tout le reste sans résultat. Cela explique aussi pourquoi je voyais un changement de shader, mais juste une couleur plate. Je ne mettais pas à jour certains des attributs.

1
  • Je suppose que vous avez appelé gl.compileShader (fragmentShader);
  • Avez-vous essayé de tester le code sur un autre navigateur et de voir si vous avez le même comportement? (il peut s'agir d'une implémentation standard spécifique)
  • Avez-vous essayé de supprimer le fragment shader (gl.deleteShader (attachedFS);) juste après l'avoir détaché. Le shader précédent peut toujours avoir un pointeur en mémoire.
  • Si cela ne vous laissez pas aller de l'avant, vous pourriez avoir à détacher les deux shaders (vertex & frag) et les remettre en place ou même de recréer le programme à partir de zéro
+0

Merci pour les suggestions! Je vais essayer et rapporter – marcgfx

+0

En supposant qu'il n'y a pas de bogue dans l'implémentation WebGL ou le pilote GPU, détacher le shader sera suffisant, pas besoin de le supprimer ni de recréer le programme entier à partir de zéro. A en juger par les commentaires de la source fournis par l'OP, je pencherais vers des pointeurs d'attributs et/ou des variations erronés. –

+0

Vous étiez tellement bon LJ ... – marcgfx