`WebGLRenderingContext.{isEnabled|getParameter}` 之间的功能差异?

Difference between `WebGLRenderingContext.{isEnabled|getParameter}` for capabilities?

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

下面是我的测试代码,它遍历 WebGL1 中定义的每个功能,尝试启用该功能,然后检查 isEnabled 的 return 值是否与 return 的值匹配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);
        }
    }

因此,根据这些结果,我有几个问题:

您可以使用 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:

However, state variables for which IsEnabled is listed as the query command can also be obtained using GetBooleanv, GetIntegerv, and GetFloatv.

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