3

詳しくはこちらのスレッドをご覧ください。

要約すると、次の状況が与えられます。

gl = canvas.getContext('experimental-webgl');
gl.clearColor(0, 0, 0, 1);
gl.colorMask(1, 1, 1, 0);
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
gl.enable(gl.BLEND);

...そして標準のレンダリングループ:

function doRender() {
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  // render stuff, and request another frame
  requestAnimationFrame(doRender);
}

...では、期待される出力が理論的にどうあるべきかを知りたいです。

実際には、最初のフレームがカラー マスクがないかのようにレンダリングされ、2 番目 (以降) のフレームがキャンバス全体を不透明な白でレンダリングすることがわかります。

アルファ レベルがどのように設定されているかは問題ではないことに注意してください。レンダリングされたアルファ値が非常に低い場合でも、2 番目のフレームは常にすぐに完全に白くなります (レンダリングされなかった領域を含む)。

質問: 最初、2 番目、および後続のフレームに対する上記の操作の期待される結果は何ですか? また、私が経験しているのは期待どおりの結果ですか、それとも GL ドライバーまたは WebGL 実装のバグによるものですか? 最後に、それが期待どおりの結果である場合、その理由は何ですか? この結果を生成するためにビデオカードで実際に何が起こっているのでしょうか?

システムの詳細: MacBook Pro / GeForce 320M / Snow Leopard 上の Chrome / Firefox (両方)。

4

1 に答える 1

5

WebGL は、そうしないように指示しない限り、各フレームの描画バッファーを自動的にクリアします。

試す

gl = canvas.getContext('experimental-webgl', {
   preserveDrawingBuffer: true
});

ただし、フレームごとに描画バッファーのコピーを作成して保持する必要があるため、新しいものを描画するときにページの残りの部分と合成するコピーがあるため、クリアするよりも遅くなる可能性があります。そのため、レンダー ループ内で gl.clear を呼び出す方がよいでしょう。もちろん、目的の効果が継続的に描画バッファーにブレンドすることであった場合は、上記の例のように保持するように指示するか、フレームバッファーを使用してテクスチャまたはレンダーバッファーに描画し、それをレンダリングする必要があります。描画バッファ。

于 2012-07-19T03:17:29.277 に答える