我注意到有两种方法可以查询功能是否已启用: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中有这个历史原因?
答案 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:
但是,也可以使用
IsEnabled
,GetBooleanv
和GetIntegerv
获取GetFloatv
列为查询命令的状态变量。
这些听起来像getParameter
行为中的错误。