【问题标题】:Where is the STENCIL_INDEX constant used in WebGL?WebGL 中使用的 STENCIL_INDEX 常量在哪里?
【发布时间】:2017-04-17 15:32:50
【问题描述】:

WebGL 1 specification 中,我注意到有一个常量const GLenum STENCIL_INDEX = 0x1901; 并且想知道它是如何使用的。我一直在尝试将它与纹理或渲染缓冲区一起使用,尽管我尝试过的任何组合都没有奏效。例如,我尝试在下面的示例中使用STENCIL_INDEX 而不是STENCIL_INDEX8 作为渲染缓冲区,或者使用STENCIL_INDEX8 作为内部格式和STENCIL_INDEX 作为格式调用texImage2D

在 WebGL 1 或 2(如果需要,可以启用任何扩展)中,我想知道常量 STENCIL_INDEX 可以在纹理、渲染缓冲区或某些附件配置中使用的位置。即使这是特定于硬件的,我仍然想知道它是如何使用的。

例如,我很好奇如何修改下面的代码以使用 STENCIL_INDEX不是 STENCIL_INDEX8 -- 请注意,此常量已在渲染缓冲区中使用):

const pixel = new Uint8Array([0, 0, 0, 0]);

for (const version of ['webgl', 'webgl2']) {
  const canvas = document.createElement('canvas'),
    gl = canvas.getContext(version, {stencil: true}),
    framebuffer = gl.createFramebuffer(),
    stencilbuffer = gl.createRenderbuffer(),
    texture = gl.createTexture();

  canvas.width = 1;
  canvas.height = 1;

  gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);

  gl.bindRenderbuffer(gl.RENDERBUFFER, stencilbuffer);
  gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, 1, 1);
  gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, stencilbuffer);

  gl.bindTexture(gl.TEXTURE_2D, texture);
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixel);
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
  gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);

  const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
  if (status !== gl.FRAMEBUFFER_COMPLETE) {
    console.error(status, version);
  }

  gl.deleteTexture(texture);
  gl.deleteRenderbuffer(stencilbuffer);
  gl.deleteFramebuffer(framebuffer);
}

我确实看到了OES_texture_stencil8 extension in OpenGL ES 3.1,尽管即使在那里它也指出STENCIL_INDEX 常量已经存在。那么常量在 OpenGL ES 中的用途是什么?这与 WebGL 中的用法有什么关系?

我还找到了this line of commented code referencing STENCIL_INDEX in Chromium,这就是为什么我想我会在这里提出它,以防这种行为已知。同样,Firefox 似乎没有列出 STENCIL_INDEX in its formats enum 并且似乎没有引用 STENCIL_INDEX,除非一致性测试确保该常量存在并且具有值 0x1901

【问题讨论】:

    标签: javascript opengl-es webgl


    【解决方案1】:

    这是个好问题。我认为这可能是 WebGL 规范中的错误

    检查OpenGL ES 2.0 spec 似乎没有提及STENCIL_INDEXSTENCIL_INDEX 也不在OpenGL ES 2.0 headers

    OpenGL ES 3.0 specES 3.0 headers 也没有提及它。直到ES 3.1才出现

    也许you should search and/or ask here

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2016-12-12
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多