2016-11-25 1 views
1

遅延シェーディングを実装するために、fboを使用して複数のレンダーターゲットを実行しました。WebGL2デフォルトレンダーバッファエラーへの深さ値のコピー

このアプローチは機能しますが、背景に空の球を追加したいと思います。

明らかにこの空の球は、遅延レンダリングサイクルに属していないため、2番目のパスでレンダリングする必要があります。

しかし、空の球を正しくレンダリングするには、デプスレンダリングテクスチャが球をブロックしないように、デプス値を取得する必要があります。そうするには

、私はフレームバッファをデフォルトにGバッファから深度テクスチャをコピーします。

 gl.bindFramebuffer(gl.READ_FRAMEBUFFER, gDeferredDrawer.FrameBuffer.Context); 
    gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null); 
    gl.blitFramebuffer(0, 0, gl.viewportWidth, gl.viewportHeight, 0, 0, gl.viewportWidth, gl.viewportHeight, gl.DEPTH_BUFFER_BIT, gl.NEAREST); 
    gl.bindFramebuffer(gl.FRAMEBUFFER, null); 

このアプローチは動作しませんでした。

GLのERROR:GL_INVALID_OPERATION:glBlitFramebufferCHROMIUM:先のフレームバッファが

をマルチサンプリングされて、私は本当に私が間違ってそれをやったのか分からない私は、このエラーメッセージを与えるのWebGL。私が知る限り、インターネットには明確な例はありません。誰かが私を啓発してくれますか?ドローフレームバッファ用

答えて

2

from the specセクション4.3.2

SAMPLE_BUFFERS場合は INVALID_OPERATIONエラーが生成され、ゼロよりも大きいです。

あなたはマルチサンプリングされた宛先にをブリットするblitFramebufferを使用することはできません。マルチサンプリングされたソースからを読み取ることができます。あなたが技術を使用したい場合は

だから、あなたは、キャンバスにコピーし、そのフレームバッファに結合する、別のフレームバッファを使用し、その後

  1. について説明します。

  2. 私は#2を推測しているキャンバスは、マルチサンプリングされていない

    const gl = someCanvas.getContext("webgl2", { antialias: false }); 
    

をお使いの場合に優れています。あなたが実際にいくつかのオフスクリーンフレームバッファでマルチサンプリングの恩恵を受けるすべてのレンダリングを行っている場合、マルチサンプリングされたキャンバスを持つ理由はありません。

+0

フィードバックに感謝します。 追加のFBOを使用してそれを解決し、出力テクスチャとレンダリングバッファを遅延シェーダと共有します。これはかなりうまく機能します。 もう一度お返事いただきありがとうございます。 –

関連する問題