WebGL简易教程(十三):帧缓存对象(离屏渲染)
目录
在函数initFramebufferObject()中进行了帧缓冲区的初始化工作。具体来说, 帧缓冲区的具体设置过程可以分为如下8步:
2.2.2.1. 创建帧缓冲对象(gl.createFramebuffer())
通过gl.createFramebuffer()来创建初始化对象:
// 初始化帧缓冲区对象 (FBO) function initFramebufferObject(gl) { //... // 创建帧缓冲区对象 (FBO) framebuffer = gl.createFramebuffer(); if (!framebuffer) { console.log('Failed to create frame buffer object'); return error(); } //... }
2.2.2.2. 创建纹理对象并设置其尺寸和参数
在教程《WebGL简易教程(十一):纹理》中就已经介绍过如何创建纹理对象并设置纹理对象的参数。这里的创建过程也是一样的;只是细节略有不同:
- 这里设置纹理的长、宽可以跟画布的长宽不一样,想要速度快,可以小一点;想要效果好,就可以大一点。
- gl.texImage2D函数的最后一个参数需设置为null,表示新建了一块空白的区域,以便帧缓存绘制。
function initFramebufferObject(gl) { //... // 创建纹理对象并设置其尺寸和参数 texture = gl.createTexture(); // 创建纹理对象 if (!texture) { console.log('Failed to create texture object'); return error(); } gl.bindTexture(gl.TEXTURE_2D, texture); // Bind the object to target gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, OFFSCREEN_WIDTH, OFFSCREEN_HEIGHT, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); // 设置纹理参数 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); framebuffer.texture = texture; // 保存纹理对象 //... }
2.2.2.3. 创建渲染缓冲区对象(gl.createRenderbuffer())
通过函数gl.createRenderbuffer()创建渲染缓冲区对象,这个渲染缓冲区对象将被指定成深度关联对象。
function initFramebufferObject(gl) { //... // 创建渲染缓冲区对象并设置其尺寸和参数 depthBuffer = gl.createRenderbuffer(); //创建渲染缓冲区 if (!depthBuffer) { console.log('Failed to create renderbuffer object'); return error(); } //... }
2.2.2.4. 绑定渲染缓冲区并设置尺寸(gl.bindRenderbuffer(),gl.renderbufferStorage())
将渲染缓冲区绑定到目标上,通过目标设置渲染缓冲区的尺寸等参数。
function initFramebufferObject(gl) { //... gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer); // Bind the object to target gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, OFFSCREEN_WIDTH, OFFSCREEN_HEIGHT); //... }
对于WebGL/OpenGL而言,任何缓冲区对象都是需要绑定到目标上,再对目标进行操作的。绑定函数gl.bindRenderbuffer()的定义为:

绑定完成后,通过gl.renderbufferStorage()函数设置渲染缓冲区的格式、宽度以及高度等。注意深度关联的渲染缓冲区,其宽度和高度必须与作为颜色关联对象的纹理缓冲区一致。其函数定义为:

2.2.2.5. 将纹理对象关联到帧缓冲区对象(gl.bindFramebuffer(), gl.framebufferTexture2D)
仍然是先将帧缓冲绑定到目标上,使用函数gl.bindFramebuffer()进行绑定: