2011-05-30 8 views
8

¿Hay una manera de obtener los datos de los píxeles en bruto de un WebGL hacen buffer de memoria intermedia o marco que está fuera de la pantalla?WebGL - lectura de los datos de píxeles de rendir memoria intermedia

estoy usando WebGL para hacer algo de procesamiento de imágenes, por ejemplo, borrando una imagen, para igualar el color, etc. estoy usando marcos de memoria para hacer a las texturas en el tamaño de la imagen completa, a continuación, utilizando esa textura que se mostrará en la ventana gráfica en un tamaño más pequeño. ¿Puedo obtener los datos de píxel de un búfer o textura para que pueda trabajar con él en un contexto 2d de lienzo normal? ¿O estoy atascado con cambiar la ventana gráfica al tamaño de imagen completo y tomar los datos con canvas.toDataURL()?

Gracias.

+0

¿De verdad recibió una respuesta a esto? La respuesta que marcó no parece responder realmente a la pregunta. –

+0

Supongo que la respuesta real es no, no puede obtener datos de píxeles de un búfer. Tienes que usar 'readPixels()' Eso fue lo más cercano que tuve a una respuesta, así que la acepté. ¿Debo dejar de escuchar esa respuesta? –

+0

No creo que sea necesario. A menos que alguien proporcione una respuesta más útil, brainjam ha respondido indirectamente a su pregunta. Solo tenía curiosidad. –

Respuesta

3

Esto es muy vieja pregunta, pero he buscado lo mismo en three.js recientemente. No hay una forma directa de renderizar en el búfer de cuadros, pero en realidad se realiza por proceso de renderizado a textura (RTT). Compruebo el código fuente del marco y descubro el siguiente código:

renderer.render(rttScene, rttCamera, rttTexture, true); 

// ... 

var width = rttTexture.width; 
var height = rttTexture.height; 
var pixels = new Uint8Array(4 * width * height); // be careful - allocate memory only once 

// ... 

var gl = renderer.context; 
var framebuffer = rttTexture.__webglFramebuffer; 
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);   
gl.viewport(0, 0, width, height); 
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); 
gl.bindFramebuffer(gl.FRAMEBUFFER, null); 
5

readPixels() debe hacer lo que quiera. Leer más en la especificación WebGL en http://www.khronos.org/registry/webgl/specs/latest/

+0

Gracias, intentaré eso. Desafortunadamente, parece que todavía tengo que cambiar el tamaño del lienzo al tamaño que quiero para leer los píxeles. Esto causa un 'flash' al cambiar el tamaño. ¿Tal vez usar un contexto separado fuera de la pantalla, y luego leer píxeles de eso podría funcionar ...? –

+2

Sí, usar un contexto fuera de pantalla por separado debería funcionar ... pero no lo he intentado. Además, aparentemente puede crear framebuffers auxiliares que se pueden usar para renderizar, pero que no se muestran. Consulte http://learningwebgl.com/blog/?p=1786 para obtener una explicación sobre cómo crear dicho framebuffer y utilizar su contenido como una textura. Espero que eso te ayude a avanzar. – brainjam

+0

Estoy usando un framebuffer como textura en un contexto webgl; sin embargo, el problema que tengo es sacar esos datos del contexto para utilizarlos en otro lugar de mi aplicación. Tengo el contexto separado fuera de la pantalla funcionando, por lo que voy a seguir esa ruta por el momento. Gracias. –

Cuestiones relacionadas