【发布时间】:2012-04-11 14:10:24
【问题描述】:
任何使用过three.js 的人都可以告诉我是否可以检测到webgl 支持,如果不支持,则回退到标准的Canvas 渲染?
【问题讨论】:
标签: javascript html5-canvas three.js webgl
任何使用过three.js 的人都可以告诉我是否可以检测到webgl 支持,如果不支持,则回退到标准的Canvas 渲染?
【问题讨论】:
标签: javascript html5-canvas three.js webgl
是的,这是可能的。您可以使用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";
}
}
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();
3) 还要检查 Modernizr 检测器: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/webgl.js
【讨论】:
Detector.js已经搬家,现在在github.com/mrdoob/three.js/blob/master/examples/js/WebGL.js
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;
}
}
而且用法和他的例子类似:
renderer = webglAvailable() ? new THREE.WebGLRenderer() : new THREE.CanvasRenderer();
【讨论】:
不幸的是,仅仅检测到 WebGL 支持并不意味着它会有任何好处。 WebGL 可以由诸如“google swiftshader”之类的软件渲染器或诸如“mesa 3D”之类的部分仿真器支持。尤其是对于像 Mesa 2D 这样优秀的 2D 渲染器,即使 WebGL 似乎可用,手动选择画布也是有意义的。
【讨论】: