Browse Source

Merge pull request #16269 from Usnul/dev

Mechanism to opt-out from shader compiler error checking
Mr.doob 6 years ago
parent
commit
1bb851f8de

+ 9 - 0
docs/api/en/renderers/WebGLRenderer.html

@@ -92,6 +92,15 @@
 			Default is *true*.
 			Default is *true*.
 		</p>
 		</p>
 
 
+		<h3>[property:Boolean debug.checkShaderErrors]</h3>
+		<p>
+			If [page:.checkShaderErrors checkShaderErrors] is true, defines whether material shader programs are checked
+			for errors during compilation and linkage process. It may be useful to disable this check in production for performance gain.
+			It is strongly recommended to keep these checks enabled during development.
+			If the shader does not compile and link - it will not work and associated material will not render.
+			Default is *true*.
+		</p>
+
 		<h3>[property:Object capabilities]</h3>
 		<h3>[property:Object capabilities]</h3>
 		<p>
 		<p>
 		An object containing details about the capabilities of the current [link:https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext RenderingContext].<br />
 		An object containing details about the capabilities of the current [link:https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext RenderingContext].<br />

+ 9 - 0
docs/api/zh/renderers/WebGLRenderer.html

@@ -79,6 +79,15 @@
 			默认是*true*
 			默认是*true*
 		</p>
 		</p>
 
 
+		<h3>[property:Boolean debug.checkShaderErrors]</h3>
+		<p>
+			如果[page:.checkShaderErrors checkShaderErrors]为true,定义是否检查材质着色器程序
+			编译和链接过程中的错误。 禁用此检查生产以获得性能增益可能很有用。
+			强烈建议在开发期间保持启用这些检查。
+			如果着色器没有编译和链接 - 它将无法工作,并且相关材料将不会呈现。
+			默认是*true*
+		</p>
+
 		<h3>[property:Object capabilities]</h3>
 		<h3>[property:Object capabilities]</h3>
 		<p>
 		<p>
             一个包含当前渲染环境([link:https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext RenderingContext])的功能细节的对象。<br />
             一个包含当前渲染环境([link:https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext RenderingContext])的功能细节的对象。<br />

+ 10 - 1
src/renderers/WebGLRenderer.js

@@ -77,6 +77,16 @@ function WebGLRenderer( parameters ) {
 	this.domElement = _canvas;
 	this.domElement = _canvas;
 	this.context = null;
 	this.context = null;
 
 
+	// Debug configuration container
+	this.debug = {
+
+		/**
+		 * Enables error checking and reporting when shader programs are being compiled
+		 * @type {boolean}
+		 */
+		checkShaderErrors: false
+	};
+
 	// clearing
 	// clearing
 
 
 	this.autoClear = true;
 	this.autoClear = true;
@@ -2601,5 +2611,4 @@ function WebGLRenderer( parameters ) {
 
 
 }
 }
 
 
-
 export { WebGLRenderer };
 export { WebGLRenderer };

+ 36 - 31
src/renderers/webgl/WebGLProgram.js

@@ -583,8 +583,8 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters,
 	// console.log( '*VERTEX*', vertexGlsl );
 	// console.log( '*VERTEX*', vertexGlsl );
 	// console.log( '*FRAGMENT*', fragmentGlsl );
 	// console.log( '*FRAGMENT*', fragmentGlsl );
 
 
-	var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );
-	var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );
+	var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl, renderer.debug.checkShaderErrors );
+	var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl, renderer.debug.checkShaderErrors );
 
 
 	gl.attachShader( program, glVertexShader );
 	gl.attachShader( program, glVertexShader );
 	gl.attachShader( program, glFragmentShader );
 	gl.attachShader( program, glFragmentShader );
@@ -604,56 +604,61 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters,
 
 
 	gl.linkProgram( program );
 	gl.linkProgram( program );
 
 
-	var programLog = gl.getProgramInfoLog( program ).trim();
-	var vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();
-	var fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();
+	// check for link errors
+	if ( renderer.debug.checkShaderErrors ) {
 
 
-	var runnable = true;
-	var haveDiagnostics = true;
+		var programLog = gl.getProgramInfoLog( program ).trim();
+		var vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();
+		var fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();
 
 
-	// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );
-	// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );
+		var runnable = true;
+		var haveDiagnostics = true;
 
 
-	if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {
+		// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );
+		// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );
 
 
-		runnable = false;
+		if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {
 
 
-		console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );
+			runnable = false;
 
 
-	} else if ( programLog !== '' ) {
+			console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );
 
 
-		console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );
+		} else if ( programLog !== '' ) {
 
 
-	} else if ( vertexLog === '' || fragmentLog === '' ) {
+			console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );
 
 
-		haveDiagnostics = false;
+		} else if ( vertexLog === '' || fragmentLog === '' ) {
 
 
-	}
+			haveDiagnostics = false;
 
 
-	if ( haveDiagnostics ) {
+		}
 
 
-		this.diagnostics = {
+		if ( haveDiagnostics ) {
 
 
-			runnable: runnable,
-			material: material,
+			this.diagnostics = {
 
 
-			programLog: programLog,
+				runnable: runnable,
+				material: material,
 
 
-			vertexShader: {
+				programLog: programLog,
 
 
-				log: vertexLog,
-				prefix: prefixVertex
+				vertexShader: {
 
 
-			},
+					log: vertexLog,
+					prefix: prefixVertex
 
 
-			fragmentShader: {
+				},
 
 
-				log: fragmentLog,
-				prefix: prefixFragment
+				fragmentShader: {
 
 
-			}
+					log: fragmentLog,
+					prefix: prefixFragment
 
 
-		};
+				}
+
+			};
+
+		}
 
 
 	}
 	}
 
 

+ 1 - 1
src/renderers/webgl/WebGLShader.d.ts

@@ -1,3 +1,3 @@
 export class WebGLShader {
 export class WebGLShader {
-  constructor(gl: any, type: string, string: string);
+  constructor(gl: any, type: string, string: string, debug: boolean);
 }
 }

+ 10 - 6
src/renderers/webgl/WebGLShader.js

@@ -16,22 +16,26 @@ function addLineNumbers( string ) {
 
 
 }
 }
 
 
-function WebGLShader( gl, type, string ) {
+function WebGLShader( gl, type, string, debug ) {
 
 
 	var shader = gl.createShader( type );
 	var shader = gl.createShader( type );
 
 
 	gl.shaderSource( shader, string );
 	gl.shaderSource( shader, string );
 	gl.compileShader( shader );
 	gl.compileShader( shader );
 
 
-	if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {
+	if ( debug === true ) {
 
 
-		console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' );
+		if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {
 
 
-	}
+			console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' );
+
+		}
+
+		if ( gl.getShaderInfoLog( shader ) !== '' ) {
 
 
-	if ( gl.getShaderInfoLog( shader ) !== '' ) {
+			console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );
 
 
-		console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );
+		}
 
 
 	}
 	}