2011-05-30 5 views
8

Existe-t-il un moyen d'obtenir les données de pixels brutes à partir d'un tampon de rendu WebGL ou d'un tampon d'image hors écran? J'utilise WebGL pour faire un traitement d'image, par exemple. flou d'une image, ajustement de la couleur, etc. J'utilise des tampons d'image pour rendre des textures à la taille d'image complète, puis j'utilise cette texture pour afficher dans la fenêtre d'affichage à une taille plus petite. Est-ce que je peux obtenir les données de pixel d'un tampon ou d'une texture pour pouvoir travailler dans un contexte 2d normal? Ou suis-je coincé avec la modification de la fenêtre d'affichage à la taille d'image complète et saisissant les données avec canvas.toDataURL()?WebGL - lecture des données de pixels à partir du tampon de rendu

Merci.

+0

Avez-vous réellement obtenu une réponse à ceci? La réponse que vous avez marquée ne semble pas vraiment répondre à la question. –

+0

Je suppose que la réponse réelle est non, vous ne pouvez pas obtenir des données de pixels à partir d'un tampon. Vous devez utiliser 'readPixels()' C'était le plus proche d'une réponse, donc je l'ai accepté. Devrais-je ne pas accepter cette réponse? –

+0

Je ne pense pas que ce soit nécessaire. À moins que quelqu'un ne fournisse une réponse plus utile, brainjam a indirectement répondu à votre question. J'étais juste curieux. –

Répondre

3

Ceci est une question très ancienne, mais j'ai cherché la même chose dans three.js récemment. Il n'y a pas de moyen direct de rendre au frame buffer, mais en réalité c'est fait par render to texture (RTT). Je vérifie le code source de l'infrastructure et trouve le code suivant:

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() devrait faire ce que vous voulez. Lire la suite dans la spécification WebGL au http://www.khronos.org/registry/webgl/specs/latest/

+0

Merci, je vais essayer ça. Malheureusement, il semble que je dois encore redimensionner la toile à la taille que je veux lire les pixels. Cela provoque un 'flash' lors du redimensionnement. Peut-être que l'utilisation d'un contexte séparé hors écran, puis la lecture des pixels de cela pourrait fonctionner ...? –

+2

Oui, en utilisant un contexte hors écran distinct devrait fonctionner .. mais je n'ai pas essayé cela. En outre, vous pouvez apparemment créer des framebuffers auxiliaires qui peuvent être utilisés pour le rendu, mais qui ne sont pas affichés. Voir http://learningwebgl.com/blog/?p=1786 pour une explication sur la façon de créer un tel framebuffer et d'utiliser son contenu comme texture. J'espère que ça va vous aider. – brainjam

+0

J'utilise un framebuffer comme texture dans un contexte webgl, mais le problème que je rencontre est de sortir ces données du contexte pour les utiliser ailleurs dans mon application. J'ai mis en place un contexte hors écran distinct, donc je vais poursuivre sur cette voie pour l'instant. Merci. –

Questions connexes