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(Embedded Systems)是OpenGL的一个精简版本,专门设计用于嵌入式系统,如移动设备和游戏机。OpenGL ES 2.0是其重要的一个版本,引入了许多现代图形编程的概念,为移动平台提供了强大的图形处理能力。 此...
在OpenGLES中,Framebuffer Object(FBO)是渲染到纹理或者离屏渲染的重要工具,它允许我们将渲染的结果存储在纹理中,以便后续处理或显示。本教程将深入讲解FBO的基本概念、创建过程以及其在iOS开发中的应用。 1. ...
### OpenGLES 3.1 API 快速参考卡知识点详解 #### 一、OpenGLES 命令语法 在 OpenGLES 3.1 中,命令的构成包括返回类型、名称以及可选的数据类型标识(如 `i` 表示 32 位整型、`i64` 表示 64 位整型、`f` 表示 32 ...
### OpenGL-ES-2.0 编程指南关键知识点概览 #### 1. OpenGLES 2.0 概念介绍 ...以上内容涵盖了OpenGLES 2.0编程指南的核心知识点,旨在帮助开发者更好地理解和掌握OpenGLES 2.0的相关技术和实践技巧。
### 西蒙iPhone-OpenGL ES 教程-01知识点详解 #### 一、OpenGL ES 简介 OpenGL ES(OpenGL for Embedded Systems)是一种专为嵌入式设备设计的图形库,它允许开发者在不依赖任何特定硬件的情况下编写高质量的2D和...
它通常与OpenGL ES不直接交互,但在构建例如3D地理信息系统或可视化应用时,可能会利用Elasticsearch来检索和组织数据,然后通过OpenGL ES进行呈现。 总的来说,OpenGL ES 3.0编程指南涵盖了移动和嵌入式设备图形...
OpenGL ES 3.0编程指南是面向初学者的优秀教程,旨在帮助读者深入理解并掌握OpenGL ES 3.0这一移动设备和嵌入式系统上的图形处理标准。OpenGL ES(Embedded Systems)是OpenGL的轻量级版本,专为资源有限但需要高...
`GLSurfaceView`充当OpenGL ES与Android View层次结构之间的桥梁,它不仅适应于Android Activity的生命周期,还简化了Framebuffer像素格式的选择,以及创建和管理绘图线程,确保动画效果平滑流畅。此外,它还提供了...
OpenGLES的核心特性之一是其始终将Framebuffer对象作为渲染目标,这意味着所有的图形输出都将被发送到Framebuffer对象,无论是在屏幕上还是离屏渲染。此外,由于不同设备的硬件配置差异,OpenGLES在不同设备上的功能...
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 ...
8. **帧缓冲对象(Framebuffer Object)**:扩展了OpenGL ES的渲染目标,可以将渲染结果保存到纹理或者离屏表面,用于后期合成和屏幕外渲染。 9. **着色语言GLSL**:OpenGL Shading Language是OpenGL ES中编写着色...
其次,OpenGL ES 3.0引入了统一的浮点纹理和帧缓冲对象(Framebuffer Objects,FBO),使得在内存中存储和处理浮点数据变得更加便捷。这为科学可视化、高级光照和后期处理特效提供了坚实的基础。同时,新的浮点纹理...
在`surfaceCreated()`中,你可以初始化OpenGL环境,创建和绑定帧缓冲对象(framebuffer object, FBO),并设置视口大小。`surfaceChanged()`方法中,根据Surface的尺寸调整视口。在`surfaceDestroyed()`时,清理资源...
OpenGLES2.0是该库的一个版本,它引入了着色器语言(GLSL),允许开发者编写自定义的顶点和片段着色器,以实现更复杂的图形效果。本示例将关注如何在iOS应用中使用OpenGLES2.0来清除屏幕。 首先,理解OpenGL ES中的...
2. **Java框架层**:这一层通过`javax.microedition.khronos.opengles`和`android.opengl`这两个包提供Java级别的接口,用于控制OpenGLES,并且与Android GUI系统建立联系。 #### 三、OpenGLES的本地代码分析 在...
OpenGL ES 3.0对帧缓冲对象(Framebuffer Objects, FBOs)进行了扩展,添加了多重渲染目标(Multiple Render Targets, MRT)功能,允许一次绘制到多个颜色附件,极大地增强了渲染复杂场景的能力。同时,新的深度和...
### IPhone OpenGL ES 教程知识点详述 #### 一、OpenGL ES 概述与应用场景 OpenGL ES(OpenGL for Embedded Systems)是一种专为移动设备设计的图形库,它基于OpenGL标准,但针对嵌入式系统进行了优化。由于其轻量...