webgl扩展系列之四------------WEBGL_draw_buffers(多目标绘制)

207 阅读1分钟

一. 简介

WEBGL_draw_buffers是一个一次性绘制多张颜色纹理(缓冲区)的插件,经常用于后处理中,比如延迟渲染等,后续记录后处理的时候再介绍

二.使用

2.1 获取扩展

const ext = gl.getExtension("WEBGL_draw_buffers");

2.2 绑定多个纹理

const fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
gl.framebufferTexture2D(
  gl.FRAMEBUFFER,
  ext.COLOR_ATTACHMENT0_WEBGL,
  gl.TEXTURE_2D,
  tx[0],
  0,
);
gl.framebufferTexture2D(
  gl.FRAMEBUFFER,
  ext.COLOR_ATTACHMENT1_WEBGL,
  gl.TEXTURE_2D,
  tx[1],
  0,
);
gl.framebufferTexture2D(
  gl.FRAMEBUFFER,
  ext.COLOR_ATTACHMENT2_WEBGL,
  gl.TEXTURE_2D,
  tx[2],
  0,
);
gl.framebufferTexture2D(
  gl.FRAMEBUFFER,
  ext.COLOR_ATTACHMENT3_WEBGL,
  gl.TEXTURE_2D,
  tx[3],
  0,
);

2.3 绘制多个纹理

ext.drawBuffersWEBGL([
  ext.COLOR_ATTACHMENT0_WEBGL, // gl_FragData[0]
  ext.COLOR_ATTACHMENT1_WEBGL, // gl_FragData[1]
  ext.COLOR_ATTACHMENT2_WEBGL, // gl_FragData[2]
  ext.COLOR_ATTACHMENT3_WEBGL, // gl_FragData[3]
]);

2.4 在shader中向多个纹理写入

const fs = /*glsl*/ `
  #extension GL_EXT_draw_buffers : require
  precision highp float;
  uniform sampler2D u_texture;
  varying vec2 v_uv;
  void main(){
    vec4 color=texture2D(u_texture,v_uv);
    // gl_FragColor=color;
    gl_FragData[0] = color;
    gl_FragData[1] = vec4(1.0,0.0,0.0,1.0);
    gl_FragData[2] = vec4(0.0,1.0,0.0,1.0);
  }

`;

2.5 效果如下:

image.png