2016-03-20 12 views
1

Androidで動作するFirefoxのモバイル版を除いて、私が試したすべてのブラウザで動作するjavascript/webglコードがあります。問題は "framebuffer complete"と関係がありますが、具体的に何が間違っているのか分かりません。FRAMEBUFFER_INCOMPLETE_ATTACHMENTは、Android搭載のFirefoxでのみ発生します。

ここで私が作ることができる最小の再現です。ちょうどフレームバッファは「完全」であることを確認し、その後、いくつかのプロパティを設定し、テクスチャやフレームバッファを作成することになっています:私のテストで

var canvas = document.createElement('canvas'); 
 
var gl = canvas.getContext('webgl'); 
 
var GL = WebGLRenderingContext; 
 
if (gl.getExtension('OES_texture_float') === null) { 
 
    alert("No float support."); 
 
} 
 

 
var texture = gl.createTexture(); 
 
var frameBuffer = gl.createFramebuffer(); 
 
gl.bindTexture(GL.TEXTURE_2D, texture); 
 
gl.bindFramebuffer(GL.FRAMEBUFFER, frameBuffer); 
 

 
gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.NEAREST); 
 
gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.NEAREST); 
 
gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE); 
 
gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE); 
 
gl.texImage2D(
 
    GL.TEXTURE_2D, //target 
 
    0,    //level 
 
    GL.RGBA,  //internalformat 
 
    2,    //width 
 
    2,    //height 
 
    0,    //border 
 
    GL.RGBA,  //format 
 
    GL.FLOAT,  // type [changing to UNSIGNED_BYTE "fixes" the failure...?] 
 
    null   // pixels 
 
); 
 
gl.framebufferTexture2D(
 
    GL.FRAMEBUFFER, 
 
    GL.COLOR_ATTACHMENT0, 
 
    GL.TEXTURE_2D, 
 
    texture, 
 
    0); 
 

 
var result = gl.checkFramebufferStatus(GL.FRAMEBUFFER); 
 
if (result === GL.FRAMEBUFFER_COMPLETE) { 
 
    alert("success (FRAMEBUFFER_COMPLETE)"); 
 
} else { 
 
    alert("ERROR " + ({ 
 
     [0]: "Argument wasn't a frame buffer", 
 
     [GL.INVALID_ENUM]: "INVALID_ENUM", 
 
     [GL.FRAMEBUFFER_INCOMPLETE_ATTACHMENT]: "FRAMEBUFFER_INCOMPLETE_ATTACHMENT", 
 
     [GL.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT]: 
 
      "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT", 
 
     [GL.FRAMEBUFFER_INCOMPLETE_DIMENSIONS]: "FRAMEBUFFER_INCOMPLETE_DIMENSIONS", 
 
     [GL.FRAMEBUFFER_UNSUPPORTED]: "FRAMEBUFFER_UNSUPPORTED" 
 
    }[result] || result)); 
 
}

、このコードは、Windows + Firefox-に成功します44、Windows + Chrome-49、Android + Chrome、およびUbuntu + Firefoxをサポートしています。しかし、それはAndroid + FirefoxのFRAMEBUFFER_INCOMPLETE_ATTACHMENTで失敗します。

また、私はそれがテクスチャFLOATに影響するように見えることがわかりました。タイプをUNSIGNED_BYTEに変更すると、それは合格します。

私は一般的にopenglに精通していないので、私は間違いを黙って修正していない唯一のブラウザであるモバイルFirefoxを使用しています。

おそらく関連する別のものは、実際のframeBufferインスタンスの代わりに、GL.FRAMEBUFFERgl.checkFramebufferStatusに渡す必要があります。 frameBufferを渡すと、結果は常に0になります。通常、0は成功を意味しますが、the mdn docsはこの関数の戻り値として0もリストしません。彼らは良い結果がFRAMEBUFFER_COMPLETEだと言います。

+0

gl.getExtension( 'OES_texture_float');は、その機能がサポートされているかどうかを調べるには、nullでないかどうかを確認する必要があります。 –

+0

['checkFramebufferStatus'](https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCheckFramebufferStatus.xml)にはフレームバッファオブジェクトを引数として受け入れるオーバーロードはありませんが、排他的に呼び出されるはずです*と 'gl。FRAMEBUFFER'を呼び出し、現在バインドされているフレームバッファをチェックします。 'OES_texture_float'拡張が実際にサポートされているかどうかチェックしましたか? –

+0

@WacławJasperfirefox + androidを含め、テストしたすべてのブラウザでnull以外を返していたので、私はreproからそのチェックを削除しました。私はそれを省略する混乱を引き起こしているので、私はチェックを入れて戻します。 –

答えて

2

他のブラウザではと全く同じ電話にと同じ電話番号を入力した場合はfile a bug with Mozillaとなります。

ただし、浮動小数点テクスチャをフレームバッファに付加する機能は、一般的にはサポートされていません。 OpenGL ES 2.0いかなる形式は一切のWebGLで:(

を動作することが保証されていない、唯一の3フォーマットが動作することが保証されているFrom the spec:フレームバッファオブジェクトの添付ファイルの

以下の組み合わせを、すべての添付ファイルがあるとき

  • COLOR_ATTACHMENT0 = RGBA/UNSIGNED_BYTEテクスチャ
  • COL:フレームバッファアタッチメントは、完全非ゼロ、および完全なフレームバッファであるフレームバッファをもたらす必要があり、同じ幅と高さを有しますOR_ATTACHMENT0 = RGBA/UNSIGNED_BYTEテクスチャ+ DEPTH_ATTACHMENT = DEPTH_COMPONENT16レンダ
  • COLOR_ATTACHMENT0 = RGBA/UNSIGNED_BYTEテクスチャ+ DEPTH_STENCIL_ATTACHMENT = DEPTH_STENCILレンダ

添付ファイルの他のすべての組み合わせは、GPU /ドライバ/ブラウザ次第です。

+0

浮動小数点数を含むマルチステップGPU計算では、許容されるバイト数が限られています。彼らは手作業で梱包してステップ間で開梱していますか? –

+0

これはまったく同じ電話でChromeで動作するため、バグを報告します。 –

+0

ファイルされたバグ:https://bugzilla.mozilla.org/show_bug.cgi?id=1258209 –

関連する問題