CSharpGL(42)借助帧缓存实现渲染到纹理(RenderToTexture)

渲染到纹理(Render To Texture)是实现很多OpenGL高级效果的一个基础。本文记录了如何用CSharpGL实现RTT。

下载

CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入(https://github.com/bitzhuwei/CSharpGL)

开始

如图所示,我们把teapot贴到一个矩形上了。这是借助RTT实现的。

RTT步骤如下:

  1. 创建Framebuffer,这Framebuffer里包含一个Texture,这个Texture就是RTT里的Texture。
  2. 绑定Framebuffer,然后正常渲染,然后解绑Framebuffer。(RTT结束)
  3. 此时Framebuffer里包含的Texture已经有了想要的内容,我们可以像使用其他普通Texture一样使用此Texture。

创建Framebuffer

Framebuffer里包含若干renderbuffer和一个depthbuffer,就像VertexArrayObject里包含若干VertexBuffer和一个IndexBuffer。

创建Framebuffer过程概括如下:

 1         private Framebuffer CreateFramebuffer(int width, int height)
 2         {
 3             var texture = new Texture(TextureTarget.Texture2D,
 4                 new NullImageFiller(width, height, GL.GL_RGBA, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE),
 5                 new SamplerParameters(
 6                     TextureWrapping.Repeat,
 7                     TextureWrapping.Repeat,
 8                     TextureWrapping.Repeat,
 9                     TextureFilter.Linear,
10                     TextureFilter.Linear));
11             texture.Initialize();
12             this.BindingTexture = texture;
13             Renderbuffer colorBuffer = Renderbuffer.CreateColorbuffer(width, height, GL.GL_RGBA);
14             Renderbuffer depthBuffer = Renderbuffer.CreateDepthbuffer(width, height, DepthComponentType.DepthComponent24);
15             var framebuffer = new Framebuffer();
16             framebuffer.Bind();
17             framebuffer.Attach(colorBuffer);//0
18             framebuffer.Attach(texture);//1
19             framebuffer.Attach(depthBuffer);// special
20             framebuffer.SetDrawBuffers(GL.GL_COLOR_ATTACHMENT0 + 1);// as in 1 in framebuffer.Attach(texture);//1
21             framebuffer.CheckCompleteness();
22             framebuffer.Unbind();
23             return framebuffer;
24         }

使用Framebuffer

创建Framebuffer后,先绑定Framebuffer,再像平时一样渲染,再解绑Framebuffer。

 1         public void RenderBeforeChildren(RenderEventArgs arg)
 2         {
 3             if (this.Width <= 0 || this.Height <= 0) { return; }
 4
 5             var viewport = new int[4];
 6             GL.Instance.GetIntegerv((uint)GetTarget.Viewport, viewport);
 7
 8             this.framebuffer = this.helper.GetFramebuffer(this.Width, this.Height);
 9             framebuffer.Bind();
10             GL.Instance.Viewport(0, 0, this.Width, this.Height);
11             {
12                 int[] value = new int[4];
13                 GL.Instance.GetIntegerv((uint)GetTarget.ColorClearValue, value);
14                 {
15                     vec3 color = this.BackgroundColor.ToVec3();
16                     GL.Instance.ClearColor(color.x, color.y, color.z, 0.0f); // 0.0f for alpha channel, in case that transparent background is needed.
17                     GL.Instance.Clear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT);
18                 }
19                 {
20                     var args = new RenderEventArgs(this.Camera);
21                     foreach (var item in this.Children)
22                     {
23                         RenderAction.Render(item, args);
24                     }
25                 }
26                 {
27                     GL.Instance.ClearColor(value[0], value[1], value[2], value[3]);// recover clear color.
28                 }
29             }
30             GL.Instance.Viewport(viewport[0], viewport[1], viewport[2], viewport[3]);// recover viewport.
31             this.framebuffer.Unbind();
32         }

使用RTT

此时Framebuffer里包含的Texture已经有了想要的内容,我们可以像使用其他普通Texture一样使用此Texture。例如本文开始处将Texture贴到一个矩形上。

当然也可以结合Billboard的需求,把Texture贴到Billboard上。

总结

最近几个月我在尝试修整CSharpGL,感觉好多了。

转载于:https://www.cnblogs.com/bitzhuwei/p/CSharpGL-42-render-to-texture-via-framebuffer.html

CSharpGL(42)借助帧缓存实现渲染到纹理(RenderToTexture)相关推荐

  1. 理解OpenGL中帧缓存FrameBuffer 渲染缓存RenderingBuffer

    操作都是在默认帧缓冲的渲染缓冲上进行的.默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些). 帧缓存帮助我们离屏渲染,提高渲染速度 unsigned int captureFBO; ...

  2. OpenGL帧缓存对象(FBO:Frame Buffer Object)(转载)

    原文地址http://www.songho.ca/opengl/gl_fbo.html 但有改动. OpenGL Frame BufferObject(FBO) Overview: 在OpenGL渲染 ...

  3. Opengl编程学习笔记(五)——从FRAGMENT到PIXEL(framebuffer 帧缓存)

    1.帧缓存包括颜色.scissor.alpha.stencil.depth这些缓存,所以帧缓存不是一片缓存,而是所有这些缓存的组合,帧缓存它对应了屏幕上的每一个pixel(不是真正的pixel,而是一 ...

  4. opengles2.0 帧缓存对象(FBO)

    opengles2.0 帧缓存对象(FBO) 帧缓存对象(fbo)主要是用于做渲染到纹理. opengles2.0渲染到纹理的方法有三种: 第一,使用glCopyTexImage2D或者glCopyT ...

  5. OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13

    OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13 文章目录 OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13 1 帧缓存运算 1.1 裁剪测 ...

  6. 【QA答疑】VRay3.4 for SketchUp2017 帧缓存面板

    作者:活力网 今天带大家认识下VRay3.4 for SketchUp2017的帧缓存面板,我们将以Q&A的形式为大家解答疑惑. Q1:帧缓存面板的菜单栏按钮是什么,有什么作用? A1: 先来 ...

  7. coco2dx精灵和背景遮挡_Cocos2d-x精灵的性能优化——使用纹理图集和精灵帧缓存...

    使用纹理图集 纹理图集(Texture)也称为精灵表(Sprite Sheet) 使用纹理图集的优点: 1.减少文件读取次数,读取一张图片比读取一推小文件要快 2.减少OpenGL ES绘制调用并且加 ...

  8. QT实现渲染到帧缓冲区,创建其纹理.

    QT实现渲染到帧缓冲区,创建其纹理 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 渲染到帧缓冲区中并将其用作纹理. 帧缓冲区示例显示了如何渲染到帧缓冲区,创建其纹理 ...

  9. 图形硬件介绍——GPU/帧缓存

    作者:桑榆 QQ:934440653 图形硬件介绍 一.GPU 二.GPU 2.1 帧缓存 2.1.1 颜色缓存 (color buffer) 2.1.2 Z-缓存(Z-buffer) 2.1.3 模 ...

最新文章

  1. 分别打印三位整数的个位、十位、百位
  2. 人工智能和机器学习技术推动企业发展
  3. 安卓代码拉下来编译后怎么运行_支付宝秒开是因为用了方舟编译器?官方回应...
  4. ICCV 2019 | 基于关联语义注意力模型的图像修复
  5. 网页中嵌入Excel控件
  6. 一个C++加密工具EncryptDecrypt.dll
  7. viewer.js实现预览效果
  8. win7纯净版系统锁定系统时间的设置方法
  9. 关于Jquery.Data()和HTML标签的data-*属性
  10. 数学女孩儿中的数列问题
  11. Spyder单步调试
  12. 如何将html的按钮做成圆角,HTML 圆角按钮的实现备忘
  13. C# DLL HRESULT:0x8007000B
  14. pytorch Cosine Annealing LR
  15. Java工程师必备技能有哪些?
  16. 阿里云IoT启动“IoT合伙人”计划,投5亿赋能100万开发者
  17. 安卓与苹果盒子与h5相互调用,js,vue
  18. Ktor 2.0?半香不香的尴尬
  19. 国产智多晶FPGA 带Cortex-M3硬核CPU的FPGA器件简介
  20. xxl-rpc remoting error(connect timed out), for url : http://172.26.112.1:9999/run

热门文章

  1. shell 解析 json
  2. svn安装的几种方法
  3. 聚集索引和非聚集索引实例
  4. XCode4 实践HelloWorld
  5. 光脚丫学LINQ(029):如何将列表示为类成员
  6. DataList编辑、更新、取消、删除、分页(分页控件 AspNetPager.dll)
  7. PyQt5简介及demo
  8. memset与malloc性能测试(转)
  9. Ubuntu 改变workspace布局
  10. 模块化编程AMDCommonJS