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过程概括如下:
private Framebuffer CreateFramebuffer(int width, int height)
{
var texture = new Texture(TextureTarget.Texture2D,
new NullImageFiller(width, height, GL.GL_RGBA, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE),
new SamplerParameters(
TextureWrapping.Repeat,
TextureWrapping.Repeat,
TextureWrapping.Repeat,
TextureFilter.Linear,
TextureFilter.Linear));
texture.Initialize();
this.BindingTexture = texture;
Renderbuffer colorBuffer = Renderbuffer.CreateColorbuffer(width, height, GL.GL_RGBA);
Renderbuffer depthBuffer = Renderbuffer.CreateDepthbuffer(width, height, DepthComponentType.DepthComponent24);
var framebuffer = new Framebuffer();
framebuffer.Bind();
framebuffer.Attach(colorBuffer);//
framebuffer.Attach(texture);//
framebuffer.Attach(depthBuffer);// special
framebuffer.SetDrawBuffers(GL.GL_COLOR_ATTACHMENT0 + );// as in 1 in framebuffer.Attach(texture);//
framebuffer.CheckCompleteness();
framebuffer.Unbind();
return framebuffer;
}
使用Framebuffer
创建Framebuffer后,先绑定Framebuffer,再像平时一样渲染,再解绑Framebuffer。
public void RenderBeforeChildren(RenderEventArgs arg)
{
if (this.Width <= || this.Height <= ) { return; } var viewport = new int[];
GL.Instance.GetIntegerv((uint)GetTarget.Viewport, viewport); this.framebuffer = this.helper.GetFramebuffer(this.Width, this.Height);
framebuffer.Bind();
GL.Instance.Viewport(, , this.Width, this.Height);
{
int[] value = new int[];
GL.Instance.GetIntegerv((uint)GetTarget.ColorClearValue, value);
{
vec3 color = this.BackgroundColor.ToVec3();
GL.Instance.ClearColor(color.x, color.y, color.z, 0.0f); // 0.0f for alpha channel, in case that transparent background is needed.
GL.Instance.Clear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT);
}
{
var args = new RenderEventArgs(this.Camera);
foreach (var item in this.Children)
{
RenderAction.Render(item, args);
}
}
{
GL.Instance.ClearColor(value[], value[], value[], value[]);// recover clear color.
}
}
GL.Instance.Viewport(viewport[], viewport[], viewport[], viewport[]);// recover viewport.
this.framebuffer.Unbind();
}
使用RTT
此时Framebuffer里包含的Texture已经有了想要的内容,我们可以像使用其他普通Texture一样使用此Texture。例如本文开始处将Texture贴到一个矩形上。

当然也可以结合Billboard的需求,把Texture贴到Billboard上。
总结
最近几个月我在尝试修整CSharpGL,感觉好多了。
CSharpGL(42)借助帧缓存实现渲染到纹理(RenderToTexture)的更多相关文章
- OpenGL帧缓存对象(FBO:Frame Buffer Object)(转载)
		
原文地址http://www.songho.ca/opengl/gl_fbo.html 但有改动. OpenGL Frame BufferObject(FBO) Overview: 在OpenGL渲染 ...
 - OpenGL帧缓存对象(FBO:Frame Buffer Object)
		
http://blog.csdn.net/dreamcs/article/details/7691690 转http://blog.csdn.net/xiajun07061225/article/de ...
 - OpenGL帧缓存对象(FBO:Frame Buffer Object) 【转】
		
http://blog.csdn.net/dreamcs/article/details/7691690 原文地址http://www.songho.ca/opengl/gl_fbo.html 但有改 ...
 - 【OpenGL】OpenGL帧缓存对象(FBO:Frame Buffer Object)  【转】
		
http://blog.csdn.net/xiajun07061225/article/details/7283929/ OpenGL Frame BufferObject(FBO) Overview ...
 - WebGL简易教程(十三):帧缓存对象(离屏渲染)
		
目录 1. 概述 2. 示例 2.1. 着色器部分 2.2. 初始化/准备工作 2.2.1. 着色器切换 2.2.2. 帧缓冲区 2.3. 绘制函数 2.3.1. 初始化顶点数组 2.3.2. 传递非 ...
 - OpenGL读取帧缓存数据
		
https://blog.csdn.net/niu2212035673/article/details/80251949 简述有些时候我们可能需要获取渲染后的图像数据,比较常用的函数是glReadPi ...
 - [译]Vulkan教程(17)帧缓存
		
[译]Vulkan教程(17)帧缓存 Framebuffers 帧缓存 We've talked a lot about framebuffers in the past few chapters a ...
 - 【Cocos2d-x 3.x】 精灵帧缓存和纹理缓存
		
转自泰然网(Cocos2d-x 3.x官方文档):精灵帧缓存:http://www.tairan.com/archives/6378/ 纹理缓存: http://www.tairan.com/ar ...
 - SpriteFrameCache 精灵帧缓存
		
//获取精灵帧缓存的单例对象 auto spriteFrameCache = SpriteFrameCache::getInstance(); //从plist文件添加多个精灵帧 spriteFra ...
 
随机推荐
- 设计模式的征途—6.建造者(Builder)模式
			
建造者模式又称为生成器模式,它是一种较为复杂.使用频率也相对较低的创建型模式.建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品.因为,没有人买车会只买一个方向盘或者轮胎,大 ...
 - Linux-vim学习入门
			
1.前言 vi/vim是linux中很重要的文本编辑器.我第一次使用这个编辑器时,很不习惯,甚至都不知道如何移动光标和插入字符.慢慢地经过学习,才知道如何使用vi/vim. vi/vi ...
 - Java学习笔记——设计模式之二.策略模式
			
明确是王道 --Clean Code 先定义策略类 package cn.no2.strategy; public abstract class Strategy { //省略属性 //算法方法 pu ...
 - IO多路复用深入浅出
			
前言 从零单排高性能问题,这次轮到异步通信了.这个领域入门有点难,需要了解UNIX五种IO模型和 TCP协议,熟练使用三大异步通信框架:Netty.NodeJS.Tornado.目前所有标榜异步的通信 ...
 - 通过js给网页加上水印背景
			
有些后端管理系统,因为业务逻辑的需要,需要加上水印,下面就是水印方法. function watermark(settings) { debugger; //默认设置 var defaultSetti ...
 - 随笔-关于公网IP无法访问服务器的解决办法
			
笔者的环境: windows server 2008 r2 .IIS,php,MySql. 理论上来讲,服务器,其实就是一个大型计算机,我们通过访问服务器的某个端口请求某个资源. 正常情况下,如果没有 ...
 - 基于HTML5快速搭建TP-LINK电信拓扑设备面板
			
今天我们以真实的TP-LINK设备面板为模型,完成设备面板的搭建,和指示灯的闪烁和图元流动. 先来目睹下最终的实现效果:http://www.hightopo.com/demo/blog_tplink ...
 - 初次尝试Linux并记录一二
			
假如我有一个Linux系统 安装过程:加载中... 版本:Ubuntu Server 16.04.1 LTS 64位 得到一个IP:*.*.*.* 下载工具 WinSCP: WinSCP是一个Wind ...
 - 镜像命名的最佳实践 - 每天5分钟玩转 Docker 容器技术(18)
			
我们已经学会构建自己的镜像了.接下来的问题是如何在多个 Docker Host 上使用镜像. 这里有几种可用的方法: 用相同的 Dockerfile 在其他 host 构建镜像. 将镜像上传到公共 R ...
 - UITextField关闭自动联想功能
			
在textField输入内容时,如果内容为英文,输入的英文如果不正确的单词就是有红色的线报警,关闭英文自动联想功能 self.autocorrectionType = UITextAutocorrec ...