【发布时间】:2017-04-26 10:18:19
【问题描述】:
我注意到似乎有两种方法可以查询是否启用了功能: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 中可能有历史原因?
【问题讨论】:
标签: javascript webgl