【发布时间】:2014-03-31 07:21:59
【问题描述】:
如何知道一个画布是在运行“WebGL”还是只是普通的画布?
通过检查源代码,我发现它在任何一种情况下都是画布。
【问题讨论】:
-
寻找 window.WebGLRenderingContext。更多info
标签: javascript canvas webgl
如何知道一个画布是在运行“WebGL”还是只是普通的画布?
通过检查源代码,我发现它在任何一种情况下都是画布。
【问题讨论】:
标签: javascript canvas webgl
这真的取决于你想如何去发现。
例如你可以像这样调用`getContext'
if (someCanvas.getContext("2d")) {
// It's a 2D canvas
} else if (someCanvas.getContext("experimental-webgl") ||
someCanvas.getContext("webgl")) {
// It's a WebGL canvas
}
不幸的是,如果以前没有人调用过getContext,这也会使画布成为 2D 画布。
另一种选择是你可以像这样包装 getContext
(function() {
var originalGetContextFunction = HTMLCanvasElement.prototype.getContext;
HTMLCanvasElement.prototype.getContext = function() {
var type = arguments[0];
var ctx = originalGetContextFunction.apply(this, arguments);
if (ctx && !this.canvasType) {
this.canvasType = type;
}
return ctx;
};
}());
现在对于任何画布,您都可以检查 someCanvas.canvasType 以找出传递给 getContext 的字符串。示例:
var c1 = document.createElement("canvas");
var c2 = document.createElement("canvas");
var ctx = c1.getContext("2d");
var gl = c2.getContext("experimental-webgl");
alert("c1 is " + c1.canvasType + ", c2 is " + c2.canvasType);
只需确保在创建画布的任何代码之前包含包装器即可。
【讨论】:
Canvas 不运行任何东西——在这两种情况下,它只是一个带有可修改位图的元素。它本身无法说明它的用途。
Canvas 可以为您提供 contexts,尽管两者都可以。如果您由于某种原因无法在源代码中看到请求的上下文,您可以随时测试 context(有点落后,但这里是这样):
if (ctx === null) {
return 'unsupported';
}
else if (typeof ctx.viewport === 'undefined' && // test some existing non-shared
typeof ctx.arc !== 'undefined') { // method names
return '2d';
}
else if (typeof ctx.viewport !== 'undefined' &&
typeof ctx.arc === 'undefined') {
return 'webgl';
}
else {
return 'unknown';
}
测试WebGLRenderingContext 将无济于事,因为 浏览器 中支持此测试。即使浏览器支持 WebGL,您也不会获得 WebGL 上下文,因为这取决于计算机及其硬件能力。
【讨论】:
<canvas>当前使用的上下文?
如果您执行canvas.getContext('2d') 并返回null,则它不是二维上下文,其他上下文类型相同。另一方面,如果尚未创建上下文,它将创建上下文。
【讨论】: