1

在IE11版11.0.9600.16428和下面一些WebGL的方法是無法正常工作(如這裏提到的:https://github.com/mrdoob/three.js/issues/3600如何識別IE11的WebGL兼容性(clearStencil,着色器)正確

一個例子是方法clearStencil。問題是該方法存在,但它不能正常工作。我想檢測並給用戶一些反饋。我嘗試了Three.js中的Detector.js,但它僅檢查瀏覽器和圖形卡是否支持WebGL,而不支持所有相關功能。

我試圖做一個WebGL的檢查是這樣的:

var supportsWebGL=function(){ 
    if(Detector.webgl){ 
     var _canvas = document.createElement('canvas'); 
     var _gl = _canvas.getContext('webgl') || _canvas.getContext('experimental-webgl'); 
     try{ 
      _gl.clearStencil(0); 
     }catch(e){ 
      return false; 
     } 
     return true; 
    }else{ 
     return false; 
    } 
} 

在IE11(11.0.9600.16428)supportsWebGL返回true,但給了我這樣的錯誤方法:

WEBGL11095:無效 - 操作:clearStencil:方法當前不支持 。

現在我想我的方法supportsWebGL檢測到不兼容性並返回false。有誰知道如何做到這一點?

回答

3

我發現了一個辦法做到這一點通過使用_gl.getError()

var supportsWebGL=function(){ 
    if(Detector.webgl){ 
     var _canvas = document.createElement('canvas'); 
     var _gl = _canvas.getContext('webgl') || _canvas.getContext('experimental-webgl'); 
     var errors=undefined;   
     try{ 
      _gl.clearStencil(0); 
      errors=_gl.getError(); 
     }catch(e){ 
      return false; 
     } 
     return errors==0; 
    }else{ 
     return false; 
    } 
} 

只有errors等於零該方法將返回true。如果您有其他方法需要檢查,只需將它們添加到try/catch區塊。

如果你需要,沒有three.js所工作的解決方案,檢查了這一點:

var supportsWebGL=function(){ 
    if(!window.WebGLRenderingContext)return false; 
    try{ 
     var _canvas = document.createElement('canvas'); 
     var _gl = _canvas.getContext('webgl') || _canvas.getContext('experimental-webgl'); 
     _gl.clearStencil(0); 
     var errors=_gl.getError(); 
     return errors==0; 
    }catch(e){ 
     return false; 
    } 
} 
+0

我喜歡這個解決方案比瀏覽器嗅探更多,但仍然... try/catch ... urgh ...創建一個新的上下文只是爲了檢查... urgh ... ^^ – Winchestro 2015-02-10 13:36:53

0

我現在可以想到的最好方法是檢查瀏覽器及其版本。

把這個代碼片段以獲取瀏覽器的名稱和它的版本(僅適用於專業):

var browserInformation = (function() { 
var temporal = undefined; 
var userAgent = navigator.userAgent; 
var matches = userAgent.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; 
if (/trident/i.test(matches[1])) { 
    temporal = /\brv[ :]+(\d+)/g.exec(userAgent) || []; 
    return 'Internet Explorer ' + (temporal[1] || ''); 
} 
if (matches[1] === 'Chrome') { 
    temporal = userAgent.match(/\bOPR\/(\d+)/); 
    if (temporal != null) 
     return 'Opera ' + temporal[1]; 
} 
matches = matches[2] ? [matches[1], matches[2]] : [navigator.appName, navigator.appVersion, '-?']; 
if ((temporal = userAgent.match(/version\/(\d+)/i)) != null) 
    matches.splice(1, 1, temporal[1]); 
return matches.join(' ');})(); 

這個片段將在格式[Browsername版本],即Internet Explorer 11返回一個字符串。

+0

這不是解決我的問題,因爲它只是給了我「的Internet Explorer 11」而不是「Internet Explorer的11.0。 9600.16428' 。 – user3271566 2015-02-10 11:44:25

+0

這並不可靠,因爲即使在相同版本的IE中,您也可以使用WebGL工作,而不是因爲計算機的支持。 – chaotive 2017-03-14 21:20:38