瀏覽代碼

WebGLRenderer: Made getContext code more robust.

Mr.doob 5 年之前
父節點
當前提交
c5dc00682d
共有 1 個文件被更改,包括 29 次插入11 次删除
  1. 29 11
      src/renderers/WebGLRenderer.js

+ 29 - 11
src/renderers/WebGLRenderer.js

@@ -184,7 +184,21 @@ function WebGLRenderer( parameters ) {
 
 	// initialize
 
-	let _gl;
+	let _gl = _context;
+
+	function getContext( contextNames, contextAttributes ) {
+
+		for ( let i = 0; i < contextNames.length; i ++ ) {
+
+			const contextName = contextNames[ i ];
+			const context = _canvas.getContext( contextName, contextAttributes );
+			if ( context !== null ) return context;
+
+		}
+
+		return null;
+
+	}
 
 	try {
 
@@ -204,25 +218,29 @@ function WebGLRenderer( parameters ) {
 		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
 		_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
 
-		if ( this.isWebGL1Renderer === true ) {
+		if ( _gl === null ) {
+
+			const contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];
 
-			_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );
+			if ( _this.isWebGL1Renderer === true ) {
 
-		} else {
+				contextNames.shift();
 
-			_gl = _context || _canvas.getContext( 'webgl2', contextAttributes ) || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );
+			}
 
-		}
+			_gl = getContext( contextNames, contextAttributes );
 
-		if ( _gl === null ) {
+			if ( _gl === null ) {
 
-			if ( _canvas.getContext( 'webgl2' ) || _canvas.getContext( 'webgl' ) || _canvas.getContext( 'experimental-webgl' ) ) {
+				if ( getContext( contextNames ) ) {
 
-				throw new Error( 'Error creating WebGL context with your selected attributes.' );
+					throw new Error( 'Error creating WebGL context with your selected attributes.' );
 
-			} else {
+				} else {
 
-				throw new Error( 'Error creating WebGL context.' );
+					throw new Error( 'Error creating WebGL context.' );
+
+				}
 
 			}