Ich habe einige Javascript/Webgl-Code, der auf jedem Browser funktioniert, den ich ausprobiert habe, mit Ausnahme der mobilen Version von Firefox auf Android ausgeführt. Das Problem hat etwas mit "framebuffer complete" zu tun, aber ich weiß nicht, was genau falsch ist.FRAMEBUFFER_INCOMPLETE_ATTACHMENT passiert nur auf Android mit Firefox
Hier ist die kleinste Repro, die ich machen konnte. Es soll nur eine Textur und einen Framebuffer erstellen, setzen einige Eigenschaften, prüfen Sie, ob der Framebuffer ‚vollständig‘ ist:
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));
}
In meinen Tests gelingt es dieser Code auf Windows + Firefox- 44, Windows + Chrome-49, Android + Chrome und Ubuntu + Firefox. Aber es schlägt mit FRAMEBUFFER_INCOMPLETE_ATTACHMENT
auf Android + Firefox fehl.
Auch ich habe festgestellt, dass es scheint nur FLOAT
Texturen zu beeinflussen. Wenn ich den Typ zu UNSIGNED_BYTE
ändere, übergibt es.
Da ich OpenGL im Allgemeinen nicht kenne, ist es wahrscheinlich, dass ich eine offensichtliche Aufsicht habe (z. B. keine erforderliche Eigenschaft binden) und mobile Firefox ist der einzige Browser, der nicht stillschweigend meinen Fehler behoben hat.
Eine andere möglicherweise relevante Sache ist GL.FRAMEBUFFER
in gl.checkFramebufferStatus
statt der tatsächlichen frameBuffer
Instanz passieren. Wenn ich frameBuffer
übergebe, ist das Ergebnis nur immer 0. Normalerweise bedeutet 0 Erfolg, aber the mdn docs listet nicht einmal 0 als möglichen Rückgabewert für diese Funktion auf; Sie sagen, das gute Ergebnis ist FRAMEBUFFER_COMPLETE
.
Sie müssen überprüfen, ob 'gl.getExtension ('OES_texture_float');' nicht-null zurückgibt, um zu sehen, ob diese Funktion unterstützt wird. –
['checkFramebufferStatus'] (https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCheckFramebufferStatus.xml) hat keine Überladung, die ein Framebuffer-Objekt als Argument akzeptiert, es soll ausschließlich * heißen * mit 'gl.FRAMEBUFFER' und überprüfe den aktuell gebundenen Framebuffer. Haben Sie überprüft, ob die Erweiterung 'OES_texture_float' tatsächlich unterstützt wird? –
@ WacławJasper Ich habe diese Überprüfung aus der Repro entfernt, weil es auf allen getesteten Browsern, einschließlich Firefox und Android, nicht-Null zurückgegeben hat. Ich setze den Scheck zurück, weil es Verwirrung verursacht, ihn wegzulassen. –