texturity.js
Version:
WebGL based library for drawing textures
54 lines (36 loc) • 1.66 kB
JavaScript
export class FloatFrameBuffer {
constructor(gl, w, h) {
this.gl = gl;
this.w = w;
this.h = h;
this.framebuffer = this.initFB();
}
result() {
var gl = this.gl;
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
gl.deleteFramebuffer(this.framebuffer.buffer);
return this.framebuffer.texture;
}
initFB() {
var gl = this.gl;
if (!(gl instanceof WebGL2RenderingContext)) throw new Error('Need webgl 2');
//gl.getExtension('OES_texture_float_linear');
var ext = gl.getExtension('EXT_color_buffer_float');
if (!ext)
throw new Error('no EXT_color_buffer_float');
var buffer = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, buffer);
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA16F, this.w, this.h, 0, gl.RGBA, gl.FLOAT, null);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
if (status != gl.FRAMEBUFFER_COMPLETE)
alert('can not render to floating point textures');
return { buffer, texture };
}
}