【问题标题】:Difference between `WebGLRenderingContext.{isEnabled|getParameter}` for capabilities?`WebGLRenderingContext.{isEnabled|getParameter}` 功能的区别?
【发布时间】:2017-04-26 10:18:19
【问题描述】:

我注意到似乎有两种方法可以查询是否启用了功能:isEnabled 和 getParameter。 isEnabled 似乎是实际上检查功能是否启用的正确方法,但我试图理解使用功能调用 getParameter 意味着什么。

下面是我的测试代码,它遍历 WebGL1 中定义的每个功能,尝试启用该功能,然后检查 isEnabled 的返回值是否与 getParameter 的返回值匹配。

    var canvas = document.createElement('canvas')
    ,   gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl')
    ,   capabilities = [
            'BLEND',
            'CULL_FACE',
            'DEPTH_TEST',
            'DITHER',
            'POLYGON_OFFSET_FILL',
            'SAMPLE_ALPHA_TO_COVERAGE',
            'SAMPLE_COVERAGE',
            'SCISSOR_TEST',
            'STENCIL_TEST'
        ];

    for (var i = 0; i < capabilities.length; i++) {
        var capability = gl[capabilities[i]];

        gl.enable(capability);

        var isEnabledResult = gl.isEnabled(capability)
        ,   getParameterResult = gl.getParameter(capability);

        if (isEnabledResult !== getParameterResult) {
            console.log(capabilities[i], isEnabledResult, getParameterResult);
        }
    }
  • 使用 Chrome 上的 WebGL1,我收到以下信息(如果在创建上下文时启用了模板缓冲区,STENCIL_TEST 将在此处删除):

    SAMPLE_ALPHA_TO_COVERAGE true null
    SAMPLE_COVERAGE true null
    STENCIL_TEST true false
    
  • 在 Firefox、IE11 和 Edge 上使用 WebGL1(无论是否启用了模板缓冲区):

    SAMPLE_ALPHA_TO_COVERAGE true null 
    SAMPLE_COVERAGE true null
    
  • 在 Chrome 上使用 WebGL2(如果启用了模板缓冲区,STENCIL_TEST 将在此处删除):

    STENCIL_TEST true false
    
  • 在 Firefox 上使用 WebGL2,我什么也没有收到。

因此,基于这些结果,我有几个问题:

  • 哪些浏览器对gl.getParameter(gl.STENCIL_TEST) 有正确的行为?如果 Chrome 的行为是正确的,为什么 gl.isEnabled(gl.STENCIL_TEST) 和 gl.getParameter(gl.STENCIL_TEST) 不会返回相同的值?

  • 为什么 SAMPLE_ALPHA_TO_COVERAGE 和 SAMPLE_COVERAGE 的行为只在 WebGL2 中变得允许?我感觉这个问题的答案只是“因为 WebGL1 规范不允许这样做”,但它似乎与其他功能不一致,尤其是在它返回 isEnabled 的值的情况下。在 OpenGL ES 中可能有历史原因?

【问题讨论】:

    标签: javascript webgl


    【解决方案1】:

    您可以使用isEnabled 查询的任何内容也可以使用getParameter 进行查询。具体来说,这应该总是正确的:

    function TestPname(pname) {
      var expected = gl.isEnabled(pname);
      var error = gl.getError();
      if (error)
        return error == gl.INVALID_ENUM;
    
      var actual = gl.getParameter(pname);
      error = gl.getError();
      if (error)
        return false;
    
      return actual == expected;
    }
    

    GLES 2.0.25 p134:

    但是,IsEnabled 列为查询命令的状态变量也可以使用GetBooleanv、GetIntegerv 和GetFloatv 获得。

    这些听起来像是getParameter 行为中的错误。

    【讨论】:

      猜你喜欢
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 2012-08-28
      • 2020-09-20
      相关资源
      最近更新 更多