Просмотр исходного кода

Renderers: Set premultipliedAlpha to true when using MultiplyBlending or SubtractiveBlending.

Mr.doob 4 месяцев назад
Родитель
Сommit
f02e6c16d9

+ 11 - 10
src/renderers/webgl-fallback/utils/WebGLState.js

@@ -376,16 +376,6 @@ class WebGLState {
 							gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE );
 							break;
 
-						case SubtractiveBlending:
-							warnOnce( 'WebGLState: SubtractiveBlending works best with material.premultipliedAlpha = true.' );
-							gl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );
-							break;
-
-						case MultiplyBlending:
-							warnOnce( 'WebGLState: MultiplyBlending works best with material.premultipliedAlpha = true.' );
-							gl.blendFuncSeparate( gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE );
-							break;
-
 						default:
 							error( 'WebGLState: Invalid blending: ', blending );
 							break;
@@ -751,6 +741,17 @@ class WebGLState {
 
 		this.setFlipSided( flipSided );
 
+		if ( material.premultipliedAlpha === false ) {
+
+			if ( material.blending === MultiplyBlending || material.blending === SubtractiveBlending ) {
+
+				warnOnce( 'WebGLState: Material premultipliedAlpha was set to true because MultiplyBlending and SubtractiveBlending require it.' );
+				material.premultipliedAlpha = true;
+
+			}
+
+		}
+
 		( material.blending === NormalBlending && material.transparent === false )
 			? this.setBlending( NoBlending )
 			: this.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );

+ 11 - 10
src/renderers/webgl/WebGLState.js

@@ -689,16 +689,6 @@ function WebGLState( gl, extensions ) {
 							gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE );
 							break;
 
-						case SubtractiveBlending:
-							warnOnce( 'WebGLState: SubtractiveBlending works best with material.premultipliedAlpha = true.' );
-							gl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );
-							break;
-
-						case MultiplyBlending:
-							warnOnce( 'WebGLState: MultiplyBlending works best with material.premultipliedAlpha = true.' );
-							gl.blendFuncSeparate( gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE );
-							break;
-
 						default:
 							error( 'WebGLState: Invalid blending: ', blending );
 							break;
@@ -774,6 +764,17 @@ function WebGLState( gl, extensions ) {
 
 		setFlipSided( flipSided );
 
+		if ( material.premultipliedAlpha === false ) {
+
+			if ( material.blending === MultiplyBlending || material.blending === SubtractiveBlending ) {
+
+				warnOnce( 'WebGLState: Material premultipliedAlpha was set to true because MultiplyBlending and SubtractiveBlending require it.' );
+				material.premultipliedAlpha = true;
+
+			}
+
+		}
+
 		( material.blending === NormalBlending && material.transparent === false )
 			? setBlending( NoBlending )
 			: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );

+ 11 - 10
src/renderers/webgpu/utils/WebGPUPipelineUtils.js

@@ -120,6 +120,17 @@ class WebGPUPipelineUtils {
 
 		let blending;
 
+		if ( material.premultipliedAlpha === false ) {
+
+			if ( material.blending === MultiplyBlending || material.blending === SubtractiveBlending ) {
+
+				warnOnce( 'WebGPURenderer: Material premultipliedAlpha was set to true because MultiplyBlending and SubtractiveBlending require it.' );
+				material.premultipliedAlpha = true;
+
+			}
+
+		}
+
 		if ( material.blending !== NoBlending && ( material.blending !== NormalBlending || material.transparent !== false ) ) {
 
 			blending = this._getBlending( material );
@@ -447,16 +458,6 @@ class WebGPUPipelineUtils {
 						setBlend( GPUBlendFactor.SrcAlpha, GPUBlendFactor.One, GPUBlendFactor.One, GPUBlendFactor.One );
 						break;
 
-					case SubtractiveBlending:
-						warnOnce( 'WebGPURenderer: SubtractiveBlending works best with material.premultipliedAlpha = true.' );
-						setBlend( GPUBlendFactor.Zero, GPUBlendFactor.OneMinusSrc, GPUBlendFactor.Zero, GPUBlendFactor.One );
-						break;
-
-					case MultiplyBlending:
-						warnOnce( 'WebGPURenderer: MultiplyBlending works best with material.premultipliedAlpha = true.' );
-						setBlend( GPUBlendFactor.Dst, GPUBlendFactor.OneMinusSrcAlpha, GPUBlendFactor.Zero, GPUBlendFactor.One );
-						break;
-
 				}
 
 			}

粤ICP备19079148号