经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 网络多媒体 » 查看文章
帧缓冲
来源:cnblogs  作者:茶飘香~  时间:2019/8/28 8:44:07  对本文有异议

 

  帧缓冲,显卡渲染出的图像会保存在默认的帧缓冲之中,其包括的附件有颜色、深度、模板缓冲。

  我们可以创建自己的帧缓冲。

  1. glGenFramebuffers(1, &this->framebuffer);
  2. glBindFramebuffer(GL_FRAMEBUFFER, this->framebuffer);

  我们需要为其附加一些附件(如,颜色、深度、模板缓冲)。

  对于颜色,我们可能有时需要在渲染后做后期处理,那么就需要获取渲染后的像素值,这种情况下好的选择是使用颜色纹理作为附件。

  1. glGenTextures(1, &texColorBuffer);
  2. glBindTexture(GL_TEXTURE_2D, texColorBuffer);
  3. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
  4. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  5. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  6. glBindTexture(GL_TEXTURE_2D, 0);
  7. // 将它附加到当前绑定的帧缓冲对象
  8. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0);

  而深度和模板我们不需要获取其值,系统自己做深度和模板测试就行,这时我们对于深度和模板附件使用渲染缓冲对象。

  1. unsigned int rbo;
  2. glGenRenderbuffers(1, &rbo);
  3. glBindRenderbuffer(GL_RENDERBUFFER, rbo);
  4. glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);
  5. glBindRenderbuffer(GL_RENDERBUFFER, 0);
  6. //将渲染缓冲对象附加到帧缓冲的深度和模板附件上
  7. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);

  检查我们创建的帧缓冲是否完整

  1. //检查帧缓冲是否完整
  2. if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
  3. std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!" << std::endl;
  4. else std::cout << "Successful:: Framebuffer is complete..." << std::endl;

  渲染时,先使用我们创建的帧缓冲,将场景渲染至颜色纹理中。然后将帧缓冲改回屏幕默认的帧缓冲,将纹理直接渲染到屏幕上并在片段着色器中做后期处理。

  

  1. void SceneRendering::Draw() {
  2. // 第一处理阶段(Pass)
  3. glBindFramebuffer(GL_FRAMEBUFFER, this->framebuffer);
  4. glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
  5. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 我们现在不使用模板缓冲
  6. glEnable(GL_DEPTH_TEST);
  7. this->NormalBlendRendering();
  8. // 第二处理阶段
  9. glBindFramebuffer(GL_FRAMEBUFFER, 0); // 返回默认
  10. glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  11. glClear(GL_COLOR_BUFFER_BIT);
  12. glDisable(GL_DEPTH_TEST);
  13. this->shader_quad->use();
  14. glBindTexture(GL_TEXTURE_2D, this->texColorBuffer);
  15. quad->Draw();
  16. }

展示几个后期处理的效果:

1、反相,用1 - color

2、灰度,对rgb三个颜色分量加权输出

3、核处理

  1. #version 330 core
  2. out vec4 FragColor;
  3. in vec2 TexCoords;
  4. uniform sampler2D screenTexture;
  5. const float offset=1.0f/300.0f;
  6. void main()
  7. {
  8. vec2 offsets[9]=vec2[](
  9. vec2(-offset,offset), // 左上
  10. vec2( 0.0f, offset), // 正上
  11. vec2( offset, offset), // 右上
  12. vec2(-offset, 0.0f), //
  13. vec2( 0.0f, 0.0f), //
  14. vec2( offset, 0.0f), //
  15. vec2(-offset, -offset), // 左下
  16. vec2( 0.0f, -offset), // 正下
  17. vec2( offset, -offset) // 右下
  18. );
  19. float kernel[9]=float[](
  20. 1,1,1,
  21. 1,-8,1,
  22. 1,1,1
  23. );
  24. vec3 sampleTex[9];
  25. for(int i = 0; i < 9; i++)
  26. {
  27. sampleTex[i] = vec3(texture(screenTexture, TexCoords.st + offsets[i]));
  28. }
  29. vec3 col = vec3(0.0);
  30. for(int i = 0; i < 9; i++)
  31. col += sampleTex[i] * kernel[i];
  32. FragColor = vec4(col, 1.0);
  33. }

锐化:

模糊:

边缘检测:

 

原文链接:http://www.cnblogs.com/chen9510/p/11419773.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号