`WebGLRenderingContext.{isEnabled|getParameter}` 之间的功能差异?
Difference between `WebGLRenderingContext.{isEnabled|getParameter}` for capabilities?
我注意到似乎有两种方法可以查询功能是否启用:isEnabled
和 getParameter
。 isEnabled
似乎是 实际上 检查功能是否启用的正确方法,但我试图理解使用功能调用 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);
}
}
在 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
使用 WebGL2 Chrome(如果启用模板缓冲区,STENCIL_TEST
将在此处删除):
STENCIL_TEST true false
在 Firefox 上使用 WebGL2,我什么也没收到。
因此,根据这些结果,我有几个问题:
以下哪些浏览器的 gl.getParameter(gl.STENCIL_TEST)
行为正确?如果 Chrome 的行为是正确的,为什么 gl.isEnabled(gl.STENCIL_TEST)
和 gl.getParameter(gl.STENCIL_TEST)
不是 return 相同的值?
为什么 SAMPLE_ALPHA_TO_COVERAGE
和 SAMPLE_COVERAGE
的行为只在 WebGL2 中才被允许?我感觉这个问题的答案很简单 "because the WebGL1 specification didn't allow it,",但它似乎与其他功能不一致,特别是假设它 return 是 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:
However, state variables for which IsEnabled
is listed as the query command can also be obtained using GetBooleanv
, GetIntegerv
, and GetFloatv
.
这些听起来像是 getParameter
行为中的错误。
我注意到似乎有两种方法可以查询功能是否启用:isEnabled
和 getParameter
。 isEnabled
似乎是 实际上 检查功能是否启用的正确方法,但我试图理解使用功能调用 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);
}
}
在 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
使用 WebGL2 Chrome(如果启用模板缓冲区,
STENCIL_TEST
将在此处删除):STENCIL_TEST true false
在 Firefox 上使用 WebGL2,我什么也没收到。
因此,根据这些结果,我有几个问题:
以下哪些浏览器的
gl.getParameter(gl.STENCIL_TEST)
行为正确?如果 Chrome 的行为是正确的,为什么gl.isEnabled(gl.STENCIL_TEST)
和gl.getParameter(gl.STENCIL_TEST)
不是 return 相同的值?为什么
SAMPLE_ALPHA_TO_COVERAGE
和SAMPLE_COVERAGE
的行为只在 WebGL2 中才被允许?我感觉这个问题的答案很简单 "because the WebGL1 specification didn't allow it,",但它似乎与其他功能不一致,特别是假设它 return 是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:
However, state variables for which
IsEnabled
is listed as the query command can also be obtained usingGetBooleanv
,GetIntegerv
, andGetFloatv
.
这些听起来像是 getParameter
行为中的错误。