したがって、これはやや漠然とした質問です。おそらく、WebGL (OpenGL) の内部、特に GL コンテキスト内で状態を管理する方法について、まだ限られた (しかし改善している) 知識があるためです。明確にするか、詳細を追加するように依頼してください。問題がどこにあるのか正確にはわからないので、できるだけ多くの情報を含めます。
小さなレンダリングエンジンにピッキングを実装する状況があります。すべてのオブジェクトが一定の色でレンダリングされる単純なシェーダーがある場合、すべてが正常に機能します。オブジェクトごとに 2 つのバッファー (1 つの ARRAY_BUFFER と 1 つの ELEMENT_ARRAY_BUFFER) があります。ピッキング アスペクトは追加の FrameBuffer を介して実装され、シーンは「ピッキング」シェーダーでレンダリングされます。ピッキング フレームをレンダリングする必要がある場合は、別の FrameBuffer に切り替えてからピッキング シェーダー (gl.useProgram()) に切り替え、シーンをレンダリングしてから、デフォルトのキャンバス FrameBuffer に戻します。次に、クリックされたキャンバス座標のピクセル値を読み取り、その値を使用して特定の要素の ID を調べます。デバッグ ステップとして、FrameBuffer 全体を別のキャンバスにレンダリングし、そのキャンバスを次の場所に表示します。 DOM、
頂点カラーリングをオンにすると問題が発生します。色の値は頂点ごとに指定され、VertexAttribArray (頂点座標と同じ) としてシェーダーに渡されます。ただし、カラーリングがオンになっている場合、ピッキング レンダリングは何もレンダリングしません (空白の白い画面が出力されます)。
このエラーが表示される原因となるカラーリング関数の部分を分離しました (ピッキング フレームの空白のレンダリング)。
Buffer vertex_color_buffer = gl.createBuffer();
gl.bindBuffer(RenderingContext.ARRAY_BUFFER,vertex_color_buffer);
gl.bufferData(RenderingContext.ARRAY_BUFFER,
new Float32List.fromList(unpacked_colors_lst),
RenderingContext.STATIC_DRAW);
int color_attr_location = gl.getAttribLocation(p_shader,
"a_vertex_color");
gl.enableVertexAttribArray(color_attr_location);
gl.vertexAttribPointer(color_attr_location,
4,
RenderingContext.FLOAT,
false,
4*Float32List.BYTES_PER_ELEMENT, //stride
0); //offset within the buffer
そのため、シェーダーが頂点カラーリング シェーダー (物を適切に表示する) からピッキング シェーダーに切り替わると、明らかにいくつかの GL 状態がこれらの行に設定され、シーンがレンダリングされなくなります。頂点変換に問題があるのではないかと思ったのですが、カラーリング シェーダとピッキング シェーダは同じですが、カラーリング シェーダは問題なく表示されますが、ピッキング シェーダは表示されません。
この質問をより明確にするために、他に何を含める必要があるか教えてください。これをデバッグしようと何日も費やしましたが、まだアイデアがありません。(Ps. コードは Dart で書かれています)。