Browse Source

Added simple render-to-texture example.

Something is broken as OpenGL shows different result than ANGLE :(

Though this time it's ANGLE which seems correct.
alteredq 14 years ago
parent
commit
cee7205670
5 changed files with 185 additions and 14 deletions
  1. 2 2
      build/Three.js
  2. 2 2
      build/ThreeDebug.js
  3. 2 2
      build/ThreeExtras.js
  4. 177 0
      examples/render_to_texture.html
  5. 2 8
      src/renderers/WebGLRenderer.js

+ 2 - 2
build/Three.js

@@ -174,9 +174,9 @@ h.image[m]);b.generateMipmap(b.TEXTURE_CUBE_MAP);b.bindTexture(b.TEXTURE_CUBE_MA
 j(h.wrap_t));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,j(h.mag_filter));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,j(h.min_filter));b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,null)}b.activeTexture(b.TEXTURE0+d);b.bindTexture(b.TEXTURE_2D,h.__webGLTexture)}}}w=p.attributes;b.bindBuffer(b.ARRAY_BUFFER,s.__webGLVertexBuffer);b.vertexAttribPointer(w.position,3,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.position);if(w.normal>=0){b.bindBuffer(b.ARRAY_BUFFER,s.__webGLNormalBuffer);
 j(h.wrap_t));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,j(h.mag_filter));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,j(h.min_filter));b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,null)}b.activeTexture(b.TEXTURE0+d);b.bindTexture(b.TEXTURE_2D,h.__webGLTexture)}}}w=p.attributes;b.bindBuffer(b.ARRAY_BUFFER,s.__webGLVertexBuffer);b.vertexAttribPointer(w.position,3,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.position);if(w.normal>=0){b.bindBuffer(b.ARRAY_BUFFER,s.__webGLNormalBuffer);
 b.vertexAttribPointer(w.normal,3,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.normal)}if(w.tangent>=0){b.bindBuffer(b.ARRAY_BUFFER,s.__webGLTangentBuffer);b.vertexAttribPointer(w.tangent,4,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.tangent)}if(w.uv>=0)if(s.__webGLUVBuffer){b.bindBuffer(b.ARRAY_BUFFER,s.__webGLUVBuffer);b.vertexAttribPointer(w.uv,2,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.uv)}else b.disableVertexAttribArray(w.uv);if(n.wireframe||n instanceof THREE.LineBasicMaterial){w=
 b.vertexAttribPointer(w.normal,3,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.normal)}if(w.tangent>=0){b.bindBuffer(b.ARRAY_BUFFER,s.__webGLTangentBuffer);b.vertexAttribPointer(w.tangent,4,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.tangent)}if(w.uv>=0)if(s.__webGLUVBuffer){b.bindBuffer(b.ARRAY_BUFFER,s.__webGLUVBuffer);b.vertexAttribPointer(w.uv,2,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.uv)}else b.disableVertexAttribArray(w.uv);if(n.wireframe||n instanceof THREE.LineBasicMaterial){w=
 n.wireframe_linewidth!==undefined?n.wireframe_linewidth:n.linewidth!==undefined?n.linewidth:1;n=n instanceof THREE.LineBasicMaterial&&v.type==THREE.LineStrip?b.LINE_STRIP:b.LINES;b.lineWidth(w);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,s.__webGLLineBuffer);b.drawElements(n,s.__webGLLineCount,b.UNSIGNED_SHORT,0)}else{b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,s.__webGLFaceBuffer);b.drawElements(b.TRIANGLES,s.__webGLFaceCount,b.UNSIGNED_SHORT,0)}};this.renderPass=function(d,h,k,n,s,v,p){var m,w,t,i,u;t=0;for(i=
 n.wireframe_linewidth!==undefined?n.wireframe_linewidth:n.linewidth!==undefined?n.linewidth:1;n=n instanceof THREE.LineBasicMaterial&&v.type==THREE.LineStrip?b.LINE_STRIP:b.LINES;b.lineWidth(w);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,s.__webGLLineBuffer);b.drawElements(n,s.__webGLLineCount,b.UNSIGNED_SHORT,0)}else{b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,s.__webGLFaceBuffer);b.drawElements(b.TRIANGLES,s.__webGLFaceCount,b.UNSIGNED_SHORT,0)}};this.renderPass=function(d,h,k,n,s,v,p){var m,w,t,i,u;t=0;for(i=
-n.materials.length;t<i;t++){m=n.materials[t];if(m instanceof THREE.MeshFaceMaterial){m=0;for(w=s.materials.length;m<w;m++)if((u=s.materials[m])&&u.blending==v&&u.opacity<1==p){this.setBlending(u.blending);this.renderBuffer(d,h,k,u,s,n)}}else if((u=m)&&u.blending==v&&u.opacity<1==p){this.setBlending(u.blending);this.renderBuffer(d,h,k,u,s,n)}}};this.render=function(d,h,k){var n,s,v,p,m=d.lights,w=d.fog;this.initWebGLObjects(d);if(k){if(k&&!k.__webGLFramebuffer){k.__webGLFramebuffer=b.createFramebuffer();
+n.materials.length;t<i;t++){m=n.materials[t];if(m instanceof THREE.MeshFaceMaterial){m=0;for(w=s.materials.length;m<w;m++)if((u=s.materials[m])&&u.blending==v&&u.opacity<1==p){this.setBlending(u.blending);this.renderBuffer(d,h,k,u,s,n)}}else if((u=m)&&u.blending==v&&u.opacity<1==p){this.setBlending(u.blending);this.renderBuffer(d,h,k,u,s,n)}}};this.render=function(d,h,k){var n,s,v,p,m=d.lights,w=d.fog;this.initWebGLObjects(d);if(k&&!k.__webGLFramebuffer){k.__webGLFramebuffer=b.createFramebuffer();
 k.__webGLRenderbuffer=b.createRenderbuffer();k.__webGLTexture=b.createTexture();b.bindRenderbuffer(b.RENDERBUFFER,k.__webGLRenderbuffer);b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,k.width,k.height);b.bindTexture(b.TEXTURE_2D,k.__webGLTexture);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,j(k.wrap_s));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,j(k.wrap_t));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,j(k.mag_filter));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,j(k.min_filter));
 k.__webGLRenderbuffer=b.createRenderbuffer();k.__webGLTexture=b.createTexture();b.bindRenderbuffer(b.RENDERBUFFER,k.__webGLRenderbuffer);b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,k.width,k.height);b.bindTexture(b.TEXTURE_2D,k.__webGLTexture);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,j(k.wrap_s));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,j(k.wrap_t));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,j(k.mag_filter));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,j(k.min_filter));
-b.texImage2D(b.TEXTURE_2D,0,j(k.format),k.width,k.height,0,j(k.format),j(k.type),null);b.bindFramebuffer(b.FRAMEBUFFER,k.__webGLFramebuffer);b.framebufferTexture2D(b.FRAMEBUFFER,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,k.__webGLTexture,0);b.framebufferRenderbuffer(b.FRAMEBUFFER,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,k.__webGLRenderbuffer);b.bindTexture(b.TEXTURE_2D,null);b.bindRenderbuffer(b.RENDERBUFFER,null);b.bindFramebuffer(b.FRAMEBUFFER,null)}b.bindFramebuffer(b.FRAMEBUFFER,k?k.__webGLFramebuffer:null)}this.autoClear&&
+b.texImage2D(b.TEXTURE_2D,0,j(k.format),k.width,k.height,0,j(k.format),j(k.type),null);b.bindFramebuffer(b.FRAMEBUFFER,k.__webGLFramebuffer);b.framebufferTexture2D(b.FRAMEBUFFER,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,k.__webGLTexture,0);b.framebufferRenderbuffer(b.FRAMEBUFFER,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,k.__webGLRenderbuffer);b.bindTexture(b.TEXTURE_2D,null);b.bindRenderbuffer(b.RENDERBUFFER,null);b.bindFramebuffer(b.FRAMEBUFFER,null)}b.bindFramebuffer(b.FRAMEBUFFER,k?k.__webGLFramebuffer:null);this.autoClear&&
 this.clear();h.autoUpdateMatrix&&h.updateMatrix();E.set(h.matrix.flatten());C.set(h.projectionMatrix.flatten());n=0;for(s=d.__webGLObjects.length;n<s;n++){v=d.__webGLObjects[n];p=v.object;v=v.buffer;if(p.visible){this.setupMatrices(p,h);this.renderPass(h,m,w,p,v,THREE.NormalBlending,false)}}n=0;for(s=d.__webGLObjects.length;n<s;n++){v=d.__webGLObjects[n];p=v.object;v=v.buffer;if(p.visible){this.setupMatrices(p,h);this.renderPass(h,m,w,p,v,THREE.AdditiveBlending,false);this.renderPass(h,m,w,p,v,THREE.SubtractiveBlending,
 this.clear();h.autoUpdateMatrix&&h.updateMatrix();E.set(h.matrix.flatten());C.set(h.projectionMatrix.flatten());n=0;for(s=d.__webGLObjects.length;n<s;n++){v=d.__webGLObjects[n];p=v.object;v=v.buffer;if(p.visible){this.setupMatrices(p,h);this.renderPass(h,m,w,p,v,THREE.NormalBlending,false)}}n=0;for(s=d.__webGLObjects.length;n<s;n++){v=d.__webGLObjects[n];p=v.object;v=v.buffer;if(p.visible){this.setupMatrices(p,h);this.renderPass(h,m,w,p,v,THREE.AdditiveBlending,false);this.renderPass(h,m,w,p,v,THREE.SubtractiveBlending,
 false);this.renderPass(h,m,w,p,v,THREE.AdditiveBlending,true);this.renderPass(h,m,w,p,v,THREE.SubtractiveBlending,true);this.renderPass(h,m,w,p,v,THREE.NormalBlending,true)}}if(k&&k.min_filter!==THREE.NearestFilter&&k.min_filter!==THREE.LinearFilter){b.bindTexture(b.TEXTURE_2D,k.__webGLTexture);b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,null)}};this.initWebGLObjects=function(d){function h(t,i,u,I){if(t[i]==undefined){d.__webGLObjects.push({buffer:u,object:I});t[i]=1}}var k,n,s,v,p,
 false);this.renderPass(h,m,w,p,v,THREE.AdditiveBlending,true);this.renderPass(h,m,w,p,v,THREE.SubtractiveBlending,true);this.renderPass(h,m,w,p,v,THREE.NormalBlending,true)}}if(k&&k.min_filter!==THREE.NearestFilter&&k.min_filter!==THREE.LinearFilter){b.bindTexture(b.TEXTURE_2D,k.__webGLTexture);b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,null)}};this.initWebGLObjects=function(d){function h(t,i,u,I){if(t[i]==undefined){d.__webGLObjects.push({buffer:u,object:I});t[i]=1}}var k,n,s,v,p,
 m,w;if(!d.__webGLObjects){d.__webGLObjects=[];d.__webGLObjectsMap={}}k=0;for(n=d.objects.length;k<n;k++){s=d.objects[k];p=s.geometry;if(d.__webGLObjectsMap[s.id]==undefined)d.__webGLObjectsMap[s.id]={};w=d.__webGLObjectsMap[s.id];if(s instanceof THREE.Mesh){for(v in p.geometryChunks){m=p.geometryChunks[v];if(!m.__webGLVertexBuffer){this.createMeshBuffers(m);this.initMeshBuffers(m,s);p.__dirtyVertices=true;p.__dirtyElements=true;p.__dirtyUvs=true;p.__dirtyNormals=true;p.__dirtyTangents=true}if(p.__dirtyVertices||
 m,w;if(!d.__webGLObjects){d.__webGLObjects=[];d.__webGLObjectsMap={}}k=0;for(n=d.objects.length;k<n;k++){s=d.objects[k];p=s.geometry;if(d.__webGLObjectsMap[s.id]==undefined)d.__webGLObjectsMap[s.id]={};w=d.__webGLObjectsMap[s.id];if(s instanceof THREE.Mesh){for(v in p.geometryChunks){m=p.geometryChunks[v];if(!m.__webGLVertexBuffer){this.createMeshBuffers(m);this.initMeshBuffers(m,s);p.__dirtyVertices=true;p.__dirtyElements=true;p.__dirtyUvs=true;p.__dirtyNormals=true;p.__dirtyTangents=true}if(p.__dirtyVertices||

+ 2 - 2
build/ThreeDebug.js

@@ -175,9 +175,9 @@ h.image[n]);b.generateMipmap(b.TEXTURE_CUBE_MAP);b.bindTexture(b.TEXTURE_CUBE_MA
 j(h.wrap_t));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,j(h.mag_filter));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,j(h.min_filter));b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,null)}b.activeTexture(b.TEXTURE0+d);b.bindTexture(b.TEXTURE_2D,h.__webGLTexture)}}}w=p.attributes;b.bindBuffer(b.ARRAY_BUFFER,s.__webGLVertexBuffer);b.vertexAttribPointer(w.position,3,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.position);if(w.normal>=0){b.bindBuffer(b.ARRAY_BUFFER,s.__webGLNormalBuffer);
 j(h.wrap_t));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,j(h.mag_filter));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,j(h.min_filter));b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,null)}b.activeTexture(b.TEXTURE0+d);b.bindTexture(b.TEXTURE_2D,h.__webGLTexture)}}}w=p.attributes;b.bindBuffer(b.ARRAY_BUFFER,s.__webGLVertexBuffer);b.vertexAttribPointer(w.position,3,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.position);if(w.normal>=0){b.bindBuffer(b.ARRAY_BUFFER,s.__webGLNormalBuffer);
 b.vertexAttribPointer(w.normal,3,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.normal)}if(w.tangent>=0){b.bindBuffer(b.ARRAY_BUFFER,s.__webGLTangentBuffer);b.vertexAttribPointer(w.tangent,4,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.tangent)}if(w.uv>=0)if(s.__webGLUVBuffer){b.bindBuffer(b.ARRAY_BUFFER,s.__webGLUVBuffer);b.vertexAttribPointer(w.uv,2,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.uv)}else b.disableVertexAttribArray(w.uv);if(o.wireframe||o instanceof THREE.LineBasicMaterial){w=
 b.vertexAttribPointer(w.normal,3,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.normal)}if(w.tangent>=0){b.bindBuffer(b.ARRAY_BUFFER,s.__webGLTangentBuffer);b.vertexAttribPointer(w.tangent,4,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.tangent)}if(w.uv>=0)if(s.__webGLUVBuffer){b.bindBuffer(b.ARRAY_BUFFER,s.__webGLUVBuffer);b.vertexAttribPointer(w.uv,2,b.FLOAT,false,0,0);b.enableVertexAttribArray(w.uv)}else b.disableVertexAttribArray(w.uv);if(o.wireframe||o instanceof THREE.LineBasicMaterial){w=
 o.wireframe_linewidth!==undefined?o.wireframe_linewidth:o.linewidth!==undefined?o.linewidth:1;o=o instanceof THREE.LineBasicMaterial&&v.type==THREE.LineStrip?b.LINE_STRIP:b.LINES;b.lineWidth(w);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,s.__webGLLineBuffer);b.drawElements(o,s.__webGLLineCount,b.UNSIGNED_SHORT,0)}else{b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,s.__webGLFaceBuffer);b.drawElements(b.TRIANGLES,s.__webGLFaceCount,b.UNSIGNED_SHORT,0)}};this.renderPass=function(d,h,k,o,s,v,p){var n,w,t,i,u;t=0;for(i=
 o.wireframe_linewidth!==undefined?o.wireframe_linewidth:o.linewidth!==undefined?o.linewidth:1;o=o instanceof THREE.LineBasicMaterial&&v.type==THREE.LineStrip?b.LINE_STRIP:b.LINES;b.lineWidth(w);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,s.__webGLLineBuffer);b.drawElements(o,s.__webGLLineCount,b.UNSIGNED_SHORT,0)}else{b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,s.__webGLFaceBuffer);b.drawElements(b.TRIANGLES,s.__webGLFaceCount,b.UNSIGNED_SHORT,0)}};this.renderPass=function(d,h,k,o,s,v,p){var n,w,t,i,u;t=0;for(i=
-o.materials.length;t<i;t++){n=o.materials[t];if(n instanceof THREE.MeshFaceMaterial){n=0;for(w=s.materials.length;n<w;n++)if((u=s.materials[n])&&u.blending==v&&u.opacity<1==p){this.setBlending(u.blending);this.renderBuffer(d,h,k,u,s,o)}}else if((u=n)&&u.blending==v&&u.opacity<1==p){this.setBlending(u.blending);this.renderBuffer(d,h,k,u,s,o)}}};this.render=function(d,h,k){var o,s,v,p,n=d.lights,w=d.fog;this.initWebGLObjects(d);if(k){if(k&&!k.__webGLFramebuffer){k.__webGLFramebuffer=b.createFramebuffer();
+o.materials.length;t<i;t++){n=o.materials[t];if(n instanceof THREE.MeshFaceMaterial){n=0;for(w=s.materials.length;n<w;n++)if((u=s.materials[n])&&u.blending==v&&u.opacity<1==p){this.setBlending(u.blending);this.renderBuffer(d,h,k,u,s,o)}}else if((u=n)&&u.blending==v&&u.opacity<1==p){this.setBlending(u.blending);this.renderBuffer(d,h,k,u,s,o)}}};this.render=function(d,h,k){var o,s,v,p,n=d.lights,w=d.fog;this.initWebGLObjects(d);if(k&&!k.__webGLFramebuffer){k.__webGLFramebuffer=b.createFramebuffer();
 k.__webGLRenderbuffer=b.createRenderbuffer();k.__webGLTexture=b.createTexture();b.bindRenderbuffer(b.RENDERBUFFER,k.__webGLRenderbuffer);b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,k.width,k.height);b.bindTexture(b.TEXTURE_2D,k.__webGLTexture);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,j(k.wrap_s));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,j(k.wrap_t));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,j(k.mag_filter));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,j(k.min_filter));
 k.__webGLRenderbuffer=b.createRenderbuffer();k.__webGLTexture=b.createTexture();b.bindRenderbuffer(b.RENDERBUFFER,k.__webGLRenderbuffer);b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,k.width,k.height);b.bindTexture(b.TEXTURE_2D,k.__webGLTexture);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,j(k.wrap_s));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,j(k.wrap_t));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,j(k.mag_filter));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,j(k.min_filter));
-b.texImage2D(b.TEXTURE_2D,0,j(k.format),k.width,k.height,0,j(k.format),j(k.type),null);b.bindFramebuffer(b.FRAMEBUFFER,k.__webGLFramebuffer);b.framebufferTexture2D(b.FRAMEBUFFER,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,k.__webGLTexture,0);b.framebufferRenderbuffer(b.FRAMEBUFFER,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,k.__webGLRenderbuffer);b.bindTexture(b.TEXTURE_2D,null);b.bindRenderbuffer(b.RENDERBUFFER,null);b.bindFramebuffer(b.FRAMEBUFFER,null)}b.bindFramebuffer(b.FRAMEBUFFER,k?k.__webGLFramebuffer:null)}this.autoClear&&
+b.texImage2D(b.TEXTURE_2D,0,j(k.format),k.width,k.height,0,j(k.format),j(k.type),null);b.bindFramebuffer(b.FRAMEBUFFER,k.__webGLFramebuffer);b.framebufferTexture2D(b.FRAMEBUFFER,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,k.__webGLTexture,0);b.framebufferRenderbuffer(b.FRAMEBUFFER,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,k.__webGLRenderbuffer);b.bindTexture(b.TEXTURE_2D,null);b.bindRenderbuffer(b.RENDERBUFFER,null);b.bindFramebuffer(b.FRAMEBUFFER,null)}b.bindFramebuffer(b.FRAMEBUFFER,k?k.__webGLFramebuffer:null);this.autoClear&&
 this.clear();h.autoUpdateMatrix&&h.updateMatrix();E.set(h.matrix.flatten());C.set(h.projectionMatrix.flatten());o=0;for(s=d.__webGLObjects.length;o<s;o++){v=d.__webGLObjects[o];p=v.object;v=v.buffer;if(p.visible){this.setupMatrices(p,h);this.renderPass(h,n,w,p,v,THREE.NormalBlending,false)}}o=0;for(s=d.__webGLObjects.length;o<s;o++){v=d.__webGLObjects[o];p=v.object;v=v.buffer;if(p.visible){this.setupMatrices(p,h);this.renderPass(h,n,w,p,v,THREE.AdditiveBlending,false);this.renderPass(h,n,w,p,v,THREE.SubtractiveBlending,
 this.clear();h.autoUpdateMatrix&&h.updateMatrix();E.set(h.matrix.flatten());C.set(h.projectionMatrix.flatten());o=0;for(s=d.__webGLObjects.length;o<s;o++){v=d.__webGLObjects[o];p=v.object;v=v.buffer;if(p.visible){this.setupMatrices(p,h);this.renderPass(h,n,w,p,v,THREE.NormalBlending,false)}}o=0;for(s=d.__webGLObjects.length;o<s;o++){v=d.__webGLObjects[o];p=v.object;v=v.buffer;if(p.visible){this.setupMatrices(p,h);this.renderPass(h,n,w,p,v,THREE.AdditiveBlending,false);this.renderPass(h,n,w,p,v,THREE.SubtractiveBlending,
 false);this.renderPass(h,n,w,p,v,THREE.AdditiveBlending,true);this.renderPass(h,n,w,p,v,THREE.SubtractiveBlending,true);this.renderPass(h,n,w,p,v,THREE.NormalBlending,true)}}if(k&&k.min_filter!==THREE.NearestFilter&&k.min_filter!==THREE.LinearFilter){b.bindTexture(b.TEXTURE_2D,k.__webGLTexture);b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,null)}};this.initWebGLObjects=function(d){function h(t,i,u,I){if(t[i]==undefined){d.__webGLObjects.push({buffer:u,object:I});t[i]=1}}var k,o,s,v,p,
 false);this.renderPass(h,n,w,p,v,THREE.AdditiveBlending,true);this.renderPass(h,n,w,p,v,THREE.SubtractiveBlending,true);this.renderPass(h,n,w,p,v,THREE.NormalBlending,true)}}if(k&&k.min_filter!==THREE.NearestFilter&&k.min_filter!==THREE.LinearFilter){b.bindTexture(b.TEXTURE_2D,k.__webGLTexture);b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,null)}};this.initWebGLObjects=function(d){function h(t,i,u,I){if(t[i]==undefined){d.__webGLObjects.push({buffer:u,object:I});t[i]=1}}var k,o,s,v,p,
 n,w;if(!d.__webGLObjects){d.__webGLObjects=[];d.__webGLObjectsMap={}}k=0;for(o=d.objects.length;k<o;k++){s=d.objects[k];p=s.geometry;if(d.__webGLObjectsMap[s.id]==undefined)d.__webGLObjectsMap[s.id]={};w=d.__webGLObjectsMap[s.id];if(s instanceof THREE.Mesh){for(v in p.geometryChunks){n=p.geometryChunks[v];if(!n.__webGLVertexBuffer){this.createMeshBuffers(n);this.initMeshBuffers(n,s);p.__dirtyVertices=true;p.__dirtyElements=true;p.__dirtyUvs=true;p.__dirtyNormals=true;p.__dirtyTangents=true}if(p.__dirtyVertices||
 n,w;if(!d.__webGLObjects){d.__webGLObjects=[];d.__webGLObjectsMap={}}k=0;for(o=d.objects.length;k<o;k++){s=d.objects[k];p=s.geometry;if(d.__webGLObjectsMap[s.id]==undefined)d.__webGLObjectsMap[s.id]={};w=d.__webGLObjectsMap[s.id];if(s instanceof THREE.Mesh){for(v in p.geometryChunks){n=p.geometryChunks[v];if(!n.__webGLVertexBuffer){this.createMeshBuffers(n);this.initMeshBuffers(n,s);p.__dirtyVertices=true;p.__dirtyElements=true;p.__dirtyUvs=true;p.__dirtyNormals=true;p.__dirtyTangents=true}if(p.__dirtyVertices||

+ 2 - 2
build/ThreeExtras.js

@@ -174,9 +174,9 @@ k.image[p]);c.generateMipmap(c.TEXTURE_CUBE_MAP);c.bindTexture(c.TEXTURE_CUBE_MA
 h(k.wrap_t));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,h(k.mag_filter));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,h(k.min_filter));c.generateMipmap(c.TEXTURE_2D);c.bindTexture(c.TEXTURE_2D,null)}c.activeTexture(c.TEXTURE0+d);c.bindTexture(c.TEXTURE_2D,k.__webGLTexture)}}}C=t.attributes;c.bindBuffer(c.ARRAY_BUFFER,v.__webGLVertexBuffer);c.vertexAttribPointer(C.position,3,c.FLOAT,false,0,0);c.enableVertexAttribArray(C.position);if(C.normal>=0){c.bindBuffer(c.ARRAY_BUFFER,v.__webGLNormalBuffer);
 h(k.wrap_t));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,h(k.mag_filter));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,h(k.min_filter));c.generateMipmap(c.TEXTURE_2D);c.bindTexture(c.TEXTURE_2D,null)}c.activeTexture(c.TEXTURE0+d);c.bindTexture(c.TEXTURE_2D,k.__webGLTexture)}}}C=t.attributes;c.bindBuffer(c.ARRAY_BUFFER,v.__webGLVertexBuffer);c.vertexAttribPointer(C.position,3,c.FLOAT,false,0,0);c.enableVertexAttribArray(C.position);if(C.normal>=0){c.bindBuffer(c.ARRAY_BUFFER,v.__webGLNormalBuffer);
 c.vertexAttribPointer(C.normal,3,c.FLOAT,false,0,0);c.enableVertexAttribArray(C.normal)}if(C.tangent>=0){c.bindBuffer(c.ARRAY_BUFFER,v.__webGLTangentBuffer);c.vertexAttribPointer(C.tangent,4,c.FLOAT,false,0,0);c.enableVertexAttribArray(C.tangent)}if(C.uv>=0)if(v.__webGLUVBuffer){c.bindBuffer(c.ARRAY_BUFFER,v.__webGLUVBuffer);c.vertexAttribPointer(C.uv,2,c.FLOAT,false,0,0);c.enableVertexAttribArray(C.uv)}else c.disableVertexAttribArray(C.uv);if(s.wireframe||s instanceof THREE.LineBasicMaterial){C=
 c.vertexAttribPointer(C.normal,3,c.FLOAT,false,0,0);c.enableVertexAttribArray(C.normal)}if(C.tangent>=0){c.bindBuffer(c.ARRAY_BUFFER,v.__webGLTangentBuffer);c.vertexAttribPointer(C.tangent,4,c.FLOAT,false,0,0);c.enableVertexAttribArray(C.tangent)}if(C.uv>=0)if(v.__webGLUVBuffer){c.bindBuffer(c.ARRAY_BUFFER,v.__webGLUVBuffer);c.vertexAttribPointer(C.uv,2,c.FLOAT,false,0,0);c.enableVertexAttribArray(C.uv)}else c.disableVertexAttribArray(C.uv);if(s.wireframe||s instanceof THREE.LineBasicMaterial){C=
 s.wireframe_linewidth!==undefined?s.wireframe_linewidth:s.linewidth!==undefined?s.linewidth:1;s=s instanceof THREE.LineBasicMaterial&&x.type==THREE.LineStrip?c.LINE_STRIP:c.LINES;c.lineWidth(C);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,v.__webGLLineBuffer);c.drawElements(s,v.__webGLLineCount,c.UNSIGNED_SHORT,0)}else{c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,v.__webGLFaceBuffer);c.drawElements(c.TRIANGLES,v.__webGLFaceCount,c.UNSIGNED_SHORT,0)}};this.renderPass=function(d,k,m,s,v,x,t){var p,C,z,n,B;z=0;for(n=
 s.wireframe_linewidth!==undefined?s.wireframe_linewidth:s.linewidth!==undefined?s.linewidth:1;s=s instanceof THREE.LineBasicMaterial&&x.type==THREE.LineStrip?c.LINE_STRIP:c.LINES;c.lineWidth(C);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,v.__webGLLineBuffer);c.drawElements(s,v.__webGLLineCount,c.UNSIGNED_SHORT,0)}else{c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,v.__webGLFaceBuffer);c.drawElements(c.TRIANGLES,v.__webGLFaceCount,c.UNSIGNED_SHORT,0)}};this.renderPass=function(d,k,m,s,v,x,t){var p,C,z,n,B;z=0;for(n=
-s.materials.length;z<n;z++){p=s.materials[z];if(p instanceof THREE.MeshFaceMaterial){p=0;for(C=v.materials.length;p<C;p++)if((B=v.materials[p])&&B.blending==x&&B.opacity<1==t){this.setBlending(B.blending);this.renderBuffer(d,k,m,B,v,s)}}else if((B=p)&&B.blending==x&&B.opacity<1==t){this.setBlending(B.blending);this.renderBuffer(d,k,m,B,v,s)}}};this.render=function(d,k,m){var s,v,x,t,p=d.lights,C=d.fog;this.initWebGLObjects(d);if(m){if(m&&!m.__webGLFramebuffer){m.__webGLFramebuffer=c.createFramebuffer();
+s.materials.length;z<n;z++){p=s.materials[z];if(p instanceof THREE.MeshFaceMaterial){p=0;for(C=v.materials.length;p<C;p++)if((B=v.materials[p])&&B.blending==x&&B.opacity<1==t){this.setBlending(B.blending);this.renderBuffer(d,k,m,B,v,s)}}else if((B=p)&&B.blending==x&&B.opacity<1==t){this.setBlending(B.blending);this.renderBuffer(d,k,m,B,v,s)}}};this.render=function(d,k,m){var s,v,x,t,p=d.lights,C=d.fog;this.initWebGLObjects(d);if(m&&!m.__webGLFramebuffer){m.__webGLFramebuffer=c.createFramebuffer();
 m.__webGLRenderbuffer=c.createRenderbuffer();m.__webGLTexture=c.createTexture();c.bindRenderbuffer(c.RENDERBUFFER,m.__webGLRenderbuffer);c.renderbufferStorage(c.RENDERBUFFER,c.DEPTH_COMPONENT16,m.width,m.height);c.bindTexture(c.TEXTURE_2D,m.__webGLTexture);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,h(m.wrap_s));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,h(m.wrap_t));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,h(m.mag_filter));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,h(m.min_filter));
 m.__webGLRenderbuffer=c.createRenderbuffer();m.__webGLTexture=c.createTexture();c.bindRenderbuffer(c.RENDERBUFFER,m.__webGLRenderbuffer);c.renderbufferStorage(c.RENDERBUFFER,c.DEPTH_COMPONENT16,m.width,m.height);c.bindTexture(c.TEXTURE_2D,m.__webGLTexture);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,h(m.wrap_s));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,h(m.wrap_t));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,h(m.mag_filter));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,h(m.min_filter));
-c.texImage2D(c.TEXTURE_2D,0,h(m.format),m.width,m.height,0,h(m.format),h(m.type),null);c.bindFramebuffer(c.FRAMEBUFFER,m.__webGLFramebuffer);c.framebufferTexture2D(c.FRAMEBUFFER,c.COLOR_ATTACHMENT0,c.TEXTURE_2D,m.__webGLTexture,0);c.framebufferRenderbuffer(c.FRAMEBUFFER,c.DEPTH_ATTACHMENT,c.RENDERBUFFER,m.__webGLRenderbuffer);c.bindTexture(c.TEXTURE_2D,null);c.bindRenderbuffer(c.RENDERBUFFER,null);c.bindFramebuffer(c.FRAMEBUFFER,null)}c.bindFramebuffer(c.FRAMEBUFFER,m?m.__webGLFramebuffer:null)}this.autoClear&&
+c.texImage2D(c.TEXTURE_2D,0,h(m.format),m.width,m.height,0,h(m.format),h(m.type),null);c.bindFramebuffer(c.FRAMEBUFFER,m.__webGLFramebuffer);c.framebufferTexture2D(c.FRAMEBUFFER,c.COLOR_ATTACHMENT0,c.TEXTURE_2D,m.__webGLTexture,0);c.framebufferRenderbuffer(c.FRAMEBUFFER,c.DEPTH_ATTACHMENT,c.RENDERBUFFER,m.__webGLRenderbuffer);c.bindTexture(c.TEXTURE_2D,null);c.bindRenderbuffer(c.RENDERBUFFER,null);c.bindFramebuffer(c.FRAMEBUFFER,null)}c.bindFramebuffer(c.FRAMEBUFFER,m?m.__webGLFramebuffer:null);this.autoClear&&
 this.clear();k.autoUpdateMatrix&&k.updateMatrix();D.set(k.matrix.flatten());w.set(k.projectionMatrix.flatten());s=0;for(v=d.__webGLObjects.length;s<v;s++){x=d.__webGLObjects[s];t=x.object;x=x.buffer;if(t.visible){this.setupMatrices(t,k);this.renderPass(k,p,C,t,x,THREE.NormalBlending,false)}}s=0;for(v=d.__webGLObjects.length;s<v;s++){x=d.__webGLObjects[s];t=x.object;x=x.buffer;if(t.visible){this.setupMatrices(t,k);this.renderPass(k,p,C,t,x,THREE.AdditiveBlending,false);this.renderPass(k,p,C,t,x,THREE.SubtractiveBlending,
 this.clear();k.autoUpdateMatrix&&k.updateMatrix();D.set(k.matrix.flatten());w.set(k.projectionMatrix.flatten());s=0;for(v=d.__webGLObjects.length;s<v;s++){x=d.__webGLObjects[s];t=x.object;x=x.buffer;if(t.visible){this.setupMatrices(t,k);this.renderPass(k,p,C,t,x,THREE.NormalBlending,false)}}s=0;for(v=d.__webGLObjects.length;s<v;s++){x=d.__webGLObjects[s];t=x.object;x=x.buffer;if(t.visible){this.setupMatrices(t,k);this.renderPass(k,p,C,t,x,THREE.AdditiveBlending,false);this.renderPass(k,p,C,t,x,THREE.SubtractiveBlending,
 false);this.renderPass(k,p,C,t,x,THREE.AdditiveBlending,true);this.renderPass(k,p,C,t,x,THREE.SubtractiveBlending,true);this.renderPass(k,p,C,t,x,THREE.NormalBlending,true)}}if(m&&m.min_filter!==THREE.NearestFilter&&m.min_filter!==THREE.LinearFilter){c.bindTexture(c.TEXTURE_2D,m.__webGLTexture);c.generateMipmap(c.TEXTURE_2D);c.bindTexture(c.TEXTURE_2D,null)}};this.initWebGLObjects=function(d){function k(z,n,B,P){if(z[n]==undefined){d.__webGLObjects.push({buffer:B,object:P});z[n]=1}}var m,s,v,x,t,
 false);this.renderPass(k,p,C,t,x,THREE.AdditiveBlending,true);this.renderPass(k,p,C,t,x,THREE.SubtractiveBlending,true);this.renderPass(k,p,C,t,x,THREE.NormalBlending,true)}}if(m&&m.min_filter!==THREE.NearestFilter&&m.min_filter!==THREE.LinearFilter){c.bindTexture(c.TEXTURE_2D,m.__webGLTexture);c.generateMipmap(c.TEXTURE_2D);c.bindTexture(c.TEXTURE_2D,null)}};this.initWebGLObjects=function(d){function k(z,n,B,P){if(z[n]==undefined){d.__webGLObjects.push({buffer:B,object:P});z[n]=1}}var m,s,v,x,t,
 p,C;if(!d.__webGLObjects){d.__webGLObjects=[];d.__webGLObjectsMap={}}m=0;for(s=d.objects.length;m<s;m++){v=d.objects[m];t=v.geometry;if(d.__webGLObjectsMap[v.id]==undefined)d.__webGLObjectsMap[v.id]={};C=d.__webGLObjectsMap[v.id];if(v instanceof THREE.Mesh){for(x in t.geometryChunks){p=t.geometryChunks[x];if(!p.__webGLVertexBuffer){this.createMeshBuffers(p);this.initMeshBuffers(p,v);t.__dirtyVertices=true;t.__dirtyElements=true;t.__dirtyUvs=true;t.__dirtyNormals=true;t.__dirtyTangents=true}if(t.__dirtyVertices||
 p,C;if(!d.__webGLObjects){d.__webGLObjects=[];d.__webGLObjectsMap={}}m=0;for(s=d.objects.length;m<s;m++){v=d.objects[m];t=v.geometry;if(d.__webGLObjectsMap[v.id]==undefined)d.__webGLObjectsMap[v.id]={};C=d.__webGLObjectsMap[v.id];if(v instanceof THREE.Mesh){for(x in t.geometryChunks){p=t.geometryChunks[x];if(!p.__webGLVertexBuffer){this.createMeshBuffers(p);this.initMeshBuffers(p,v);t.__dirtyVertices=true;t.__dirtyElements=true;t.__dirtyUvs=true;t.__dirtyNormals=true;t.__dirtyTangents=true}if(t.__dirtyVertices||

+ 177 - 0
examples/render_to_texture.html

@@ -0,0 +1,177 @@
+<!DOCTYPE HTML>
+<html lang="en">
+    <head>
+        <title>three.js - render-to-texture - webgl</title>
+        <meta charset="utf-8">
+        <style type="text/css">
+            body {
+                color: #ffffff;
+                font-family:Monospace;
+                font-size:13px;
+                text-align:center;
+                font-weight: bold;
+
+                background-color: #000000;
+                margin: 0px;
+                overflow: hidden;
+            }
+
+            #info {
+                position: absolute;
+                top: 0px; width: 100%;
+                padding: 5px;
+            }
+
+            a {
+
+                color: #ffffff;
+            }
+
+        </style>
+    </head>
+    <body>
+
+        <div id="container"></div>
+        <div id="info"><a href="http://github.com/mrdoob/three.js" target="_blank">three.js</a> render-to-texture webgl example</div>
+
+        <script type="text/javascript" src="js/Stats.js"></script>
+        <script type="text/javascript" src="../build/ThreeExtras.js"></script>
+
+        <script id="vertex_shader" type="x-shader/x-vertex">
+            varying vec2 vUv;
+
+            void main()
+            {
+               vUv = uv;
+               gl_Position = vec4( position, 1.0 );
+           }
+        </script>
+
+        <script id="fragment_shader_pass_1" type="x-shader/x-fragment">
+			varying vec2 vUv;
+			uniform float time;
+			
+            void main(void)
+            {
+                gl_FragColor = vec4( time, vUv.x, vUv.y, 1.0 );
+            }
+        </script>
+
+        <script type="text/javascript">
+
+            var container, stats;
+
+            var cameraRTT, camera, sceneRTT, scene, renderer;
+
+			var mouseX = 0, mouseY = 0;
+			
+			var windowHalfX = window.innerWidth / 2;
+			var windowHalfY = window.innerHeight / 2;
+			
+            var rtTexture, material, quad;
+
+            init();
+            setInterval( loop, 1000 / 60 );
+
+            function init() {
+
+                container = document.getElementById( 'container' );
+
+                cameraRTT = new THREE.Camera();
+                cameraRTT.position.z = 100;
+
+				camera = new THREE.Camera( 30, window.innerWidth / window.innerHeight, 1, 10000 );
+				camera.position.z = 100;
+				camera.updateMatrix();
+
+                sceneRTT = new THREE.Scene();
+				scene = new THREE.Scene();
+
+				var light = new THREE.DirectionalLight( 0xffffff );
+				light.position.x = 0;
+				light.position.y = 0;
+				light.position.z = 1;
+				light.position.normalize();
+				scene.addLight( light );
+
+                rtTexture = new THREE.RenderTarget( 256, 256 );
+
+                material = new THREE.MeshShaderMaterial( {
+
+                    uniforms: { time: { type: "f", value: 0.0 } },
+                    vertex_shader: document.getElementById( 'vertex_shader' ).textContent,
+                    fragment_shader: document.getElementById( 'fragment_shader_pass_1' ).textContent
+
+                } );
+
+                quad = new THREE.Mesh( new Plane( 2, 2 ), material );
+                sceneRTT.addObject( quad );
+				
+				var n = 5,
+					geometry = new Sphere( 10, 64, 32 ),
+					material2 = new THREE.MeshLambertMaterial( { color:0xffffff, map: rtTexture } );
+					//material2 = new THREE.MeshBasicMaterial( { color:0xffffff, map: rtTexture } );
+				
+				for( var j = 0; j < n; j++ ) {
+					for( var i = 0; i < n; i++ ) {
+					
+						mesh = new THREE.Mesh( geometry, material2 );
+						mesh.position.x = ( i - (n-1)/2 ) * 20;
+						mesh.position.y = ( j - (n-1)/2 ) * 20;
+						scene.addObject( mesh );
+						
+					}
+				}
+
+                renderer = new THREE.WebGLRenderer();
+				renderer.setSize( window.innerWidth, window.innerHeight );
+                container.appendChild( renderer.domElement );
+				
+                stats = new Stats();
+                stats.domElement.style.position = 'absolute';
+                stats.domElement.style.top = '0px';
+                container.appendChild( stats.domElement );
+				
+				document.addEventListener( 'mousemove', onDocumentMouseMove, false );
+
+            }
+
+			function onDocumentMouseMove( event ) {
+
+				mouseX = ( event.clientX - windowHalfX );
+				mouseY = ( event.clientY - windowHalfY );
+
+			}
+
+			var delta = 0.01;
+			
+            function loop() {
+
+				camera.position.x += ( mouseX - camera.position.x ) * .05;
+				camera.position.y += ( - mouseY - camera.position.y ) * .05;
+
+                // Render to texture
+				
+				if ( material.uniforms.time.value > 1 || material.uniforms.time.value < 0 ) {
+				
+					delta *= -1;
+					
+				}
+					
+				material.uniforms.time.value += delta;
+					
+                renderer.render( sceneRTT, cameraRTT, rtTexture );
+				//renderer.render( sceneRTT, cameraRTT );
+
+                // Render to screen
+				
+                renderer.render( scene, camera );
+
+                stats.update();
+
+            }
+
+        </script>
+
+    </body>
+</html>

+ 2 - 8
src/renderers/WebGLRenderer.js

@@ -908,11 +908,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 		this.initWebGLObjects( scene );
 		this.initWebGLObjects( scene );
 
 
-		if ( renderTarget ) {
-			
-			setRenderTarget( renderTarget );
-			
-		}
+		setRenderTarget( renderTarget );
 		
 		
 		if ( this.autoClear ) {
 		if ( this.autoClear ) {
 			
 			
@@ -1454,8 +1450,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 	function setRenderTarget( renderTexture ) {
 	function setRenderTarget( renderTexture ) {
 
 
-		var framebuffer;
-
 		if ( renderTexture && !renderTexture.__webGLFramebuffer ) {
 		if ( renderTexture && !renderTexture.__webGLFramebuffer ) {
 			
 			
 			renderTexture.__webGLFramebuffer = _gl.createFramebuffer();
 			renderTexture.__webGLFramebuffer = _gl.createFramebuffer();
@@ -1490,7 +1484,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 			
 			
 		}
 		}
 
 
-		framebuffer = renderTexture ? renderTexture.__webGLFramebuffer : null;
+		var framebuffer = renderTexture ? renderTexture.__webGLFramebuffer : null;
 		_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
 		_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
 
 
 	};
 	};