没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论







本文主要介绍使用 OpenGL ES 来渲染 I420(YUV420P) ,
NV12(YUV420SP)的方法,关于 YUV 的知识,可以看这里《YUV 颜色编
码解析》,同样会用到一些简单的 OpenGL shader 知识,可以看看
OpenGL 的着色器语言。为了书写方便,以下所谈的 OpenGL 特指
OpenGL ES。
OpenGL ES 是 OpenGL 的精简版本,主要针对于手机、游戏主机等嵌入
式设备,它提供了一套设备图形硬件的软件接口,通过直接操作图形硬
件,使我们能够高效地绘制图形。OpenGL 在 iOS 架构中属于媒体层,
与 quartz(core graphics)类似,是相对底层的技术,可以控制每一帧的图
形绘制。由于图形渲染是通过图形硬件(GPU)来完成的,相对于使用
CPU,能够获得更高的帧率同时不会因为负载过大而造成卡顿。

OpenGL 处于绘制接口的底层
创建 GLView
我们需要创建一个用来展示 OpenGL 绘制内容的 View,只需要将 UIView
的根图层(underlying layer)替换成 CAEAGLLayer 实例即可。通过覆盖
UIView 的类方法+(Class)layerClass,可以实现这一点,
CAEAGLLayer 默认是透明的,这会影响性能,所以将它设为不透明。
+ (class)layerClass {
return [CAEAGLLayer class];
}
- (void)setupLayer {
_eaglLayer = (CAEAGLLayer*) self.layer;
_eaglLayer.opaque = YES;
}
创建 EAGLContext
EAGLContext 对象管理 OpenGL 绘制所需要的所有信息,和 Quartz 2D
所使用的 CGContext 类似。
- (void)setupContext {
//创建一个 OpenGLES 2.0 接口的 context
EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES2;
_context = [[EAGLContext alloc] initWithAPI:api];
if (!_context) {
NSLog(@"Failed to initialize OpenGLES 2.0 context");
exit(1);

}
//将其设置为 current context
if (![EAGLContext setCurrentContext:_context]) {
NSLog(@"Failed to set current OpenGL context");
exit(1);
}
}
创建 render buer
render buffer 用来存储将要绘制到屏幕上图像。OpenGL 中的对象都需要
创建、绑定,并且都是 ID 引用的。
- (void)setupRenderBuffer {
//创建一个 render buffer 对象,并绑定到 GL_RENDERBUFFER 目标上
glGenRenderbuffers(1, &_renderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
//为 render buffer 分配存储空间
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
}
创建 frame buer
一个 frame buffer 对象包括 render buffer, depth buffer, stencil buffer 等,
拥有 OpenGL 绘制时需要的信息。
- (void)setupFrameBuffer {
GLuint framebuffer;
glGenFramebuffers(1, &framebuffer);

glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
//将之前创建的 render buffer 附着到 frame buffer 作为其 logical buffer
//GL_COLOR_ATTACHMENT0 指定第一个颜色缓冲区附着点
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER, _renderBuffer);
}
glFramebufferRenderbuffer 调用后,render buffer 通过
GL_COLOR_ATTACHMENT0 引用使用 render buffer
渲染
- (void)render {
//设置用来清除屏幕的颜色,类似于 quartz 中设置 CGcontext 画笔的颜色
glClearColor(0, 0, 0, 1.0);
//执行清除操作,设置 render buffer 中的像素颜色为上一步指定的颜色
glClear(GL_COLOR_BUFFER_BIT);
//渲染 render buffer 中的图像到 GLView 的 CAEAGLLayer
[_context presentRenderbuffer:GL_RENDERBUFFER];
}
shader(着色器)
shader 是上是在 GPU 上执行的程序,保存在.glsl 文件中或以字符串形式
写在 OpenGL 代码里,使用 GLSL(OpenGL shading language)语言编写,
shader 在运行时编译,链接,最终在 GPU 上执行采样操作。
OpenGL 中有两种 shader:
剩余19页未读,继续阅读
资源评论


lucky_uestc
- 粉丝: 2
- 资源: 7
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
