OpenGL 帧缓冲区的应用

    有两个渲染器,分别为program1 和 program2。

    program1的渲染到窗口。

 glViewport(0, 0, 512, 512);
 glClearBufferfv(GL_COLOR, 0, sb7::color::Green);  //背景色
 glClearBufferfi(GL_DEPTH_STENCIL, 0, 1.0f, 0);

 glUseProgram(program1);
 glUniformMatrix4fv(proj_location, 1, GL_FALSE, proj_matrix); //投影矩阵
 glUniformMatrix4fv(mv_location, 1, GL_FALSE, mv_matrix);     //模型视图矩阵
 glDrawArrays(GL_TRIANGLES, 0, 36);

    渲染结果如下:

    

    现在将program1渲染到纹理,program2使用该纹理并渲染到窗口。

    首先,创建帧缓冲区对象,并绑定纹理。

    glGenFramebuffers(1, &fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);

    glGenTextures(1, &color_texture);
    glBindTexture(GL_TEXTURE_2D, color_texture);
    glTexStorage2D(GL_TEXTURE_2D, 9, GL_RGBA8, 512, 512);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glGenTextures(1, &depth_texture);
    glBindTexture(GL_TEXTURE_2D, depth_texture);
    glTexStorage2D(GL_TEXTURE_2D, 9, GL_DEPTH_COMPONENT32F, 512, 512);

    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, color_texture, 0);
    glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depth_texture, 0);

        

    其次,设置缓冲区映射,每个缓冲区指定颜色绑定。

 static const GLenum draw_buffers[] = { GL_COLOR_ATTACHMENT0 };
 glDrawBuffers(1, draw_buffers);

    然后,program1渲染到纹理。

    //program1渲染到纹理
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);    //启用帧缓冲区,其绑定了纹理
    glViewport(0, 0, 512, 512);
    glClearBufferfv(GL_COLOR, 0, sb7::color::Green);
    glClearBufferfi(GL_DEPTH_STENCIL, 0, 1.0f, 0);
    glUseProgram(program1);
    glUniformMatrix4fv(proj_location, 1, GL_FALSE, proj_matrix);
    glUniformMatrix4fv(mv_location, 1, GL_FALSE, mv_matrix);
    glDrawArrays(GL_TRIANGLES, 0, 36);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);    //关闭帧缓冲区

     program2使用上述纹理渲染到窗口。

    //program2渲染到窗口
    glViewport(0, 0, info.windowWidth, info.windowHeight);
    glClearBufferfv(GL_COLOR, 0, blue);
    glClearBufferfv(GL_DEPTH, 0, &one);
    glBindTexture(GL_TEXTURE_2D, color_texture);   //绑定program1生成的纹理
    glUseProgram(program2);
    glUniformMatrix4fv(proj_location2, 1, GL_FALSE, proj_matrix);
    glUniformMatrix4fv(mv_location2, 1, GL_FALSE, mv_matrix);
    glDrawArrays(GL_TRIANGLES, 0, 36);
    glBindTexture(GL_TEXTURE_2D, 0);

    渲染结果如下:

    

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值