2017-04-25 44 views
2

我注意到似乎有兩種方式來查詢是否啓用了功能:isEnabledgetParameterisEnabled似乎是實際上正確的方法來檢查是否啓用了一項功能,但我試圖瞭解具有功能的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_COVERAGESAMPLE_COVERAGE的行爲?我有一種感覺,對此的回答很簡單,「因爲WebGL1規範不允許它」,但它似乎與其他功能不一致,特別是它提供的值爲isEnabled。也許這在OpenGL ES中有一個歷史原因?

    你可以用isEnabled查詢

回答

3

的東西都可以用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被列爲該查詢命令的狀態變量GetBooleanvGetIntegerv,和GetFloatv

這些聽起來像是在getParameter行爲中的錯誤。

相關問題