Browse Source

RenderTarget: add count option for MRT (#26427)

* WebGLRenderTarget: add count option for MRT

* WebGLRenderTarget: resize all attachments

* Cleanup MRT textures code

* Docs: cleanup

* Move changes

* RenderTarget: fix conflicts

* Legacy: update deprecation version

* Legacy: update deprecation hint
Cody Bennett 1 year ago
parent
commit
066664a407

+ 0 - 75
docs/api/ar/renderers/WebGLMultipleRenderTargets.html

@@ -1,75 +0,0 @@
-<!DOCTYPE html>
-<html lang="ar">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body class="rtl">
-		[page:WebGLRenderTarget] &rarr;
-
-		<h1>[name]</h1>
-
-		<p class="desc">
-		هدف عرض خاص يتيح لشادر الجزء الكتابة إلى عدة
-		قوام. هذا النهج مفيد لتقنيات العرض المتقدمة مثل
-		معالجة ما بعد الإنتاج أو العرض المؤجل. انتبه: [name] يمكن استخدامه فقط
-		مع سياق عرض WebGL 2.
-		</p>
-		 
-		<h2>أمثلة (Examples)</h2>
-		 
-		<p>
-		[example:webgl2_multiple_rendertargets webgl2 / multiple / rendertargets ]
-		</p>
-		 
-		<h2>المنشئ (Constructor)</h2>
-		 
-		<h3>
-		[name]([param:Number width], [param:Number height], [param:Number count],
-		[param:Object options])
-		</h3>
-		 
-		<p>
-		[page:Number width] - عرض هدف العرض. الافتراضي هو `1`.<br />
-		[page:Number height] - ارتفاع هدف العرض. الافتراضي هو `1`.<br />
-		[page:Number count] - عدد أهداف العرض. الافتراضي هو `1`.<br />
-		 
-		options - (كائن اختياري يحمل معلمات القوام لـ
-		قوام الهدف المُنشأ تلقائيًا وعمق المخزن/مخططات المخزن booleans. لـ
-		شرح معلمات القوام انظر [page:Texture Texture]. لـ
-		قائمة بالخيارات الصالحة ، انظر [page:WebGLRenderTarget WebGLRenderTarget]).<br /><br />
-		</p>
-		 
-		<h2>الخصائص (Properties)</h2>
-		 
-		<h3>[property:Boolean isWebGLMultipleRenderTargets]</h3>
-		<p>علامة للقراءة فقط للتحقق مما إذا كان كائنًا معينًا من نوع [name].</p>
-		 
-		<h3>[property:Array texture]</h3>
-		<p>
-		يتم استبدال خاصية القوام في [name] واستبدالها بمصفوفة.
-		تحتوي هذه المصفوفة على مراجع [page:WebGLRenderTarget.texture texture]
-		من أهداف العرض المعنية.
-		</p>
-		 
-		<p>
-		خصائص [page:WebGLRenderTarget WebGLRenderTarget] متوفرة على
-		هذه الفئة.
-		</p>
-		 
-		<h2>الطرق (Methods)</h2>
-		 
-		<p>
-		طرق [page:WebGLRenderTarget WebGLRenderTarget] متوفرة على هذه
-		فئة.
-		</p>
-
-		<h2>المصدر (Source)</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-		</p>
-	</body>
-</html>

+ 0 - 75
docs/api/en/renderers/WebGLMultipleRenderTargets.html

@@ -1,75 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body>
-		[page:WebGLRenderTarget] &rarr;
-
-		<h1>[name]</h1>
-
-		<p class="desc">
-			A special render target that enables a fragment shader to write to several
-			textures. This approach is useful for advanced rendering techniques like
-			post-processing or deferred rendering. Heads up: [name] can only be used
-			with a WebGL 2 rendering context.
-		</p>
-
-		<h2>Examples</h2>
-
-		<p>
-			[example:webgl2_multiple_rendertargets webgl2 / multiple / rendertargets ]
-		</p>
-
-		<h2>Constructor</h2>
-
-		<h3>
-			[name]([param:Number width], [param:Number height], [param:Number count],
-			[param:Object options])
-		</h3>
-
-		<p>
-			[page:Number width] - The width of the render target. Default is `1`.<br />
-			[page:Number height] - The height of the render target. Default is `1`.<br />
-			[page:Number count] - The number of render targets. Default is `1`.<br />
-
-			options - (optional object that holds texture parameters for an
-			auto-generated target texture and depthBuffer/stencilBuffer booleans. For
-			an explanation of the texture parameters see [page:Texture Texture]. For a
-			list of valid options, see [page:WebGLRenderTarget WebGLRenderTarget]).<br /><br />
-		</p>
-
-		<h2>Properties</h2>
-
-		<h3>[property:Boolean isWebGLMultipleRenderTargets]</h3>
-		<p>Read-only flag to check if a given object is of type [name].</p>
-
-		<h3>[property:Array texture]</h3>
-		<p>
-			The texture property is overwritten in [name] and replaced with an array.
-			This array holds the [page:WebGLRenderTarget.texture texture] references
-			of the respective render targets.
-		</p>
-
-		<p>
-			[page:WebGLRenderTarget WebGLRenderTarget] properties are available on
-			this class.
-		</p>
-
-		<h2>Methods</h2>
-
-		<p>
-			[page:WebGLRenderTarget WebGLRenderTarget] methods are available on this
-			class.
-		</p>
-
-		<h2>Source</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-		</p>
-	</body>
-</html>

+ 8 - 1
docs/api/en/renderers/WebGLRenderTarget.html

@@ -49,7 +49,8 @@
 			<br />
 			[page:Boolean depthBuffer] - default is `true`. <br />
 			[page:Boolean stencilBuffer] - default is `false`.<br />
-			[page:Number samples] - default is `0`.<br /><br />
+			[page:Number samples] - default is `0`.<br />
+			[page:Number count] - default is `1`.<br /><br />
 
 			Creates a new [name]
 		</p>
@@ -83,6 +84,12 @@
 			further processing.
 		</p>
 
+		<h3>[property:Texture textures]</h3>
+		<p>
+			An array holding the [page:WebGLRenderTarget.texture texture] references
+			of multiple render targets configured with the [page:Number count] option.
+		</p>
+
 		<h3>[property:Boolean depthBuffer]</h3>
 		<p>Renders to the depth buffer. Default is true.</p>
 

+ 0 - 67
docs/api/it/renderers/WebGLMultipleRenderTargets.html

@@ -1,67 +0,0 @@
-<!DOCTYPE html>
-<html lang="it">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body>
-		[page:WebGLRenderTarget] &rarr;
-
-		<h1>[name]</h1>
-
-		<p class="desc">
-			Un target di rendering speciale che consente a un fragment shader di scrivere su più texture.
-			Questo approccio è utile per le tecniche di rendering avanzate come la post-eleborazione o il rendering differito.
-
-			Attenzione: [name] può solo essere utilizzato in un contesto di rendering WebGL 2.
-		</p>
-
-		<h2>Esempi</h2>
-
-		<p>
-			[example:webgl2_multiple_rendertargets webgl2 / multiple / rendertargets ]
-		</p>
-
-		<h2>Costruttore</h2>
-
-
-		<h3>[name]([param:Number width], [param:Number height], [param:Number count], [param:Object options])</h3>
-
-		<p>
-		[page:Number width] - La larghezza del target di rendering. Il valore predefinito è `1`.<br />
-		[page:Number height] - L'altezza del target di rendering. Il valore predefinito è `1`.<br />
-		[page:Number count] - Il numero di target di rendering. Il valore predefinito è `1`.<br />
-
-		options - (oggetto opzionale che contiene i parametri della texture per una texture target auto generata
-		e i booleani depthBuffer/stencilBuffer. Per una spiegazione dei parametri della texture consultare [page:Texture Texture].
-		Per un elenco di opzioni valide, consultare [page:WebGLRenderTarget WebGLRenderTarget].)<br /><br />
-		</p>
-
-		<h2>Proprietà</h2>
-
-		<h3>[property:Boolean isWebGLMultipleRenderTargets]</h3>
-		<p>
-			Flag di sola lettura per verificare se l'oggetto dato è di tipo [name].
-		</p>
-
-		<h3>[property:Array texture]</h3>
-		<p>
-			La proprietà texture viene sovrascritta in [name] e sostituita con un array. Questo array contiene i
-			riferimenti alla [page:WebGLRenderTarget.texture texture] dei rispettivi target di rendering.
-		</p>
-
-		<p>Le proprietà [page:WebGLRenderTarget WebGLRenderTarget] sono disponibili su questa classe.</p>
-
-		<h2>Metodi</h2>
-
-		<p>I metodi [page:WebGLRenderTarget WebGLRenderTarget] sono disponibili su questa classe.</p>
-
-		<h2>Source</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-		</p>
-	</body>
-</html>

+ 8 - 1
docs/api/it/renderers/WebGLRenderTarget.html

@@ -42,7 +42,8 @@
 		[page:Constant colorSpace] - il valore predefinito è [page:Textures NoColorSpace]. <br />
 		[page:Boolean depthBuffer] - il valore predefinito è `true`. <br />
 		[page:Boolean stencilBuffer] - il valore predefinito è `false`.<br />
-		[page:Number samples] - il valore predefinito è 0.<br /><br />
+		[page:Number samples] - il valore predefinito è 0.<br />
+		[page:Number count] - default is `1`.<br /><br />
 
 		Crea un nuovo [name]
 		</p>
@@ -84,6 +85,12 @@
 			Questa istanza della texture contiene i pixel renderizzati. Utilizzalo come input per ulteriori informazioni.
 		</p>
 
+		<h3>[property:Texture textures]</h3>
+		<p>
+			An array holding the [page:WebGLRenderTarget.texture texture] references
+			of multiple render targets configured with the [page:Number count] option.
+		</p>
+
 		<h3>[property:Boolean depthBuffer]</h3>
 		<p>
 			Effettua il rendering al buffer di profondità. L'impostazione predefinita è `true`.

+ 0 - 61
docs/api/zh/renderers/WebGLMultipleRenderTargets.html

@@ -1,61 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body>
-		[page:WebGLRenderTarget] &rarr;
-
-		<h1>[name]</h1>
-
-		<p class="desc">
-			一个特殊的渲染目标,使片段着色器能够写入多个纹理。这种方法对于高级渲染技术很有用,例如后处理或延迟渲染。
-			
-			注意:[name]只能与 WebGL 2 渲染上下文一起使用。
-		</p>
-
-		<h2>例子(Examples)</h2>
-
-		<p>
-			[example:webgl2_multiple_rendertargets webgl2 / multiple / rendertargets ]
-		</p>
-
-		<h2>构造器(Constructor)</h2>
-
-
-		<h3>[name]([param:Number width], [param:Number height], [param:Number count])</h3>
-
-		<p>
-		[page:Number width] - 渲染目标的宽度。默认为`1`。<br />
-		[page:Number height] - 渲染目标的高度。默认为`1`。<br />
-		[page:Number count] - 渲染目标的数量。默认为`1`。
-		</p>
-
-		<h2>特性(Properties)</h2>
-
-		<h3>[property:Boolean isWebGLMultipleRenderTargets]</h3>
-		<p>
-			只读标志,用于检查给定对象是否属于[name]类型。
-		</p>
-
-		<h3>[property:Array texture]</h3>
-		<p>
-			纹理属性在[name]中被覆盖并替换为数组。该数组包含各个渲染目标的[page:WebGLRenderTarget.texture 纹理]引用。
-		</p>
-
-		<p>[page:WebGLRenderTarget WebGLRenderTarget]属性在此类上可用。</p>
-
-		<h2>方法(Methods)</h2>
-
-		<p>[page:WebGLRenderTarget WebGLRenderTarget]方法在此类上可用。</p>
-
-		<h2>源代码(Source)</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-		</p>
-	</body>
-</html>

+ 8 - 1
docs/api/zh/renderers/WebGLRenderTarget.html

@@ -38,7 +38,8 @@
 		[page:Constant colorSpace] - 默认是[page:Textures NoColorSpace]. <br />
 		[page:Boolean depthBuffer] - 默认是`true`.<br />
 		[page:Boolean stencilBuffer] - 默认是`false`.<br />
-		[page:Number samples] - 默认是`0`.<br /><br />
+		[page:Number samples] - 默认是`0`.<br />
+		[page:Number count] - default is `1`.<br /><br />
 
 		创建一个新[name]
 		</p>
@@ -80,6 +81,12 @@
 		纹理实例保存这渲染的像素,用作进一步处理的输入值
 		</p>
 
+		<h3>[property:Texture textures]</h3>
+		<p>
+			An array holding the [page:WebGLRenderTarget.texture texture] references
+			of multiple render targets configured with the [page:Number count] option.
+		</p>
+
 		<h3>[property:Boolean depthBuffer]</h3>
 		<p>
 		渲染到深度缓冲区。默认true.

+ 0 - 5
docs/list.json

@@ -278,7 +278,6 @@
 			},
 
 			"Renderers": {
-				"WebGLMultipleRenderTargets": "api/en/renderers/WebGLMultipleRenderTargets",
 				"WebGLRenderer": "api/en/renderers/WebGLRenderer",
 				"WebGL1Renderer": "api/en/renderers/WebGL1Renderer",
 				"WebGLRenderTarget": "api/en/renderers/WebGLRenderTarget",
@@ -720,7 +719,6 @@
 			},
 
 			"Renderers": {
-				"WebGLMultipleRenderTargets": "api/ar/renderers/WebGLMultipleRenderTargets",
 				"WebGLRenderer": "api/ar/renderers/WebGLRenderer",
 				"WebGL1Renderer": "api/ar/renderers/WebGL1Renderer",
 				"WebGLRenderTarget": "api/ar/renderers/WebGLRenderTarget",
@@ -1028,7 +1026,6 @@
 			},
 
 			"渲染器": {
-				"WebGLMultipleRenderTargets": "api/zh/renderers/WebGLMultipleRenderTargets",
 				"WebGLRenderer": "api/zh/renderers/WebGLRenderer",
 				"WebGL1Renderer": "api/zh/renderers/WebGL1Renderer",
 				"WebGLRenderTarget": "api/zh/renderers/WebGLRenderTarget",
@@ -1665,7 +1662,6 @@
 			},
 
 			"Renderers": {
-				"WebGLMultipleRenderTargets": "api/it/renderers/WebGLMultipleRenderTargets",
 				"WebGLRenderer": "api/it/renderers/WebGLRenderer",
 				"WebGL1Renderer": "api/it/renderers/WebGL1Renderer",
 				"WebGLRenderTarget": "api/it/renderers/WebGLRenderTarget",
@@ -2193,7 +2189,6 @@
 			},
 
 			"Renderers": {
-				"WebGLMultipleRenderTargets": "api/en/renderers/WebGLMultipleRenderTargets",
 				"WebGLRenderer": "api/en/renderers/WebGLRenderer",
 				"WebGL1Renderer": "api/en/renderers/WebGL1Renderer",
 				"WebGLRenderTarget": "api/en/renderers/WebGLRenderTarget",

+ 10 - 13
examples/webgl2_multiple_rendertargets.html

@@ -157,23 +157,20 @@
 
 				// Create a multi render target with Float buffers
 
-				renderTarget = new THREE.WebGLMultipleRenderTargets(
+				renderTarget = new THREE.WebGLRenderTarget(
 					window.innerWidth * window.devicePixelRatio,
 					window.innerHeight * window.devicePixelRatio,
-					2
+					{
+						count: 2,
+						minFilter: THREE.NearestFilter,
+						magFilter: THREE.NearestFilter
+					}
 				);
 
-				for ( let i = 0, il = renderTarget.texture.length; i < il; i ++ ) {
-
-					renderTarget.texture[ i ].minFilter = THREE.NearestFilter;
-					renderTarget.texture[ i ].magFilter = THREE.NearestFilter;
-
-				}
-
 				// Name our G-Buffer attachments for debugging
 
-				renderTarget.texture[ 0 ].name = 'diffuse';
-				renderTarget.texture[ 1 ].name = 'normal';
+				renderTarget.textures[ 0 ].name = 'diffuse';
+				renderTarget.textures[ 1 ].name = 'normal';
 
 				// Scene setup
 
@@ -216,8 +213,8 @@
 						vertexShader: document.querySelector( '#render-vert' ).textContent.trim(),
 						fragmentShader: document.querySelector( '#render-frag' ).textContent.trim(),
 						uniforms: {
-							tDiffuse: { value: renderTarget.texture[ 0 ] },
-							tNormal: { value: renderTarget.texture[ 1 ] },
+							tDiffuse: { value: renderTarget.textures[ 0 ] },
+							tNormal: { value: renderTarget.textures[ 1 ] },
 						},
 						glslVersion: THREE.GLSL3
 					} )

+ 20 - 0
src/Three.Legacy.js

@@ -1 +1,21 @@
+import { WebGLRenderTarget } from './renderers/WebGLRenderTarget.js';
 
+export class WebGLMultipleRenderTargets extends WebGLRenderTarget { // @deprecated, r162
+
+	constructor( width = 1, height = 1, count = 1, options = {} ) {
+
+		console.warn( 'THREE.WebGLMultipleRenderTargets has been deprecated and will be removed in r172. Use THREE.WebGLRenderTarget and set the "count" parameter to enable MRT.' );
+
+		super( width, height, { ...options, count } );
+
+		this.isWebGLMultipleRenderTargets = true;
+
+	}
+
+	get texture() {
+
+		return this.textures;
+
+	}
+
+}

+ 0 - 1
src/Three.js

@@ -2,7 +2,6 @@ import { REVISION } from './constants.js';
 
 export { WebGLArrayRenderTarget } from './renderers/WebGLArrayRenderTarget.js';
 export { WebGL3DRenderTarget } from './renderers/WebGL3DRenderTarget.js';
-export { WebGLMultipleRenderTargets } from './renderers/WebGLMultipleRenderTargets.js';
 export { WebGLCubeRenderTarget } from './renderers/WebGLCubeRenderTarget.js';
 export { WebGLRenderTarget } from './renderers/WebGLRenderTarget.js';
 export { WebGLRenderer } from './renderers/WebGLRenderer.js';

+ 43 - 11
src/core/RenderTarget.js

@@ -35,15 +35,25 @@ class RenderTarget extends EventDispatcher {
 			depthBuffer: true,
 			stencilBuffer: false,
 			depthTexture: null,
-			samples: 0
+			samples: 0,
+			count: 1
 		}, options );
 
-		this.texture = new Texture( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace );
-		this.texture.isRenderTargetTexture = true;
+		const texture = new Texture( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace );
 
-		this.texture.flipY = false;
-		this.texture.generateMipmaps = options.generateMipmaps;
-		this.texture.internalFormat = options.internalFormat;
+		texture.flipY = false;
+		texture.generateMipmaps = options.generateMipmaps;
+		texture.internalFormat = options.internalFormat;
+
+		this.textures = [];
+
+		const count = options.count;
+		for ( let i = 0; i < count; i ++ ) {
+
+			this.textures[ i ] = texture.clone();
+			this.textures[ i ].isRenderTargetTexture = true;
+
+		}
 
 		this.depthBuffer = options.depthBuffer;
 		this.stencilBuffer = options.stencilBuffer;
@@ -54,6 +64,18 @@ class RenderTarget extends EventDispatcher {
 
 	}
 
+	get texture() {
+
+		return this.textures[ 0 ];
+
+	}
+
+	set texture( value ) {
+
+		this.textures[ 0 ] = value;
+
+	}
+
 	setSize( width, height, depth = 1 ) {
 
 		if ( this.width !== width || this.height !== height || this.depth !== depth ) {
@@ -62,9 +84,13 @@ class RenderTarget extends EventDispatcher {
 			this.height = height;
 			this.depth = depth;
 
-			this.texture.image.width = width;
-			this.texture.image.height = height;
-			this.texture.image.depth = depth;
+			for ( let i = 0, il = this.textures.length; i < il; i ++ ) {
+
+				this.textures[ i ].image.width = width;
+				this.textures[ i ].image.height = height;
+				this.textures[ i ].image.depth = depth;
+
+			}
 
 			this.dispose();
 
@@ -92,8 +118,14 @@ class RenderTarget extends EventDispatcher {
 
 		this.viewport.copy( source.viewport );
 
-		this.texture = source.texture.clone();
-		this.texture.isRenderTargetTexture = true;
+		this.textures.length = 0;
+
+		for ( let i = 0, il = source.textures.length; i < il; i ++ ) {
+
+			this.textures[ i ] = source.textures[ i ].clone();
+			this.textures[ i ].isRenderTargetTexture = true;
+
+		}
 
 		// ensure image object is not shared, see #20328
 

+ 0 - 82
src/renderers/WebGLMultipleRenderTargets.js

@@ -1,82 +0,0 @@
-import { WebGLRenderTarget } from './WebGLRenderTarget.js';
-
-class WebGLMultipleRenderTargets extends WebGLRenderTarget {
-
-	constructor( width = 1, height = 1, count = 1, options = {} ) {
-
-		super( width, height, options );
-
-		this.isWebGLMultipleRenderTargets = true;
-
-		const texture = this.texture;
-
-		this.texture = [];
-
-		for ( let i = 0; i < count; i ++ ) {
-
-			this.texture[ i ] = texture.clone();
-			this.texture[ i ].isRenderTargetTexture = true;
-
-		}
-
-	}
-
-	setSize( width, height, depth = 1 ) {
-
-		if ( this.width !== width || this.height !== height || this.depth !== depth ) {
-
-			this.width = width;
-			this.height = height;
-			this.depth = depth;
-
-			for ( let i = 0, il = this.texture.length; i < il; i ++ ) {
-
-				this.texture[ i ].image.width = width;
-				this.texture[ i ].image.height = height;
-				this.texture[ i ].image.depth = depth;
-
-			}
-
-			this.dispose();
-
-		}
-
-		this.viewport.set( 0, 0, width, height );
-		this.scissor.set( 0, 0, width, height );
-
-	}
-
-	copy( source ) {
-
-		this.dispose();
-
-		this.width = source.width;
-		this.height = source.height;
-		this.depth = source.depth;
-
-		this.scissor.copy( source.scissor );
-		this.scissorTest = source.scissorTest;
-
-		this.viewport.copy( source.viewport );
-
-		this.depthBuffer = source.depthBuffer;
-		this.stencilBuffer = source.stencilBuffer;
-
-		if ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();
-
-		this.texture.length = 0;
-
-		for ( let i = 0, il = source.texture.length; i < il; i ++ ) {
-
-			this.texture[ i ] = source.texture[ i ].clone();
-			this.texture[ i ].isRenderTargetTexture = true;
-
-		}
-
-		return this;
-
-	}
-
-}
-
-export { WebGLMultipleRenderTargets };

+ 6 - 20
src/renderers/webgl/WebGLState.js

@@ -493,33 +493,19 @@ function WebGLState( gl, extensions, capabilities ) {
 
 			}
 
-			if ( renderTarget.isWebGLMultipleRenderTargets ) {
+			const textures = renderTarget.textures;
 
-				const textures = renderTarget.texture;
+			if ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {
 
-				if ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {
+				for ( let i = 0, il = textures.length; i < il; i ++ ) {
 
-					for ( let i = 0, il = textures.length; i < il; i ++ ) {
-
-						drawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;
-
-					}
-
-					drawBuffers.length = textures.length;
-
-					needsUpdate = true;
+					drawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;
 
 				}
 
-			} else {
+				drawBuffers.length = textures.length;
 
-				if ( drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {
-
-					drawBuffers[ 0 ] = gl.COLOR_ATTACHMENT0;
-
-					needsUpdate = true;
-
-				}
+				needsUpdate = true;
 
 			}
 

+ 19 - 37
src/renderers/webgl/WebGLTextures.js

@@ -331,18 +331,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 	function deallocateRenderTarget( renderTarget ) {
 
-		const texture = renderTarget.texture;
-
 		const renderTargetProperties = properties.get( renderTarget );
-		const textureProperties = properties.get( texture );
-
-		if ( textureProperties.__webglTexture !== undefined ) {
-
-			_gl.deleteTexture( textureProperties.__webglTexture );
-
-			info.memory.textures --;
-
-		}
 
 		if ( renderTarget.depthTexture ) {
 
@@ -397,27 +386,24 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 		}
 
-		if ( renderTarget.isWebGLMultipleRenderTargets ) {
-
-			for ( let i = 0, il = texture.length; i < il; i ++ ) {
+		const textures = renderTarget.textures;
 
-				const attachmentProperties = properties.get( texture[ i ] );
-
-				if ( attachmentProperties.__webglTexture ) {
+		for ( let i = 0, il = textures.length; i < il; i ++ ) {
 
-					_gl.deleteTexture( attachmentProperties.__webglTexture );
+			const attachmentProperties = properties.get( textures[ i ] );
 
-					info.memory.textures --;
+			if ( attachmentProperties.__webglTexture ) {
 
-				}
+				_gl.deleteTexture( attachmentProperties.__webglTexture );
 
-				properties.remove( texture[ i ] );
+				info.memory.textures --;
 
 			}
 
+			properties.remove( textures[ i ] );
+
 		}
 
-		properties.remove( texture );
 		properties.remove( renderTarget );
 
 	}
@@ -1546,7 +1532,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 		} else {
 
-			const textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];
+			const textures = renderTarget.textures;
 
 			for ( let i = 0; i < textures.length; i ++ ) {
 
@@ -1710,7 +1696,13 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 		renderTarget.addEventListener( 'dispose', onRenderTargetDispose );
 
-		if ( renderTarget.isWebGLMultipleRenderTargets !== true ) {
+		const textures = renderTarget.textures;
+
+		const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
+		const isMultipleRenderTargets = ( textures.length > 1 );
+		const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;
+
+		if ( ! isMultipleRenderTargets ) {
 
 			if ( textureProperties.__webglTexture === undefined ) {
 
@@ -1723,10 +1715,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 		}
 
-		const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
-		const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );
-		const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;
-
 		// Setup framebuffer
 
 		if ( isCube ) {
@@ -1775,8 +1763,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 				if ( capabilities.drawBuffers ) {
 
-					const textures = renderTarget.texture;
-
 					for ( let i = 0, il = textures.length; i < il; i ++ ) {
 
 						const attachmentProperties = properties.get( textures[ i ] );
@@ -1801,8 +1787,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 			if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {
 
-				const textures = isMultipleRenderTargets ? texture : [ texture ];
-
 				renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
 				renderTargetProperties.__webglColorRenderbuffer = [];
 
@@ -1875,8 +1859,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 		} else if ( isMultipleRenderTargets ) {
 
-			const textures = renderTarget.texture;
-
 			for ( let i = 0, il = textures.length; i < il; i ++ ) {
 
 				const attachment = textures[ i ];
@@ -1955,7 +1937,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 		const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;
 
-		const textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];
+		const textures = renderTarget.textures;
 
 		for ( let i = 0, il = textures.length; i < il; i ++ ) {
 
@@ -1980,14 +1962,14 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 		if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {
 
-			const textures = renderTarget.isWebGLMultipleRenderTargets ? renderTarget.texture : [ renderTarget.texture ];
+			const textures = renderTarget.textures;
 			const width = renderTarget.width;
 			const height = renderTarget.height;
 			let mask = _gl.COLOR_BUFFER_BIT;
 			const invalidationArray = [];
 			const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
 			const renderTargetProperties = properties.get( renderTarget );
-			const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );
+			const isMultipleRenderTargets = ( textures.length > 1 );
 
 			// If MRT we need to remove FBO attachments
 			if ( isMultipleRenderTargets ) {

+ 0 - 59
test/unit/src/renderers/WebGLMultipleRenderTargets.tests.js

@@ -1,59 +0,0 @@
-/* global QUnit */
-
-import { WebGLMultipleRenderTargets } from '../../../../src/renderers/WebGLMultipleRenderTargets.js';
-
-import { WebGLRenderTarget } from '../../../../src/renderers/WebGLRenderTarget.js';
-
-export default QUnit.module( 'Renderers', () => {
-
-	QUnit.module( 'WebGLMultipleRenderTargets', () => {
-
-		// INHERITANCE
-		QUnit.test( 'Extending', ( assert ) => {
-
-			const object = new WebGLMultipleRenderTargets();
-			assert.strictEqual(
-				object instanceof WebGLRenderTarget, true,
-				'WebGLMultipleRenderTargets extends from WebGLRenderTarget'
-			);
-
-		} );
-
-		// INSTANCING
-		QUnit.test( 'Instancing', ( assert ) => {
-
-			const object = new WebGLMultipleRenderTargets();
-			assert.ok( object, 'Can instantiate a WebGLMultipleRenderTargets.' );
-
-		} );
-
-		// PROPERTIES
-		QUnit.todo( 'texture', ( assert ) => {
-
-			// must be Array of texture
-			assert.ok( false, 'everything\'s gonna be alright' );
-
-		} );
-
-		// PUBLIC
-		QUnit.todo( 'isWebGLMultipleRenderTargets', ( assert ) => {
-
-			assert.ok( false, 'everything\'s gonna be alright' );
-
-		} );
-
-		QUnit.todo( 'setSize', ( assert ) => {
-
-			assert.ok( false, 'everything\'s gonna be alright' );
-
-		} );
-
-		QUnit.todo( 'copy', ( assert ) => {
-
-			assert.ok( false, 'everything\'s gonna be alright' );
-
-		} );
-
-	} );
-
-} );

+ 6 - 0
test/unit/src/renderers/WebGLRenderTarget.tests.js

@@ -94,6 +94,12 @@ export default QUnit.module( 'Renderers', () => {
 
 		} );
 
+		QUnit.todo( 'textures', ( assert ) => {
+
+			assert.ok( false, 'everything\'s gonna be alright' );
+
+		} );
+
 		// PUBLIC
 		QUnit.todo( 'isWebGLRenderTarget', ( assert ) => {
 

+ 0 - 1
test/unit/three.source.unit.js

@@ -233,7 +233,6 @@ import './src/renderers/WebGL1Renderer.tests.js';
 import './src/renderers/WebGL3DRenderTarget.tests.js';
 import './src/renderers/WebGLArrayRenderTarget.tests.js';
 import './src/renderers/WebGLCubeRenderTarget.tests.js';
-import './src/renderers/WebGLMultipleRenderTargets.tests.js';
 import './src/renderers/WebGLRenderer.tests.js';
 import './src/renderers/WebGLRenderTarget.tests.js';