在iOS上使用OpenGL ES渲染YUV

1)创建OpenGL context

[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

2)layer设置成不透明

_eaglLayer = (CAEAGLLayer*) self.layer;

_eaglLayer.opaque = YES;

3)创建YUV texture

glGenTextures(1, &m_nTexturePlanarY);

glGenTextures(1, &m_nTexturePlanarU);

glGenTextures(1, &m_nTexturePlanarV);

4)添加shader

GLuint vertexShader = CompileShader(_VERTEX_SHADER_Y_U_V, GL_VERTEX_SHADER);

GLuint fragmentShader = CompileShader(_FRAGMENT_SHADER_Y_U_V, GL_FRAGMENT_SHADER);

glAttachShader(m_nProgramHandle, vertexShader);

glAttachShader(m_nProgramHandle, fragmentShader);

摘录一段GLSL介绍

OpenGL着色语言(GLSL―OpenGL Shading Language)是用来在OpenGL中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic Processor Unit图形处理单元)上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程型。比如:视图转换、投影转换等。GLSL(GL Shading Language)的着色器代码分成2个部分:Vertex Shader(顶点着色器)和Fragment(片断着色器),有时还会有Geometry
Shader(几何着色器)。负责运行顶点着色的是顶点着色器。它可以得到当前OpenGL 中的状态,GLSL内置变量进行传递。GLSL其使用C语言作为基础高阶着色语言,避免了使用汇编语言或硬件规格语言的复杂性。

5)创建render buffer

glGenRenderbuffers(1, &nColorRenderBuffer);

glBindRenderbuffer(GL_RENDERBUFFER, nColorRenderBuffer);

6)创建frame buffer

glGenFramebuffers(1, &nFrameBuffer);

glBindFramebuffer(GL_FRAMEBUFFER, nFrameBuffer);

7)创建viewport

glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &nBackingWidth);

glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &nBackingHeight);

glViewport(0, 0, nBackingWidth, nBackingHeight);

glClearColor(0.0, 0.0, 0.0, 1.0);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

8)设置四个顶点,四个顶点的设置顺序不同,可以实现图像的上下、左右翻转。

在最后render到屏幕时会用到这些顶点,如下

glVertexAttribPointer(m_nPositionSlot, 2, GL_FLOAT, 0, 0, m_fSquareVertices);

glVertexAttribPointer(m_nTexCoordSlot, 2, GL_FLOAT, 0, 0, m_fTextureVertices);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

9)YUV数据到来时,即可以开始渲染,步骤如下

a. YUV数据更新到texture上

GLTexImage2D(m_nTexturePlanarY, m_pFrameData, m_nTextureWidth, m_nTextureHeight);

GLTexImage2D(m_nTexturePlanarU, pBuffer - (nWidthUV * nHeightUV), nWidthUV, nHeightUV);

GLTexImage2D(m_nTexturePlanarV, pBuffer, nWidthUV, nHeightUV);

b. Bind YUV texture

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, m_nTexturePlanarY);

glUniform1i(m_nTextureUniformY, 0);

glActiveTexture(GL_TEXTURE1);

glBindTexture(GL_TEXTURE_2D, m_nTexturePlanarU);

glUniform1i(m_nTextureUniformU, 1);

glActiveTexture(GL_TEXTURE2);

glBindTexture(GL_TEXTURE_2D, m_nTexturePlanarV);

glUniform1i(m_nTextureUniformV, 2);

c. 绘制图像

glVertexAttribPointer(m_nPositionSlot, 2, GL_FLOAT, 0, 0, m_fSquareVertices);

glVertexAttribPointer(m_nTexCoordSlot, 2, GL_FLOAT, 0, 0, m_fTextureVertices);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

d. 在屏幕上显示出来

[m_pContext presentRenderbuffer:GL_RENDERBUFFER];

10)程序退出时释放所有之前分配出来的资源

时间: 2024-08-01 18:08:00

在iOS上使用OpenGL ES渲染YUV的相关文章

iOS 平台开发OpenGL ES程序注意事项

本人最近从Android平台的OpenGL ES开发转到iOS平台的OpenGL ES开发,由于平台不同,所以开发中会有一些区别,再次列出需要注意的几点. 1.首先需要了解iOS主要开发框架,再次仅介绍开发OpenGL ES应用常用的几个: CoreGraphics.framework  ——包含Quartz 2D接口(Core Graphics框架参考) Foundation.framework ——包含Cocoa Foundation层的类和方法(Foundation框架参考) OpenGL

Android通过OpenGl Es渲染NV21格式视频

Android通过OpenGl Es渲染NV21格式视频 第一次写博客(主要是写给自己的),请各位大神多多指教!!! 提取NV21格式视频中的YUV分量 YUV,分为三个分量,"Y"表示明亮度(Luminance或Luma),也就是灰度值:而"U"和"V" 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色. 对于Android Camera录制视频,大多数使用的是NV21(默认格式)和NV12

基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之Shader准备(7)

Cocos2d-x底层图形绘制是使用OpenGL ES协议的.OpenGL ES是什么呢? OpenGL ES(OpenGl for Embedded System)是OpenGL三维图形API的子集,针对手机.Pad和游戏主机等嵌入式设备而设计.该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准.OpenGL ES是OpenGL三维图形API的子集,针对手机.Pad和游戏主机等嵌入式设备而设计.Cocos2d-x底层图形渲染使

基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之LayerColor(8)

在前面文章中讲述了Cocos2d-x引擎OpenGL渲染准备Shader方面,本文主要讲解使用LayerColor来讲述OpenGL的渲染过程. 1.LayerColor对象创建 添加LayerColor元素到游戏中: autolayerColor = LayerColor::create(Color4B(255, 0, 0, 255), 100, 100); layerColor->setPosition(100,100); 下面是LayerColor::create方法: LayerColo

OpenGL ES 渲染立体图形

一.理解 顶点数据存储在申请的缓冲区中,其由数据总线传递给着色器(如果是片元着色器,还须将顶点转换成片元),再由着色器最终渲染到涂层上: 二.思路 1.设置涂层: 2.创建上下文: 3.清空缓存区: 4.创建渲染缓存区和帧缓存区: 5.开始绘制: 三.核心代码 //最终渲染 - (void)renderLayer { //设置窗口背景颜色 glClearColor(0.0, 0.0, 0.0, 1.0); //清空颜色缓存 glClear(GL_COLOR_BUFFER_BIT); //设置视口

OpenGL ES教程系列(经典合集)

为了搞透播放器的开发,花了些时间收集这些资料,虽然我已经搞定opengles渲染视频的内容,但是想玩玩opengles,往深里玩,图像处理这块是个好的方向,所以opengles是值得好好学的. OpenGL ES教程原创系列 2011-12-18[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型 2011-12-17[iTyran原创]GLKit 矩阵变换:自转公转 2011-12-02[iTyran原创]Xcode创建的默认iOS OpenGL

[转] iOS OpenGL ES Guide

OpenGL ES 小结 概述 OpenGL ES (Open Graphics Library for Embedded Systems)是访问类似 iPhone 和 iPad 的现代嵌入式系统的 2D 和 3D 图形加速硬件的标准. 把程序提供的几何数据转换为屏幕上的图像的过程叫做渲染. GPU 控制的缓存是高效渲染的关键.容纳几何数据的缓存定义了要渲染的点.线段和三角形. OpenGL ES 3D 的默认坐标系.顶点和矢量为几何数据的描述提供了数学基础. 渲染的结果通常保存在帧缓存中.有两

Android OpenGL ES 离屏渲染(offscreen render)

通常在Android上使用OpenGL ES,都是希望把渲染后的结果显示在屏幕上,例如图片处理.模型显示等.这种情况下,只需要使用Android API中提供的GLSurfaceView类和Renderer类,在这两个类提供的初始化.回调函数中设置/编写相应的代码即可.不过,如果不希望把渲染结果显示在屏幕上,也就是所说的离屏渲染(offscreen render),这两个类就帮不上忙了.在此介绍一下如何在Android系统上做OpenGL ES 的离屏渲染. 1.基础知识 要想使用OpenGL

OpenGL ES 系列之开篇

OpenGL ES 系列之开篇 很久前一直想研究 OpenGL 无奈自己的惰性,现在准备开始完整的学习下 OpenGL, 一来工作需要,二来也是自我学习的成长. 我是一名 iOSer,OpenGL 是与平台无关的一种开发技术,虽然苹果在 iOS 12 推荐使用自家的 Metal, 但这个做为学习还是有必要的. 关于 OpenGL OpenGL 全称:Open Graphics Library,用来处理2D.3D视觉数据的.是一个多用途的开放标准图形库,支持2D.3D数字内容的创建.机械和建筑设计