FrameBuffer对象被用来存放渲染的结果,FrameBuffer可以使你对颜色,模型,色深等的创建精确。
下面是创建FrameBuffer的方法:
1:创建framebuffer对象。
2:创建一个或多个对象 (renderbuffers or textures),对他们进行存储分配,将它们付着到framebuffer的付着点上去。
3:测试framebuffer的完整性。
下面是Sample Code
生成一个OfferScreen Framebuffer对象
1:生成并绑定framebuffer
GLuint framebuffer;
|
glGenFramebuffers(1, &framebuffer);
|
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
|
2:生成colorRenderbuffer,分配内存,付着到framebuffer上。
GLuint colorRenderbuffer;
|
glGenRenderbuffers(1, &colorRenderbuffer);
|
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, width, height);
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
|
3:生成depthRenderbuffer,分配内存,付着到framebuffer上。
GLuint depthRenderbuffer;
|
glGenRenderbuffers(1, &depthRenderbuffer);
|
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
|
4,检查framebuffer的完整性,在需要在frame属性被编辑后调用:
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ;
|
if(status != GL_FRAMEBUFFER_COMPLETE) {
|
NSLog(@"failed to make complete framebuffer object %x", status);
|
}
|
用framebuffer进行纹理渲染:
1:创建一个framebuffer对象。
2:创建目的纹理,并将其付着到framebuffer上。
// create the texture
|
GLuint texture;
|
glGenTextures(1, &texture);
|
glBindTexture(GL_TEXTURE_2D, texture);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
|
3:生成depthRenderbuffer,分配内存,付着到framebuffer上。(同上)
4:检查framebuffer的完整性。(同上)
渲染 Core Animation Layer:
在iOS里面都是由Core Animation Layer来作显示效果的,但是OpenGL ES没有直接使用CAEAGLLayer而是定义一个UIView的子类,UIView可以被CAEAGLLayer支持。
下面是生成OpenGL ES的View步骤:
1:生成一个UIView的子类用来做OpenGL ES的View;
2:重写(override)layerClass方法,使得你的View使用CAEAGLLayer
作为它的底层。layerClass返回一个CAEAGLLayer。
+ (Class) layerClass
|
{
|
return [CAEAGLLayer class];
|
}
|
3:在View 的初始化过程中,读取view的layer属性,代码如下:
myEAGLLayer = (CAEAGLLayer*)self.layer;
4:设置layer的属性。
为了最好的效果,设置opaque
= yes;使其不透明。
5:分配一个Context然后设置它为currentContext;
6:生成一个FrameBuffer(上面有详细叙述)
7:生成一个color renderbuffer,通过调用 Context的renderbufferStorage:fromDrawable:方法分配空间给他。下面是sampleCode:
GLuint colorRenderbuffer;
|
glGenRenderbuffers(1, &colorRenderbuffer);
|
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
|
[myContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:myEAGLLayer];
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
|
注意:如果Layer的范围改变的时候,必须重新
reallocate renderbuffer,不然会和显示尺寸出现冲突。
8:读取的renderbuffer高度和宽度。
GLint width;
|
GLint height;
|
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width);
|
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height);
|
9:生成和付着depth buffer;
10 :测试framebuffer。
绘制Framebuffer:
绘制FrameBuffer有两种方法:1:按需求绘制 2:在动画循环中绘制。
按需求绘制:适合不经常变化或者当用户有输入才进行相应的变化的状况。
注意:OpenGL ESview不应该使用DrawRect方法,而应该构造自己的方法去绘制。在数据变化,或者需要绘制的时候去调用自己的方法。
这样作的原因是为了防止UIKit在drwaRect的方法执行时被影响。
画循环中绘制:当你的数据很频繁的变化的话,请使用这种绘制方法。比如游戏,或者对动态效果要求很严格,需要有圆滑的动画的时候。
在iOS中,最好的方法是把你的绘制方法和CADisplayLink
对象设置在一起。这个对象可以使你的绘图频率和屏幕的刷新速率同期。下面使创建一个CADisplayLink的SampleCode:
displayLink = [myView.window.screen displayLinkWithTarget:self selector:@selector(drawFrame)];
|
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
|
在你的drawFrame方法中。请读取displaylink的timestamp属性。用来了解下次drawframe的时刻。用来计算你下次显示的数据。
在大多数情况下displaylink的启动频率大概使60Hz,根据硬件环境不同会有变化。但是动画不需要这么快的刷新频率(电影24Hz)。
你可以设置一个display link的 frameInterval
属性,来决定,屏幕每刷新几次进行一次描绘。加入frameInterval是3的话,大概就是20hz的绘制频率。
相关推荐
OpenGL-ES-2.0-编程指南-中文版,包括帧缓存的一些错误。比如: GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
个人博客讲Opengles入门教程的第13课,关于Framebuffer object的代码示例
使用framebuffer来将opengl的绘制从屏幕转到内存中进行,这样可以支持离线渲染。
OpenGL® ES™ is the industry’s leading software interface and graphics library for rendering sophisticated 3D graphics on handheld and embedded devices. The newest version, OpenGL ES 3.0, makes it ...
OpenGL3.3_FrameBuffer_RenderToTexture.rar
简单的代码分析,正常下载就可以了,里面是文本文件,和excel文件
使用arm平台 framebuffer 操作lcd freetype解码字库 显示到lcd上去
luvcview-framebuffer 在那位兄弟的基础上加了framebuffer的操作,并把摄像头原始YUYV的数据转换成RGB24格式在framebuffer上显示,测试可以正常显示,交叉编译只需要修改一下Makefile里的交叉编译器路径即可。
考虑到更多工程师对于 python 环境不是特别熟悉,因此我们升级了一个界面基于 ST-LINK 的帧缓存分析工具 STM32GUI Framebuffer Analyer。目的是用于协助 GUI 开发工程师,分析帧缓存图形数据在不同数据处理/显示阶段...
Linux设备驱动之Framebuffer分析.pdf
Android4.0下使用framebuffer抓屏并保存成bmp文件
VGA帧缓冲该板条仅使用一些定时器外设和一些G来实现嵌入式微控制器上的基本VGA文本输出,仅使用一些定时器外设和一些GPIO就可以实现嵌入式微控制器上的基本VGA文本输出。针脚。 此板条箱被编写为与硬件无关。...
srvfb - 通过HTTP流式传输framebuffer设备
基于FrameBuffer的嵌入式GUI图形抽象层设计,孙景,王虹,介绍了在嵌入式Linux操作系统下GUI的图形抽象层GAL的地位及其设计思路,研究了GUI的设计逻辑,着重阐述了如何在中低端设备上利用FrameBu
c++语言,opengles fbo 实例,跨平台,源码
LCD Framebuffer功能介绍,操作原理, Framebuffer API接口调用,以及编译运行
使用编译链接自定义的着色器(shader)。swift用GLSL语言来实现自定义顶点/片元着色器,并将图形进行...包含创建图层,创建上下文,清空缓存区设置RenderBuffer,设置FrameBuffer,开始绘制等步骤的详情代码和注释。
linux framebuffer编程,显示BMP图片
节点帧缓冲区 ...npm install framebuffer 或作为git clone: git clone https://github.com/denghongcai/node-framebuffer.git cd node-framebuffer npm install 用法 有关详细信息,请参见示例。
and advanced data techniques using framebuffer objects and compute shaders. New OpenGL features covered in this edition include Best practices and sample code for taking full advantage of shaders ...