2012-11-29 15 views
6

Ich habe ein WebGLTexture-Objekt. Wie bekomme ich Pixel dieser Textur (ähnlich den readPixels von WebGL, aber für eine Textur)?Pixel aus einer WebGL-Textur lesen

Eine Idee, die ich habe, ist, einen Canvas- und einen WebGL-Kontext mit preserveDrawingBuffer = true zu erstellen und meine Textur auf dieser Zeichenfläche so zu rendern, dass sie 2D flach zeigt, und dann readPixels verwendet. Ist dieser Ansatz sinnvoll? Hat jemand einen Beispielcode dafür?

Antwort

7

Sie können versuchen, die Textur an einen Framebuffer anzuhängen und dann readPixels im Framepuffer aufzurufen.

bei init Zeit

// make a framebuffer 
fb = gl.createFramebuffer(); 

// make this the current frame buffer 
gl.bindFramebuffer(gl.FRAMEBUFFER, fb); 

// attach the texture to the framebuffer. 
gl.framebufferTexture2D(
    gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, 
    gl.TEXTURE_2D, texture, 0); 

// check if you can read from this type of texture. 
bool canRead = (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE); 

// Unbind the framebuffer 
gl.bindFramebuffer(gl.FRAMEBUFFER, null); 

bei Lesezeit

if (canRead) { 
    // bind the framebuffer 
    gl.bindFramebuffer(gl.FRAMEBUFFER, fb); 

    // read the pixels 
    gl.readPixels(......); 

    // Unbind the framebuffer 
    gl.bindFramebuffer(gl.FRAMEBUFFER, null); 
} 

Für Texturen von format = gl.RGBA, type = gl.UNSIGNED_BYTE canRead sollte immer wahr sein. Für andere Formate und Typen könnte canRead möglicherweise falsch sein.

+0

was für eine großartige Idee! Vielen Dank!! :) – Andy

+0

Also, wie ich verstehe, wird dies nur für Texturen von Level = 0 funktionieren, da gl.framebufferTexture2D Level = 0 erfordert. Gibt es eine Möglichkeit, auch mit Nicht-Null-Ebenen umzugehen? – Andy

+0

Sie können eine bestimmte Ebene mit texture2DLod in Ihren Shadern in die Ebene 0 einer anderen Textur rendern und diese dann lesen. – gman