实现OpenGL< glDrawBuffers的webGl替代方法是什么?

时间:2016-05-06 06:13:21

标签: webgl post-processing hdr

我正致力于通过HDR实现Bloom后期处理效果。我正在使用一个脚手架,这是一个在线教程,可以做同样的效果,但是基于最新版本的OpenGL(教程)。我正在使用WebGL 1.0和OpenGl ES 2.0进行着色器脚本编写。一个例子是这个renderBuffer生成脚本(注释第4行):

rboDepth = gl.createRenderbuffer()
        gl.bindRenderbuffer(gl.RENDERBUFFER, rboDepth);
        gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT, gl.viewportWidth, gl.viewportHeight);
        glFramebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, rboDepth);
        // - Tell OpenGL which color attachments we'll use (of this framebuffer) for rendering 
        var attachments = [ gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1 ];
        glDrawBuffers(2, attachments);
        // - Finally check if framebuffer is complete
        if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE)
            alert("Framebuffer not complete!" );

1 个答案:

答案 0 :(得分:0)

drawBuffers在WebGL WEBGL_draw_buffers中作为扩展名提供。要使用它,请检查扩展名

var ext = gl.getExtension("WEBGL_draw_buffers");
if (!ext) {
  alert("no WEBGL_draw_buffers: sucks to be you");
  ...
} 

如果您希望上面的代码按原样运行,则可以将其复制到WebGL上下文中。

for (var key in ext) {
  var value = ext[key];
  if (typeof value === 'function') {
    value = value.bind(ext);
  }
  // remove WEBGL suffix
  var newKey = key.replace(/_?WEBGL/, '');
  gl[newKey] = value;
}

不幸的是,至少根据webglstats.com WEBGL_draw_buffers仅支持约60%的设备。我有点震惊的是,这个数字是如此之低,但我知道很多驱动程序都有/设置了与设置drawBuffers相关的严重错误。它们在以常见方式设置时工作,但在以不太常见的方式设置时会使驱动程序崩溃。由于浏览器无法接受该功能,因此该功能会在任何已知错误的设备上列入黑名单。我知道在OSX上使用NVidia芯片已经有一段时间了,但我知道它已经修复了,因为我在OSX设备上用NVidia键入了这个,并且可以在WebGL中使用drawbuffers

无论如何,这就是你如何获得drawBuffers。如果扩展名不可用,那么你有点不走运。 <{1}}无效时的解决方案。

  1. 多次渲染,每次绘制缓冲一次

    是的,真的很慢

  2. 回归其他一些不需要绘图的低质量渲染

  3. 告诉用户他们运气不好。