我注意到似乎有两种查询功能是否已启用的方法: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中有历史原因? 最佳答案
您可以使用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
行为中的错误。关于javascript - 功能之间的区别在于“WebGLRenderingContext。{isEnabled | getParameter}”吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43613793/