瀏覽代碼

added new function readRenderTargetPixels to WebGLRenderer.
It copies RGBA pixels from WebGLRenderTarget to unsigned byte array. Array must be of a size 4 * width * height.
This is useful when doing offscreen rendering and you need to access pixels directly.
Also it is useful when doing windowless rendering (i.e. using node.js) - then this is the only way to get rendered image.

Gatis Kurzemnieks 10 年之前
父節點
當前提交
4eb235111d
共有 1 個文件被更改,包括 27 次插入0 次删除
  1. 27 0
      src/renderers/WebGLRenderer.js

+ 27 - 0
src/renderers/WebGLRenderer.js

@@ -6176,6 +6176,33 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
+	//Read pixels from RGBA rendertarget.
+	this.readRenderTargetPixels = function(renderTarget, x, y, width, height, buffer) {
+
+		if(!(renderTarget && renderTarget instanceof THREE.WebGLRenderTarget))
+			throw new Error( 'renderTarget is not THREE.WebGLRenderTarget!' );
+
+		if(renderTarget.__webglFramebuffer) {
+
+			if(renderTarget.format !== THREE.RGBAFormat)
+				throw new Error( 'Rendertarget is not in RGBA format. readPixels can read only RGBA format!' );
+
+			var restore = false;
+			if ( renderTarget.__webglFramebuffer !== _currentFramebuffer ) {
+				_gl.bindFramebuffer(_gl.FRAMEBUFFER, renderTarget.__webglFramebuffer);
+				restore = true;
+			}
+
+			if (_gl.checkFramebufferStatus(_gl.FRAMEBUFFER) === _gl.FRAMEBUFFER_COMPLETE)
+				_gl.readPixels(x, y, width, height, paramThreeToGL(renderTarget.format), _gl.UNSIGNED_BYTE, buffer);
+			else
+				throw new Error( 'readPixels from rendertarget failed. Framebuffer not complete!' );
+
+			if(restore)
+				_gl.bindFramebuffer(_gl.FRAMEBUFFER, _currentFramebuffer);
+		}
+	};
+
 	function updateRenderTargetMipmap ( renderTarget ) {
 
 		if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {