Chiunque abbia utilizzato three.js può dirmi se è possibile rilevare il supporto webgl e, se non presente, eseguire il fallback su un rendering Canvas standard?Three.js rileva il supporto webgl e il fallback su canvas regolare
36
A
risposta
59
Sì, è possibile. È possibile utilizzare CanvasRenderer
anziché WebGLRenderer
.
A proposito di rilevamento WebGL:
1) leggere questo articolo 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 ha già un rilevatore di WebGL: https://github.com/mrdoob/three.js/blob/master/examples/js/Detector.js
renderer = Detector.webgl? new THREE.WebGLRenderer(): new THREE.CanvasRenderer();
3) controllare anche il rilevatore di Modernizr: puntatore del https://github.com/Modernizr/Modernizr/blob/master/feature-detects/webgl.js
10
Juan Mellado al rivelatore Three.js era super utile, ma preferisco non portare l'intero file nel mio progetto. Quindi ecco la funzione Detector.webgl() estratta.
function webglAvailable() {
try {
var canvas = document.createElement("canvas");
return !!
window.WebGLRenderingContext &&
(canvas.getContext("webgl") ||
canvas.getContext("experimental-webgl"));
} catch(e) {
return false;
}
}
Ed è usato in modo simile al suo esempio:
renderer = webglAvailable() ? new THREE.WebGLRenderer() : new THREE.CanvasRenderer();
Metodo 1/3 fallirà se il browser supporta WebGL, ma non è possibile utilizzarlo per qualche motivo (come il driver in lista nera), che è perché il Metodo 2 utilizza una funzione con un blocco try/catch e controlla anche che il contesto possa effettivamente essere creato. –