必需的WebGL扩展检测

时间:2014-03-03 14:00:03

标签: javascript three.js webgl webgl-extensions

我正在开发一个WebGL(使用ThreeJs)应用程序,显然,它显示了3D模型,我们正在使用一些效果(着色器),希望通过测试来了解用户是否可以运行该应用程序或者,我找到了一种方法来检索使用过的浏览器中支持的插件列表。

问题:

我面临的问题是要知道我的应用程序需要什么插件,有没有办法自动检测它们?


更多详情:

有关详细信息,我将指定一个我需要的示例:

  1. 在Mac OSX Maverix下的MacBook Pro中,应用程序运行正常
  2. 在我的联想笔记本电脑上测试应用程序,在Windows 7下,然后在Windows 8上,应用程序无法运行,问题是由Bokeh2着色器造成的。
  3. 检查支持的WebGL扩展列表我发现联想中存在一些与Mac相比缺少的扩展,因此如何判断哪些扩展名如果丢失将破坏WebGL应用程序。

    这是我在mac和lenovo中的扩展名列表。

    在我的Mac中:

      

    ANGLE_instanced_arrays

         

    WEBKIT_EXT_texture_filter_anisotropic

         

    OES_element_index_uint

         

    OES_standard_derivatives

         

    OES_texture_float

         

    OES_texture_float_linear

         

    OES_texture_half_float

         

    OES_texture_half_float_linear

         

    OES_vertex_array_object

         

    WEBKIT_WEBGL_compressed_texture_s3tc

         

    WEBKIT_WEBGL_depth_texture

         

    WEBGL_draw_buffers

         

    WEBGL_lose_context

         

    WEBGL_debug_renderer_info

    在我的联想:

      

    ANGLE_instanced_arrays

         

    WEBKIT_EXT_texture_filter_anisotropic

         

    OES_element_index_uint

         

    OES_standard_derivatives

         

    OES_texture_float

         

    OES_texture_half_float

         

    OES_texture_half_float_linear

         

    OES_vertex_array_object

         

    WEBKIT_WEBGL_compressed_texture_s3tc

         

    WEBGL_lose_context

         

    WEBGL_debug_renderer_info

    联想中缺少的那些:

      

    OES_texture_float_linear

         

    WEBKIT_WEBGL_depth_texture

         

    WEBGL_draw_buffers

1 个答案:

答案 0 :(得分:5)

您可以通过询问来检查分机

var ext = gl.getExtension("OES_texture_float_linear");
If (!ext) {
  alert("extension does not exist");
}

对于three.js,您可以使用

var gl = renderer.getContext();

获取WebGLRenderingContext

在您的情况下,如果扩展名不存在,请考虑不使用bokeh2着色器

否则,它可以通过app / framework /代码告诉您需要哪些扩展名。我可以想到三个方面

  1. 理想的方式是应用程序在文档中具体,如 Bokek2需要扩展X,Y和Z

  2. 下一个最好的方法是查看代码,看看它在做什么。

  3. 另一种方法是覆盖getExtension,然后(1)打印出要检查的扩展名,以及(2)返回null某些扩展名并查看代码何时失败。

  4. 我真的建议#2,但#3你可以做到这一点

    (function() {
    
      var originalGetExtensionFunction = WebGLRenderingContext.prototype.getExtension;
    
      // start with this array empty. Once you know which extensions
      // the app is requesting you can then selectively add them here
      // to figure out which ones are required.
      var extensionToReject = [
        "OES_texture_float",
        "OES_texture_float_linear",
      ];
    
      WebGLRenderingContext.prototype.getExtension = function() {
        var name = arguments[0];
        console.log("app requested extension: " + name); 
        if (extensionToReject.indexOf(name) >= 0) {
          console.log("rejected extension: " + name);
          return null;
        } 
        var ext = originalGetExtensionFunction.apply(this, arguments);
        console.log("extension " + name + " " + (ext ? "found" : "not found"));
        return ext;
      };
    
    }());