“WebGLRenderingContext。{isEnabled | getParameter}”之间的区别是什么?

时间:2017-04-25 14:40:34

标签: javascript webgl

我注意到有两种方法可以查询功能是否已启用:isEnabledgetParameterisEnabled似乎是检查功能是否已启用的实际正确方法,但我正在尝试了解使用功能调用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_COVERAGESAMPLE_COVERAGE的行为只允许在WebGL2中使用?我有一种感觉,答案只是“因为WebGL1规范不允许它”,但它似乎与其他功能不一致,特别是只要它返回isEnabled的值。也许在OpenGL ES中有这个历史原因?

1 个答案:

答案 0 :(得分:3)

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

  

但是,也可以使用IsEnabledGetBooleanvGetIntegerv获取GetFloatv列为查询命令的状态变量。

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