Procházet zdrojové kódy

RenderTarget: Add `resolveStencilBuffer`. (#28096)

* RenderTarget: Add `resolveStencilBuffer`.

* Docs: Simplify `resolveStencilBuffer` description.
Michael Herzog před 1 rokem
rodič
revize
b6ab3c4309

+ 7 - 0
docs/api/ar/renderers/WebGLRenderTarget.html

@@ -48,6 +48,7 @@
 		<br />
 		<br />
 		[page:Boolean depthBuffer] - الافتراضي هو `true`. <br />
 		[page:Boolean depthBuffer] - الافتراضي هو `true`. <br />
 		[page:Boolean stencilBuffer] - الافتراضي هو `false`. <br />
 		[page:Boolean stencilBuffer] - الافتراضي هو `false`. <br />
+		[page:Boolean resolveStencilBuffer] - الافتراضي هو `true`. <br />
 		[page:Number samples] - الافتراضي هو 0. <br /><br />
 		[page:Number samples] - الافتراضي هو 0. <br /><br />
 		 
 		 
 		ينشئ جديدًا [name]
 		ينشئ جديدًا [name]
@@ -86,6 +87,12 @@
 	 
 	 
 		<h3>[property:Boolean stencilBuffer]</h3>
 		<h3>[property:Boolean stencilBuffer]</h3>
 		<p>يعرض على مخزن القالب. الافتراضي هو false.</p>
 		<p>يعرض على مخزن القالب. الافتراضي هو false.</p>
+
+		<h3>[property:Boolean resolveStencilBuffer]</h3>
+		<p>
+			Defines whether the stencil buffer should be resolved when rendering into a multisampled render target. 
+			Default is `true`.
+		</p>
 	 
 	 
 		<h3>[property:DepthTexture depthTexture]</h3>
 		<h3>[property:DepthTexture depthTexture]</h3>
 		<p>
 		<p>

+ 7 - 0
docs/api/en/renderers/WebGLRenderTarget.html

@@ -49,6 +49,7 @@
 			<br />
 			<br />
 			[page:Boolean depthBuffer] - default is `true`. <br />
 			[page:Boolean depthBuffer] - default is `true`. <br />
 			[page:Boolean stencilBuffer] - default is `false`.<br />
 			[page:Boolean stencilBuffer] - default is `false`.<br />
+			[page:Boolean resolveStencilBuffer] - default is `true`.<br />
 			[page:Number samples] - default is `0`.<br />
 			[page:Number samples] - default is `0`.<br />
 			[page:Number count] - default is `1`.<br /><br />
 			[page:Number count] - default is `1`.<br /><br />
 
 
@@ -96,6 +97,12 @@
 		<h3>[property:Boolean stencilBuffer]</h3>
 		<h3>[property:Boolean stencilBuffer]</h3>
 		<p>Renders to the stencil buffer. Default is false.</p>
 		<p>Renders to the stencil buffer. Default is false.</p>
 
 
+		<h3>[property:Boolean resolveStencilBuffer]</h3>
+		<p>
+			Defines whether the stencil buffer should be resolved when rendering into a multisampled render target. 
+			Default is `true`.
+		</p>
+
 		<h3>[property:DepthTexture depthTexture]</h3>
 		<h3>[property:DepthTexture depthTexture]</h3>
 		<p>
 		<p>
 			If set, the scene depth will be rendered to this texture. Default is null.
 			If set, the scene depth will be rendered to this texture. Default is null.

+ 7 - 0
docs/api/it/renderers/WebGLRenderTarget.html

@@ -42,6 +42,7 @@
 		[page:Constant colorSpace] - il valore predefinito è [page:Textures NoColorSpace]. <br />
 		[page:Constant colorSpace] - il valore predefinito è [page:Textures NoColorSpace]. <br />
 		[page:Boolean depthBuffer] - il valore predefinito è `true`. <br />
 		[page:Boolean depthBuffer] - il valore predefinito è `true`. <br />
 		[page:Boolean stencilBuffer] - il valore predefinito è `false`.<br />
 		[page:Boolean stencilBuffer] - il valore predefinito è `false`.<br />
+		[page:Boolean resolveStencilBuffer] - il valore predefinito è `true`.<br />
 		[page:Number samples] - il valore predefinito è 0.<br />
 		[page:Number samples] - il valore predefinito è 0.<br />
 		[page:Number count] - default is `1`.<br /><br />
 		[page:Number count] - default is `1`.<br /><br />
 
 
@@ -101,6 +102,12 @@
 			Effettua il rendering al buffer stencil. Il valore predefinito è `false`.
 			Effettua il rendering al buffer stencil. Il valore predefinito è `false`.
 		</p>
 		</p>
 
 
+		<h3>[property:Boolean resolveStencilBuffer]</h3>
+		<p>
+			Defines whether the stencil buffer should be resolved when rendering into a multisampled render target. 
+			Il valore predefinito è `true`.
+		</p>
+
 		<h3>[property:DepthTexture depthTexture]</h3>
 		<h3>[property:DepthTexture depthTexture]</h3>
 		<p>
 		<p>
 			Se impostato, la profondità della scena verrà renderizzata su questa texture. Il valore predefinito è `null`.
 			Se impostato, la profondità della scena verrà renderizzata su questa texture. Il valore predefinito è `null`.

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

@@ -38,6 +38,7 @@
 		[page:Constant colorSpace] - 默认是[page:Textures NoColorSpace]. <br />
 		[page:Constant colorSpace] - 默认是[page:Textures NoColorSpace]. <br />
 		[page:Boolean depthBuffer] - 默认是`true`.<br />
 		[page:Boolean depthBuffer] - 默认是`true`.<br />
 		[page:Boolean stencilBuffer] - 默认是`false`.<br />
 		[page:Boolean stencilBuffer] - 默认是`false`.<br />
+		[page:Boolean resolveStencilBuffer] - 默认是`true`.<br />
 		[page:Number samples] - 默认是`0`.<br />
 		[page:Number samples] - 默认是`0`.<br />
 		[page:Number count] - default is `1`.<br /><br />
 		[page:Number count] - default is `1`.<br /><br />
 
 
@@ -94,7 +95,13 @@
 
 
 		<h3>[property:Boolean stencilBuffer]</h3>
 		<h3>[property:Boolean stencilBuffer]</h3>
 		<p>
 		<p>
-		渲染到模板缓冲区。默认为false
+		渲染到模板缓冲区。默认为false.
+		</p>
+
+		<h3>[property:Boolean resolveStencilBuffer]</h3>
+		<p>
+			Defines whether the stencil buffer should be resolved when rendering into a multisampled render target. 
+			默认为`true`.
 		</p>
 		</p>
 
 
 		<h3>[property:DepthTexture depthTexture]</h3>
 		<h3>[property:DepthTexture depthTexture]</h3>

+ 5 - 0
src/core/RenderTarget.js

@@ -34,6 +34,7 @@ class RenderTarget extends EventDispatcher {
 			minFilter: LinearFilter,
 			minFilter: LinearFilter,
 			depthBuffer: true,
 			depthBuffer: true,
 			stencilBuffer: false,
 			stencilBuffer: false,
+			resolveStencilBuffer: true,
 			depthTexture: null,
 			depthTexture: null,
 			samples: 0,
 			samples: 0,
 			count: 1
 			count: 1
@@ -58,6 +59,8 @@ class RenderTarget extends EventDispatcher {
 		this.depthBuffer = options.depthBuffer;
 		this.depthBuffer = options.depthBuffer;
 		this.stencilBuffer = options.stencilBuffer;
 		this.stencilBuffer = options.stencilBuffer;
 
 
+		this.resolveStencilBuffer = options.resolveStencilBuffer;
+
 		this.depthTexture = options.depthTexture;
 		this.depthTexture = options.depthTexture;
 
 
 		this.samples = options.samples;
 		this.samples = options.samples;
@@ -135,6 +138,8 @@ class RenderTarget extends EventDispatcher {
 		this.depthBuffer = source.depthBuffer;
 		this.depthBuffer = source.depthBuffer;
 		this.stencilBuffer = source.stencilBuffer;
 		this.stencilBuffer = source.stencilBuffer;
 
 
+		this.resolveStencilBuffer = source.resolveStencilBuffer;
+
 		if ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();
 		if ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();
 
 
 		this.samples = source.samples;
 		this.samples = source.samples;

+ 2 - 4
src/renderers/WebGLRenderer.js

@@ -1404,12 +1404,10 @@ class WebGLRenderer {
 					type: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,
 					type: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,
 					minFilter: LinearMipmapLinearFilter,
 					minFilter: LinearMipmapLinearFilter,
 					samples: 4,
 					samples: 4,
-					stencilBuffer: stencil
+					stencilBuffer: stencil,
+					resolveStencilBuffer: false
 				} );
 				} );
 
 
-				const renderTargetProperties = properties.get( currentRenderState.state.transmissionRenderTarget );
-				renderTargetProperties.__isTransmissionRenderTarget = true;
-
 				// debug
 				// debug
 
 
 				/*
 				/*

+ 1 - 1
src/renderers/webgl/WebGLTextures.js

@@ -1880,7 +1880,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 
 					// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)
 					// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)
 
 
-					if ( renderTarget.stencilBuffer && renderTargetProperties.__isTransmissionRenderTarget !== true ) mask |= _gl.STENCIL_BUFFER_BIT;
+					if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
 
 
 				}
 				}