最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • WebGL 帧缓冲区(FBO FrameBufferObject)

    正文概述 掘金(纳铭)   2021-06-27   938
    • juejin.cn/post/696543…
    • juejin.cn/post/696440…

    帧缓存/帧缓冲区(FBO FrameBufferObject)

    • WebGL 帧缓冲区(FBO FrameBufferObject)
    • 帧缓冲区并不是实际存储数据的地方,实际存储图像数据数据的对象就是纹理(Texture)和渲染缓冲区(RenderBuffer)。
    • 在帧缓冲区中可以附着3种类型的附着,颜色附着(ColorAttachment)|深度附着(DepthAttachment)|模板附着(StencilAttachment)。这三种附着对应的存储区域也被称为颜色缓冲区(ColorBuffer)|深度缓冲区(DepthBuffer)|模板缓冲区(StencilBuffer)。

    颜色缓冲区(比深度缓存精度更高)

    • 16位:RGB565,红色5位,绿色6位,蓝色5位,不保存透明通道(之所以绿色多1位是因为人眼对绿色更加敏感);
    • 24位:RGB888,红色8位,绿色8位,蓝色8位,不保存透明通道;
    • 32位:RGBA8888,红色8位,绿色8位,蓝色8位,透明通道8位;
    • 如果使用了多渲染目标(Multiple Render Targets)技术,那么颜色附着的数量可能会大于一。

    深度缓冲区(深度缓存)

    • 存储每个像素点的深度,用来决定是丢弃当前像素颜色还是保留,假设,新渲染的颜色在旧颜色的前面,那么就覆盖旧颜色,如果新颜色在旧颜色的后面(被遮挡了)则保留旧颜色。

    模板缓冲区

    • 用来控制颜色缓存某个位置的写入操作,常用来处理阴影。

    FrameBufferObject生成 方式一

     var fbo = initFramebufferObject(gl);
     
     //texture depthBuffer 返回fbo
     function initFramebufferObject(gl) {
       // texture 后面拿来用的
       var texture = gl.createTexture();
       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);
    
       // Renderbuffer 用来渲染的
       var depthBuffer = gl.createRenderbuffer(); 
       gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer); // Bind the object to target
       gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, OFFSCREEN_WIDTH, OFFSCREEN_HEIGHT); 
    
       //Framebuffer 有个有点展示的意思
       var framebuffer = gl.createFramebuffer(); 
       gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
       framebuffer.texture = texture; // Store the texture object
       gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); //帧缓冲区 对应贴图
       gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthBuffer); //帧缓冲区 对应渲染缓冲区
    
       return framebuffer;
     }
    

    FrameBufferObject使用

    gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); // Change the drawing destination to FBO
    gl.viewport(0, 0, OFFSCREEN_HEIGHT, OFFSCREEN_HEIGHT); // Set view port for FBO
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);   // Clear FBO    
    gl.useProgram(shadowProgram); // Set shaders for generating a shadow map
    drawTriangle(gl, shadowProgram, triangle, currentAngle, viewProjMatrixFromLight);
    drawPlane(gl, shadowProgram, plane, viewProjMatrixFromLight);
    
    gl.bindFramebuffer(gl.FRAMEBUFFER, null); // Change the drawing destination to color buffer
    gl.viewport(0, 0, canvas.width, canvas.height);
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);    // Clear color and depth buffer
    gl.useProgram(normalProgram); // Set the shader for regular drawing
    gl.uniform1i(normalProgram.u_ShadowMap, 0);  // Pass 0 because gl.TEXTURE0 is enabled�る
    drawTriangle(gl, normalProgram, triangle, currentAngle, viewProjMatrix);
    gl.uniformMatrix4fv(normalProgram.u_MvpMatrixFromLight, false, mvpMatrixFromLight_p.elements);
    drawPlane(gl, normalProgram, plane, viewProjMatrix);
    

    FrameBufferObject生成 方式二 WebGL2

    const whCube = 512;
    brdfLUTTexture = gl.createTexture();
    gl.bindTexture(gl.TEXTURE_2D, brdfLUTTexture);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RG16F, whCube, whCube, 0, gl.RG, gl.FLOAT, new Float32Array(whCube * whCube * 2), 0);
    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);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    
    let captureRBO = gl.createRenderbuffer();
    gl.bindRenderbuffer(gl.RENDERBUFFER, captureRBO);
    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT24, whCube, whCube);
    
    let captureFBO = gl.createFramebuffer();
    gl.bindFramebuffer(gl.FRAMEBUFFER, captureFBO);
    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, brdfLUTTexture, 0);
    gl.viewport(0, 0, whCube, whCube);
    brdfShader.use(gl);
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    renderQuad();
    

    FrameBufferObject使用

    gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    textureShader.use(gl);
    textureShader.setInt(gl, "ourTexture", 0);
    gl.activeTexture(gl.TEXTURE0);
    gl.bindTexture(gl.TEXTURE_2D, brdfLUTTexture);
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    renderQuad();
    

    起源地下载网 » WebGL 帧缓冲区(FBO FrameBufferObject)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元