|
@@ -658,7 +658,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
- this.render = function( scene, camera ) {
|
|
|
+ this.render = function( scene, camera, renderTarget ) {
|
|
|
|
|
|
var o, ol, webGLObject, object, buffer,
|
|
|
lights = scene.lights,
|
|
@@ -666,6 +666,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
this.initWebGLObjects( scene );
|
|
|
|
|
|
+ setRenderTarget( renderTarget );
|
|
|
+
|
|
|
if ( this.autoClear ) {
|
|
|
|
|
|
this.clear();
|
|
@@ -1159,6 +1161,44 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
+ function setRenderTarget( renderTexture ) {
|
|
|
+
|
|
|
+ var framebuffer;
|
|
|
+
|
|
|
+ if ( renderTexture && !renderTexture.__webGLFramebuffer ) {
|
|
|
+ renderTexture.__webGLFramebuffer = _gl.createFramebuffer();
|
|
|
+ renderTexture.__webGLRenderbuffer = _gl.createRenderbuffer();
|
|
|
+ renderTexture.__webGLTexture = _gl.createTexture();
|
|
|
+
|
|
|
+ // Setup renderbuffer
|
|
|
+ _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
|
|
|
+ _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTexture.width, renderTexture.height );
|
|
|
+
|
|
|
+ // Setup texture
|
|
|
+ _gl.bindTexture( _gl.TEXTURE_2D, renderTexture.__webGLTexture );
|
|
|
+ _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, paramThreeToGL( renderTexture.wrap_s ) );
|
|
|
+ _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, paramThreeToGL( renderTexture.wrap_t ) );
|
|
|
+ _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( renderTexture.mag_filter ) );
|
|
|
+ _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( renderTexture.min_filter ) );
|
|
|
+ _gl.generateMipmap(_gl.TEXTURE_2D);
|
|
|
+ _gl.texImage2D( _gl.TEXTURE_2D, 0, paramThreeToGL( renderTexture.format ), renderTexture.width, renderTexture.height, 0, paramThreeToGL( renderTexture.format ), paramThreeToGL( renderTexture.type ), null);
|
|
|
+
|
|
|
+ // Setup framebuffer
|
|
|
+ _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTexture.__webGLFramebuffer );
|
|
|
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, renderTexture.__webGLTexture, 0 );
|
|
|
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer);
|
|
|
+
|
|
|
+ // Release everything
|
|
|
+ _gl.bindTexture( _gl.TEXTURE_2D, null );
|
|
|
+ _gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
|
|
|
+ _gl.bindFramebuffer( _gl.FRAMEBUFFER, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ framebuffer = renderTexture ? renderTexture.__webGLFramebuffer : null;
|
|
|
+ _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
function cacheUniformLocations( program, identifiers ) {
|
|
|
|
|
|
var i, l, id;
|
|
@@ -1229,6 +1269,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
case THREE.LinearMipMapNearestFilter: return _gl.LINEAR_MIPMAP_NEAREST; break;
|
|
|
case THREE.LinearMipMapLinearFilter: return _gl.LINEAR_MIPMAP_LINEAR; break;
|
|
|
|
|
|
+ case THREE.RGBFormat: return _gl.RGB; break;
|
|
|
+
|
|
|
+ case THREE.UnsignedByteType: return _gl.UNSIGNED_BYTE; break;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
return 0;
|