Three.js检测webgl支持并回退到常规画布

Bac*_*alo 37 javascript webgl three.js html5-canvas

任何使用过three.js的人都可以告诉我是否有可能检测到webgl支持,如果不存在,可以回退到标准的Canvas渲染吗?

Jua*_*ado 61

是的,这是可能的.你可以用CanvasRenderer而不是WebGLRenderer.

关于WebGL检测:

1)阅读此WebGL wiki文章:http://www.khronos.org/webgl/wiki/FAQ

 if (!window.WebGLRenderingContext) {
    // the browser doesn't even know what WebGL is
    window.location = "http://get.webgl.org";
  } else {
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext("webgl");
    if (!context) {
      // browser supports WebGL but initialization failed.
      window.location = "http://get.webgl.org/troubleshooting";
    }
  }
Run Code Online (Sandbox Code Playgroud)

2) Three.js已经有一个WebGL检测器:https: //github.com/mrdoob/three.js/blob/master/examples/js/Detector.js

renderer = Detector.webgl? new THREE.WebGLRenderer(): new THREE.CanvasRenderer();
Run Code Online (Sandbox Code Playgroud)

3)检查Modernizr探测器:https: //github.com/Modernizr/Modernizr/blob/master/feature-detects/webgl.js

  • 如果浏览器支持WebGL但由于某些原因(如驱动程序被列入黑名单)无法使用它,方法1/3将失败,这就是方法2使用带有try/catch块的函数并检查上下文是否可以实际创建的原因. (17认同)

Abt*_*deh 12

Juan Mellado指向Three.js探测器的指针非常实用,但我不想将整个文件放入我的项目中.所以这里是提取的Detector.webgl()函数.

function webglAvailable() {
    try {
        var canvas = document.createElement("canvas");
        return !!
            window.WebGLRenderingContext && 
            (canvas.getContext("webgl") || 
                canvas.getContext("experimental-webgl"));
    } catch(e) { 
        return false;
    } 
}
Run Code Online (Sandbox Code Playgroud)

它的使用类似于他的例子:

renderer = webglAvailable() ? new THREE.WebGLRenderer() : new THREE.CanvasRenderer();
Run Code Online (Sandbox Code Playgroud)