2017-07-09 15 views
0

私はプログラムで使用されているフレグシェーダシェーダを交換しようとしています。フラグメントシェーダはすべて同じ変数を持ち、異なる計算だけです。私は下位レベルのハードウェアに代替シェーダを提供しようとしています。webglプログラムシェーダの置き換え

私は最終的に(テクスチャの代わりに)単一のカラー出力を得ることになりますが、誰かが私が間違っていてもいいアイデアはありますか?シェーダが使用されているのは、それに応じて色が変化するためです。

 //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

既存のシェーダープログラムのシェーダーを変更しないで、おそらく複数のシェーダープログラムを作成する必要があります。使用する機能の組み合わせごとにシェイダープログラムを作成します。 – gman

答えて

0

両方シェーダ(頂点& FRAG)を取り外し、それらを再接続、あるいはゼロからプログラムを再作成する必要があります結果なし。なぜシェーダの変更を見ていたのですが、フラットな色になったのかを説明します。私はいくつかの属性を更新していませんでした。

1
  • 私はあなたがgl.compileShader(fragmentShader)と呼ばれていると仮定しています。
  • 異なるブラウザでコードをテストしようとしましたが、同じ動作をするかどうかを確認しましたか?
  • フラグメントシェーダ(gl.deleteShader(添付ファイル);)をデタッチした直後に削除しようとしましたか? 以前のシェーダにはメモリ内にポインタが残っている可能性があります。これはあなたが前方に移動させていない場合は
  • 、あなたは他のすべてについて試した後、私は、問題を発見した
+0

提案していただきありがとうございます! – marcgfx

+0

WebGL実装やGPUドライバのバグがないと仮定すると、シェーダは十分なものになります。削除する必要はなく、プログラム全体を最初から再作成する必要はありません。 OPによって提供されたソースのコメントで判断すると、間違ってセットアップ属性ポインタおよび/または変化に傾くだろう。 –

+0

あなたは本当にLJだった... – marcgfx