2016-03-20 23 views
1

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.

+0

Sie müssen überprüfen, ob 'gl.getExtension ('OES_texture_float');' nicht-null zurückgibt, um zu sehen, ob diese Funktion unterstützt wird. –

+0

['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? –

+0

@ 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. –

Antwort

2

Wenn es funktioniert auf dem gleichen Telefon in anderen Browsern dann würde ich file a bug with Mozilla.

Im Allgemeinen wird die Fähigkeit, eine Fließkomma-Textur an einen Framebuffer anzuhängen, jedoch nicht universell unterstützt. In OpenGL ES 2.0 keinerlei Formate :(

in WebGL arbeiten, nur 3 Formate sind garantiert arbeiten From the spec garantiert werden.

die folgenden Kombinationen von Framebuffer-Objekt-Anhänge, wenn alle Anlagen sind Bildpuffer Befestigung vollständig ist, nicht Null ist, und haben die gleiche Breite und Höhe, muss führen im Bildpuffer sein Bildpuffer vollständig:

  • COLOR_ATTACHMENT0 = RGBA/UNSIGNED_BYTE Textur
  • COL OR_ATTACHMENT0 = RGBA/UNSIGNED_BYTE Textur + DEPTH_ATTACHMENT = DEPTH_COMPONENT16 renderbuffer
  • COLOR_ATTACHMENT0 = RGBA/UNSIGNED_BYTE Textur + DEPTH_STENCIL_ATTACHMENT = DEPTH_STENCIL renderbuffer

Alle anderen Kombinationen von Anlagen zur GPU/Treiber/Browser sind nach oben.

+0

Wie machen Menschen mehrstufige GPU-Berechnungen mit Floats, wenn sie nur Bytes zulässig sind? Packen sie sie nur manuell zwischen den einzelnen Schritten ein und aus? –

+0

Es funktioniert in Chrome auf dem gleichen Telefon, also werde ich einen Fehler einreichen. –

+0

Der eingereichte Fehler: https://bugzilla.mozilla.org/show_bug.cgi?id=1258209 –

Verwandte Themen