私のWebGLプログラムでピッキング(色とreadPixelsを使用)を実装しようとしています。プログラムを始めると、shaderProgramを別に作成します。 1つはフォンシェーディング用で、もう1つはどのシェイプがクリックされたかを検出するための色をシェイプに与えます。異なる数の属性を持つ2つ以上のシェーダーを使用すると競合します
phongシェーダには2つの属性があります。頂点の位置と頂点の法線。ピッキングする人は単にポジションを持っています。
今私は、これらのシェーダが同じプログラムに存在し、ピッキングのものを使用しているという奇妙な理由から、drawArrayコールが失敗するとわかりました。最後に、gl.vertexAttribPointerコールが発生します。私は混乱していると私はアクティブな属性の配列を使用してチェックするときにそれを発見: gl.getVertexAttrib(インデックス、gl.VERTEX_ATTRIB_ARRAY_ENABLED);
真0,1リターンの両方が(ピッキングシェーダがgl.useProgram(ピッキング)とアクティブである場合、これは)
今はgl.disableVertexAttribArray(1)と1を無効にした場合。すべてが再び動作します。もう一つの修正点は、まずphongシェーダで描画し、ピッキングシェーダを使用して、何とか魔法のようにOKにすることです。その場合、phongシェーダを使用して頂点法線バッファを接続すると、ピッキングシェーダとdrawArrayコールが切り替わるときにどういうことかと思います。
私はgl.enableAttribArrayを間違って使用しているかどうかを知りたいので、シェーダなどの切り替え時に無効にする必要があります。
また、私はShaderプログラムを別の順序で作成しようとしましたが、成功しませんでした。
これは、私がソートを行うことを決めたことです。シェーダごとにどの頂点属性が存在し、どのシェーダがどのシェーダに存在するのか知っています私はgl.useProgram呼び出しをラップしていますので、最初にクリーンアップを行うことができます。 – nkassis
実際にuseProgramは制服に影響を与えます。 GL_ARB_uniform_buffer_objectは、同じプログラムの複数のコピーを作成するだけでシミュレートできます。実際には、ドライバはGL_ARB_uniform_buffer_objectのフードの下でこれを実行します。 – gman
ユニフォームにはどのような影響がありますか?私が理解する限り、セキュリティ上の理由から、あるプログラムの制服は別のプログラムの中で使用することはできませんが、GL.useProgramの影響を受けてはいけません。 – MikaelEmtinger