`
wsqwsq000
  • 浏览: 685015 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

OpenGL ES --FrameBuffer

 
阅读更多

 

 

OpenGL ES --FrameBuffer

 

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的绘制频率。

 

 

 

分享到:
评论
1 楼 wangyuchun_799 2011-11-17  
写的非常好,希望能继续更新啊,已经留下了你的文章。期待更新⋯⋯

相关推荐

    OpenGL快速查找手册-OpenGL-ES-2_0-Reference-card

    OpenGL ES(Embedded Systems)是OpenGL的一个精简版本,专门设计用于嵌入式系统,如移动设备和游戏机。OpenGL ES 2.0是其重要的一个版本,引入了许多现代图形编程的概念,为移动平台提供了强大的图形处理能力。 此...

    OpenGLES demo - 13. Framebuffer FBO

    在OpenGLES中,Framebuffer Object(FBO)是渲染到纹理或者离屏渲染的重要工具,它允许我们将渲染的结果存储在纹理中,以便后续处理或显示。本教程将深入讲解FBO的基本概念、创建过程以及其在iOS开发中的应用。 1. ...

    opengles31-quick-reference-card.pdf

    ### OpenGLES 3.1 API 快速参考卡知识点详解 #### 一、OpenGLES 命令语法 在 OpenGLES 3.1 中,命令的构成包括返回类型、名称以及可选的数据类型标识(如 `i` 表示 32 位整型、`i64` 表示 64 位整型、`f` 表示 32 ...

    OpenGL-ES-2.0-编程指南-中文版

    ### OpenGL-ES-2.0 编程指南关键知识点概览 #### 1. OpenGLES 2.0 概念介绍 ...以上内容涵盖了OpenGLES 2.0编程指南的核心知识点,旨在帮助开发者更好地理解和掌握OpenGLES 2.0的相关技术和实践技巧。

    西蒙iphone-OpenGL ES 教程-01

    ### 西蒙iPhone-OpenGL ES 教程-01知识点详解 #### 一、OpenGL ES 简介 OpenGL ES(OpenGL for Embedded Systems)是一种专为嵌入式设备设计的图形库,它允许开发者在不依赖任何特定硬件的情况下编写高质量的2D和...

    OPENGL ES 3.0编程指南

    它通常与OpenGL ES不直接交互,但在构建例如3D地理信息系统或可视化应用时,可能会利用Elasticsearch来检索和组织数据,然后通过OpenGL ES进行呈现。 总的来说,OpenGL ES 3.0编程指南涵盖了移动和嵌入式设备图形...

    OPENGL ES 3.0编程指南.pdf

    OpenGL ES 3.0编程指南是面向初学者的优秀教程,旨在帮助读者深入理解并掌握OpenGL ES 3.0这一移动设备和嵌入式系统上的图形处理标准。OpenGL ES(Embedded Systems)是OpenGL的轻量级版本,专为资源有限但需要高...

    Android OpenGL ES 简明开发教程

    `GLSurfaceView`充当OpenGL ES与Android View层次结构之间的桥梁,它不仅适应于Android Activity的生命周期,还简化了Framebuffer像素格式的选择,以及创建和管理绘图线程,确保动画效果平滑流畅。此外,它还提供了...

    OpenGLES_ProgrammingGuide

    OpenGLES的核心特性之一是其始终将Framebuffer对象作为渲染目标,这意味着所有的图形输出都将被发送到Framebuffer对象,无论是在屏幕上还是离屏渲染。此外,由于不同设备的硬件配置差异,OpenGLES在不同设备上的功能...

    OpenGL ES 3.0 Programming Guide, 2nd Edition

    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 ...

    OpenGL-ES-2.0-.rar_OpenGL_Others_

    8. **帧缓冲对象(Framebuffer Object)**:扩展了OpenGL ES的渲染目标,可以将渲染结果保存到纹理或者离屏表面,用于后期合成和屏幕外渲染。 9. **着色语言GLSL**:OpenGL Shading Language是OpenGL ES中编写着色...

    OPENGL ES 3.0编程指南 原书第2版

    其次,OpenGL ES 3.0引入了统一的浮点纹理和帧缓冲对象(Framebuffer Objects,FBO),使得在内存中存储和处理浮点数据变得更加便捷。这为科学可视化、高级光照和后期处理特效提供了坚实的基础。同时,新的浮点纹理...

    Andoird OpenGL ES 入门程序

    在`surfaceCreated()`中,你可以初始化OpenGL环境,创建和绑定帧缓冲对象(framebuffer object, FBO),并设置视口大小。`surfaceChanged()`方法中,根据Surface的尺寸调整视口。在`surfaceDestroyed()`时,清理资源...

    IOS OpenGLES2.0 清除屏幕示例

    OpenGLES2.0是该库的一个版本,它引入了着色器语言(GLSL),允许开发者编写自定义的顶点和片段着色器,以实现更复杂的图形效果。本示例将关注如何在iOS应用中使用OpenGLES2.0来清除屏幕。 首先,理解OpenGL ES中的...

    Android_OpenGL_ES_分析与实践

    2. **Java框架层**:这一层通过`javax.microedition.khronos.opengles`和`android.opengl`这两个包提供Java级别的接口,用于控制OpenGLES,并且与Android GUI系统建立联系。 #### 三、OpenGLES的本地代码分析 在...

    OpenGL ES 3.0 Programming Guide(2nd Edition)(中英文).rar

    OpenGL ES 3.0对帧缓冲对象(Framebuffer Objects, FBOs)进行了扩展,添加了多重渲染目标(Multiple Render Targets, MRT)功能,允许一次绘制到多个颜色附件,极大地增强了渲染复杂场景的能力。同时,新的深度和...

    IPhone openGL ES教程

    ### IPhone OpenGL ES 教程知识点详述 #### 一、OpenGL ES 概述与应用场景 OpenGL ES(OpenGL for Embedded Systems)是一种专为移动设备设计的图形库,它基于OpenGL标准,但针对嵌入式系统进行了优化。由于其轻量...

Global site tag (gtag.js) - Google Analytics