我注意到似乎有两种查询功能是否已启用的方法: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中有历史原因?

最佳答案

您可以使用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行为中的错误。

关于javascript - 功能之间的区别在于“WebGLRenderingContext。{isEnabled | getParameter}”吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43613793/

10-10 05:31