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.FRAMEBUFFER
をgl.checkFramebufferStatus
に渡す必要があります。 frameBuffer
を渡すと、結果は常に0になります。通常、0は成功を意味しますが、the mdn docsはこの関数の戻り値として0もリストしません。彼らは良い結果がFRAMEBUFFER_COMPLETE
だと言います。
gl.getExtension( 'OES_texture_float');は、その機能がサポートされているかどうかを調べるには、nullでないかどうかを確認する必要があります。 –
['checkFramebufferStatus'](https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCheckFramebufferStatus.xml)にはフレームバッファオブジェクトを引数として受け入れるオーバーロードはありませんが、排他的に呼び出されるはずです*と 'gl。FRAMEBUFFER'を呼び出し、現在バインドされているフレームバッファをチェックします。 'OES_texture_float'拡張が実際にサポートされているかどうかチェックしましたか? –
@WacławJasperfirefox + androidを含め、テストしたすべてのブラウザでnull以外を返していたので、私はreproからそのチェックを削除しました。私はそれを省略する混乱を引き起こしているので、私はチェックを入れて戻します。 –