2016-05-06 5 views
1

私はHDRを使ってBloomのポストプロセッシングエフェクトを実装しようとしています。私は、同じ効果を出すためのオンラインチュートリアルである足場を使用していますが、最新バージョンのOpenGLに基づいています(チュートリアル)。シェーダースクリプティング用にOpenGL ES 2.0でWebGL 1.0を使用しています。OpenGLのglDrawBuffersを実装するためのwebGl代替メソッドは何ですか?

rboDepth = gl.createRenderbuffer() 
     gl.bindRenderbuffer(gl.RENDERBUFFER, rboDepth); 
     gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT, gl.viewportWidth, gl.viewportHeight); 
     glFramebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, rboDepth); 
     // - Tell OpenGL which color attachments we'll use (of this framebuffer) for rendering 
     var attachments = [ gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1 ]; 
     glDrawBuffers(2, attachments); 
     // - Finally check if framebuffer is complete 
     if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) 
      alert("Framebuffer not complete!"); 

答えて

0

drawBuffersはWebGLの、WEBGL_draw_buffersに拡張として利用可能である:例では、このレンダ生成スクリプト(注ライン4)です。これを使用するには、拡張

var ext = gl.getExtension("WEBGL_draw_buffers"); 
if (!ext) { 
    alert("no WEBGL_draw_buffers: sucks to be you"); 
    ... 
} 

をチェックし、あなたがあるとして実行するように上記のコードをしたい場合は、このようなWebGLのコンテキストにそれをコピーすることもできます。残念ながら、少なくともwebglstats.comWEBGL_draw_buffersに応じてのみデバイスの約60%でサポートされてい

for (var key in ext) { 
    var value = ext[key]; 
    if (typeof value === 'function') { 
    value = value.bind(ext); 
    } 
    // remove WEBGL suffix 
    var newKey = key.replace(/_?WEBGL/, ''); 
    gl[newKey] = value; 
} 

。私はちょっとショックを受けましたが、その数は非常に少ないですが、私は多くのドライバーが持っていることを知っています/ drawBuffersの設定に関連する深刻なバグを持っていました。彼らは一般的な方法でセットアップ時に働いたが、あまり一般的ではない設定でドライバをクラッシュさせるだろう。これはブラウザでは受け入れられないため、既知のバグがあるデバイスではこの機能はブラックリストに登録されています。しばらくの間、NVIDIAチップを搭載したOSXには当てはまりましたが、NVidiaでOSXデバイスにこれを入力し、WebGLでdrawbuffersを利用できるようになったので修正されています。拡張機能が利用できない場合、あなたは一種の運がありません。 WEBGL_draw_buffersが利用できない場合の解決策。

  1. 、本当に遅い

  2. が戻っdrawbufers

  3. は、ユーザーに知らせる必要はありませんいくつかの他の低品質のレンダリングにフォール一度各drawbuffer

    いやため、複数回のレンダリング彼らは運がない。

+0

私は2番目のコードブロックが正確に、あなたは説明する気にしないどのように機能するかを理解していませんか? – Khabs

+0

2番目のコードブロックはプロパティと関数を 'ext'から' gl'にコピーしています。名前が '_WEBGL'または' WEBGL'で終わると、その部分を削除します。そのブロックがなければ、 'ext.drawBuffersWEBGL(...)'を呼び出します。そのブロックで 'gl.drawBuffers(...)'を呼び出すことができます。 – gman

関連する問題