我注意到似乎有兩種方式來查詢是否啓用了功能:isEnabled
和getParameter
。 isEnabled
似乎是實際上正確的方法來檢查是否啓用了一項功能,但我試圖瞭解具有功能的getParameter
是什麼意思。「WebGLRenderingContext。{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);
}
}
隨着WebGL1在Chrome我收到以下(如果在創建上下文激活模板緩存
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
隨着WebGL2在Firefox上,我什麼也得不到。
因此,基於這些結果我有幾個問題:
以下哪個瀏覽器有
gl.getParameter(gl.STENCIL_TEST)
正確的行爲?如果Chrome的行爲是正確的,爲什麼gl.isEnabled(gl.STENCIL_TEST)
和gl.getParameter(gl.STENCIL_TEST)
不會返回相同的值?爲什麼僅在WebGL2中允許
你可以用SAMPLE_ALPHA_TO_COVERAGE
和SAMPLE_COVERAGE
的行爲?我有一種感覺,對此的回答很簡單,「因爲WebGL1規範不允許它」,但它似乎與其他功能不一致,特別是它提供的值爲isEnabled
。也許這在OpenGL ES中有一個歷史原因?isEnabled
查詢