2014-02-22 6 views
8

Ich erhalte den Fehler [.WebGLRenderingContext]RENDER WARNING: texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering or is not 'texture complete', wenn ich meine Webanwendung in Dartium starte. Ich habe versucht, dieses Problem für zwei Tage zu beheben, einschließlich einer vollständigen Neufassung des Codes. Aber ich kann das Problem nicht isolieren.dart: web_gl: RENDER ACHTUNG: Textur, die an Textureinheit 0 gebunden ist, kann nicht gerendert werden

Ich denke, das Problem liegt jedoch in diesem Stück Code.

void main() { 
    ... 
    var texture = gl.createTexture(); 
    var image = new ImageElement(); 
    image.onLoad.listen((e) { 
     gl.bindTexture(webGL.TEXTURE_2D, texture); 
     gl.texImage2DImage(webGL.TEXTURE_2D, 0, webGL.RGBA, webGL.RGBA, 
         webGL.UNSIGNED_BYTE, image); 
     gl.texParameteri(webGL.TEXTURE_2D, webGL.TEXTURE_MAG_FILTER, webGL.NEAREST); 
     gl.texParameteri(webGL.TEXTURE_2D, webGL.TEXTURE_MIN_FILTER, webGL.NEAREST); 
     gl.bindTexture(webGL.TEXTURE_2D, null); 
    }); 
    image.src = "tex.png"; 
    ... 
    } 

tex.png ist 32x32

Irgendwelche Ideen, was das Problem ist?

+0

Funktioniert gl.generateMipmap (gl.TEXTURE_2D); dir helfen? – Fox32

+1

@ Fox32 Es tut es nicht. Und ist das nicht nur nötig, wenn Sie einen Mipmap-Parameter setzen? – lightandlight

Antwort

12

Unmittelbar nach dem Code in meiner Frage hatte ich die Textur gebunden und den Sampler einheitlich gesendet. Das war falsch, weil es vor dem Laden des Bildes ausgeführt wurde. Um dies zu beheben, habe ich die Anrufe, die Textur zu binden und Elemente in der onload Funktion zeichnen:

image.onLoad.listen((e) { 
    gl.bindTexture(webGL.TEXTURE_2D, texture); 
    gl.texImage2DImage(webGL.TEXTURE_2D, 0, webGL.RGBA, webGL.RGBA, 
         webGL.UNSIGNED_BYTE, image); 
    gl.texParameteri(webGL.TEXTURE_2D, webGL.TEXTURE_MAG_FILTER, webGL.NEAREST); 
    gl.texParameteri(webGL.TEXTURE_2D, webGL.TEXTURE_MIN_FILTER, webGL.NEAREST); 
    gl.bindTexture(webGL.TEXTURE_2D, null); 

    gl.activeTexture(webGL.TEXTURE0); 
    gl.bindTexture(webGL.TEXTURE_2D, texture); 
    gl.uniform1i(gl.getUniformLocation(shader.program, "uSampler"), 0); 

    gl.drawElements(webGL.TRIANGLES, 6, webGL.UNSIGNED_SHORT, 0); 

    }); 

, das das Bild sicher macht geladen.

Vorher würde es nur den Onload-Callback zuweisen und dann die nächsten Befehle ausführen - was das Binden der Textur beinhaltete - aber da der Computer sehr schnell ist, hatte er bereits die Textur gebunden und versucht, sie vor dem Bild zu zeichnen fertig geladen.

+8

Eine andere Möglichkeit, dies zu bewerkstelligen, besteht darin, eine Textur mit 1x1 Pixeln bei der Erstellung der Textur zu erstellen und sie nach dem Laden des Bildes durch das Bild zu ersetzen. Auf diese Weise können Sie ohne besondere Prüfung sofort mit dem Zeichnen beginnen. Siehe http://stackoverflow.com/questions/19722247/webgl-wait-for-texture-to-load/19748905#19748905 – gman

+0

Ich werde dies im Hinterkopf behalten, danke – lightandlight