0

WebGL に問題があります。

アプリケーションに新しいシェーダーを追加するとuniform4f: location not for current program、2D 描画関数で画像描画シェーダーのユニフォームを設定すると、フレームごとにエラー (Chrome コンソールに表示) が発生することがあります。

以前に同じエラーが数回発生しましたが、未知のランダムな操作を行うことでエラーを修正することはそれほど難しくありませんでした. しかし、スクリーン ワーピング シェーダを追加したときに、できる限りのことを試しましたがglFinish(非同期化が原因でエラーが発生したと思います)、何も役に立ちませんでした。

コンソール描画機能で2D イメージシェーダの vec4 ユニフォームを設定しようとすると、エラーが発生します。コンソール描画機能とメニュー描画機能を入れ替えるとメニューが描画されません。

これが私のプログラム作成と切り替え機能のソースコードです: http://pastebin.com/zDEWWgKV

次のリストから何かを実行すると、エラーが停止します。

  • メニューを閉じます。
  • マップをロードし、3D レンダリングを実行します (プログラムの切り替えが少なくとも 4 回発生します)。
  • 画面のワープを有効にします (プログラムの切り替えが 1 回発生します)。

エラーの原因と修正方法を教えてください。

4

2 に答える 2

2

これは、使用している場所が別のプログラムからのものであることを意味します。同じシェーダーを使用している場合でも、プログラムは場所を共有しません。例:

// make a vertex and a fragment shader
var vs = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vs, vSource);
gl.compileShader(vs);

var fs = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fs, fSource);
gl.compileShader(fs);

// now make 2 identical programs from those shaders
var p1 = gl.createProgram();
gl.attachShader(p1, vs);
gl.attachShader(p1, fs);
gl.linkProgram(p1);

var p2 = gl.createProgram();
gl.attachShader(p2, vs);
gl.attachShader(p2, fs);
gl.linkProgram(p2);

// Get a uniform location from program1
var location1 = gl.getUniformLocation(p1, "someUniform");

// Try to use that location on program2
gl.useProgram(p2);
gl.uniform4fv(location1, [1, 2, 3, 4]);  // ERROR!!!

プログラム1の場所をプログラム2で使用しようとすることは許可されていません。プログラム2にユニフォームを設定するには、プログラム2の場所を取得する必要があります。

于 2012-11-14T06:24:45.007 に答える
0

射影行列を設定し、コード内のすべてのフレームで実行する関数があります。すべてのシェーダーを繰り返し処理しますuseProgramが、変化しませんGL.currentprogram。したがって、前のフレームの最後のシェーダーがPicであり、現在のフレームの最初のシェーダーも同じである場合、たとえば、私のシェーダーPicでループが停止しましたWarp-selecting 関数は、現在のシェーダーがであると見なしますが、そうでPicはなく、シェーダーを変更しません。

すべてのシェーダーで反復する前に、現在の属性配列を設定GL.currentprogramして無効にすることで修正しました。null

于 2012-11-14T06:40:10.017 に答える