2012-11-29 7 views
6

Ho un oggetto WebGLTexture. Come ottengo i pixel di quella texture (simile ai readPixel di WebGL, ma per una trama)?Leggere i pixel da una trama WebGL

Un'idea che ho è di creare una tela e un contesto WebGL con preserveDrawingBuffer = true, e rendere la mia texture su questa tela in modo che mostri 2D flat, e quindi utilizzare readPixels. Questo approccio è ragionevole? Qualcuno ha un codice di esempio per questo?

risposta

7

Si può provare ad allegare la trama a un framebuffer e quindi chiamare readPixels sul frame buffer.

in fase di init

// 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); 

al tempo di lettura

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

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

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

Per le texture di format = gl.RGBA, type = gl.UNSIGNED_BYTE CanRead dovrebbe essere sempre vero. Per altri formati e tipi, canRead potrebbe essere falso.

+0

che bella idea! Grazie!! :) – Andy

+0

Quindi, come ho capito, questo funzionerà solo per le trame di livello = 0, poiché gl.framebufferTexture2D richiede il livello = 0. C'è un modo per gestire anche i livelli diversi da zero? – Andy

+0

È possibile eseguire il rendering di un livello specifico utilizzando texture2DLod negli shader in un altro livello di texture 0, quindi rileggilo. – gman