CSharpGL(42)借助帧缓存实现渲染到纹理(RenderToTexture)
CSharpGL(42)借助帧缓存实现渲染到纹理(RenderToTexture)
渲染到纹理(Render To Texture)是实现很多OpenGL高级效果的一个基础。本文记录了如何用CSharpGL实现RTT。
下载
CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入(https://github.com/bitzhuwei/CSharpGL)
开始
如图所示,我们把teapot贴到一个矩形上了。这是借助RTT实现的。
RTT步骤如下:
- 创建Framebuffer,这Framebuffer里包含一个Texture,这个Texture就是RTT里的Texture。
- 绑定Framebuffer,然后正常渲染,然后解绑Framebuffer。(RTT结束)
- 此时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)相关推荐
- 理解OpenGL中帧缓存FrameBuffer 渲染缓存RenderingBuffer
操作都是在默认帧缓冲的渲染缓冲上进行的.默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些). 帧缓存帮助我们离屏渲染,提高渲染速度 unsigned int captureFBO; ...
- OpenGL帧缓存对象(FBO:Frame Buffer Object)(转载)
原文地址http://www.songho.ca/opengl/gl_fbo.html 但有改动. OpenGL Frame BufferObject(FBO) Overview: 在OpenGL渲染 ...
- Opengl编程学习笔记(五)——从FRAGMENT到PIXEL(framebuffer 帧缓存)
1.帧缓存包括颜色.scissor.alpha.stencil.depth这些缓存,所以帧缓存不是一片缓存,而是所有这些缓存的组合,帧缓存它对应了屏幕上的每一个pixel(不是真正的pixel,而是一 ...
- opengles2.0 帧缓存对象(FBO)
opengles2.0 帧缓存对象(FBO) 帧缓存对象(fbo)主要是用于做渲染到纹理. opengles2.0渲染到纹理的方法有三种: 第一,使用glCopyTexImage2D或者glCopyT ...
- OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13
OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13 文章目录 OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13 1 帧缓存运算 1.1 裁剪测 ...
- 【QA答疑】VRay3.4 for SketchUp2017 帧缓存面板
作者:活力网 今天带大家认识下VRay3.4 for SketchUp2017的帧缓存面板,我们将以Q&A的形式为大家解答疑惑. Q1:帧缓存面板的菜单栏按钮是什么,有什么作用? A1: 先来 ...
- coco2dx精灵和背景遮挡_Cocos2d-x精灵的性能优化——使用纹理图集和精灵帧缓存...
使用纹理图集 纹理图集(Texture)也称为精灵表(Sprite Sheet) 使用纹理图集的优点: 1.减少文件读取次数,读取一张图片比读取一推小文件要快 2.减少OpenGL ES绘制调用并且加 ...
- QT实现渲染到帧缓冲区,创建其纹理.
QT实现渲染到帧缓冲区,创建其纹理 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 渲染到帧缓冲区中并将其用作纹理. 帧缓冲区示例显示了如何渲染到帧缓冲区,创建其纹理 ...
- 图形硬件介绍——GPU/帧缓存
作者:桑榆 QQ:934440653 图形硬件介绍 一.GPU 二.GPU 2.1 帧缓存 2.1.1 颜色缓存 (color buffer) 2.1.2 Z-缓存(Z-buffer) 2.1.3 模 ...
最新文章
- 分别打印三位整数的个位、十位、百位
- 人工智能和机器学习技术推动企业发展
- 安卓代码拉下来编译后怎么运行_支付宝秒开是因为用了方舟编译器?官方回应...
- ICCV 2019 | 基于关联语义注意力模型的图像修复
- 网页中嵌入Excel控件
- 一个C++加密工具EncryptDecrypt.dll
- viewer.js实现预览效果
- win7纯净版系统锁定系统时间的设置方法
- 关于Jquery.Data()和HTML标签的data-*属性
- 数学女孩儿中的数列问题
- Spyder单步调试
- 如何将html的按钮做成圆角,HTML 圆角按钮的实现备忘
- C# DLL HRESULT:0x8007000B
- pytorch Cosine Annealing LR
- Java工程师必备技能有哪些?
- 阿里云IoT启动“IoT合伙人”计划,投5亿赋能100万开发者
- 安卓与苹果盒子与h5相互调用,js,vue
- Ktor 2.0?半香不香的尴尬
- 国产智多晶FPGA 带Cortex-M3硬核CPU的FPGA器件简介
- xxl-rpc remoting error(connect timed out), for url : http://172.26.112.1:9999/run