什么是 OpenGLES OpenGLES 全称 OpenGL for Embedded Systems ,是三维图形应用程序接口 OpenGL 的子集,本质上是一个跨编程语言、跨平台的编程接口规范,主要应用于嵌入式设备...OpenGLES 3.0 的特点 OpenGLES 3.0 实际上是 OpenGLES 2.0 的扩展版本,向下兼容 OpenGLES 2.0 ,但不兼容 OpenGLES 1.0 。...OpenGLES 3.0 主要新特性 纹理 sRGB 纹理和帧缓冲区——允许应用程序执行伽马校正渲染。 2D 纹理数组——保存一组 2D 纹理的纹理目标。 3D 纹理。...为存储/绑定大的统一变量块提供高效的方法。统 VAO 顶点数组对象。提供绑定和在顶点数组状态之间切换的高效方法。 采样器对象。将采样器状态(纹理循环模式和过滤)与纹理对象分离。 同步对象。...为应用程序提供检查一组操作是否在GPU上完成执行的机制。 像素缓冲对象。使应用程序能够执行对像素操作和纹理传输操作的异步数据传输。 缓冲区对象间拷贝。
概要 帧缓存:接收渲染结果的缓冲区叫做帧缓存。 在OpenGL的渲染管道中,几何数据和纹理通过一系列变换和测试后,变成渲染到屏幕上的二维像素。渲染的目标管道就是帧缓存区。...把纹理对象关联到帧缓存 1、新建纹理 2、设置纹理格式 3、分配纹理内存 4、新建帧缓存 5、切换帧缓存为纹理对象 GLuint colorTexture; // 1 glGenTextures...观察简化版,下图正方形白色区域为渲染后的纹理。 ? Paste_Image.png 原图如下。被渲染到一个纹理后,再被显示到屏幕上。 ?...CAEAGLLyaer是CoreAnimation提供的标准层类之一,与OpenGL ES的帧缓存共享它的像素颜色仓库。...学习OpenGL ES对了解iOS的性能优化很有帮助。 现在再看上面那个图,会有不一样的认知。 参考帧缓存 这里有源码
本文介绍的OpenGL版本是基于OpenGLES 3.0的。这也是目前覆盖率最高的OpenGL版本,被广泛运用在各种终端设备上。...如果图元有纹理,就必须用纹理来产生图元的二维渲染图象上每个像素的颜色。对于图元在二维屏幕上图象的每个像素来说,都必须从纹理中获得一个颜色值。...顶点着色器输入变量在每个像素运算中则一般是不同的,它的值由组成图元的顶点的顶点着色器运算输出的值,根据像素位置进行插值的结果而决定。采样器则是用于从设定好的纹理中,获取纹理的像素颜色的。...一般默认的程序是将离屏幕较近的像素保留,而将离屏幕较远的像素丢弃。如果像素最终被渲染到画布上,根据设定好的OpenGL深度覆写状态,可能会更新帧缓冲区上深度附着的值,方便进行下一次的比较。...受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。
纹理 一个用来保存图像颜色的OpenGL ES缓存。 渲染过程中的取样可能会导致纹理被拉伸、压缩、翻转等。 视口坐标 帧缓存中的像素位置叫做视口坐标。...每个颜色像素叫做片元(fragment)。 纹理坐标系 ?...glTexImage2D 第一个参数是GL_TEXTURE_2D 第二个参数用于指定MIP贴图的初始细节级别,如果没有使用MIP必须要是0 第三个参数是指定纹理缓存每个纹素需要保存的信息数量,对于iOS...深度测试 每次渲染一个片元,片元的深度(片元与视点之间的距离)被计算出来并与深度缓存中为片元位置保存的值进行对比:选择深度值更小(更接近视点)的片元来,替换在像素颜色渲染缓存中对应位置的颜色和深度缓存的对应深度值...深度缓存为GPU提供了一个存放计算出来深度值的缓存,并且用来控制像素颜色渲染缓存中片元的置换。 GLKit支持16位和24位来保存深度值的深度渲染缓存。
前文提到,YUV 图不能直接用于显示,需要转换为 RGB 格式,而 YUV 转 RGB 是一个逐像素处理的耗时操作,在 CPU 端进行转换效率过低,这时正好可以利用 GPU 强大的并行处理能力来实现 YUV...YUV 与 RGB 之间的转换公式 YUV 与 RGB 之间的转换矩阵 需要注意的是 OpenGLES 的内置矩阵实际上是一列一列地构建的,比如 YUV 和 RGB 的转换矩阵的构建是: mat3 convertMat...OpenGLES 常用纹理的格式类型。 OpenGLES 常用纹理的格式类型 GL_LUMINANCE 纹理在着色器中采样的纹理像素格式是(L,L,L,1),L 表示亮度。...GL_LUMINANCE_ALPHA 纹理在着色器中采样的纹理像素格式是(L,L,L,A),A 表示透明度。...2 个 Plane 数据到纹理,ppPlane[0] 表示 Y Plane 的指针,ppPlane[1] 表示 UV Plane 的指针,注意 2 个纹理的格式和宽高。
渲染API的版本,在这里我们使用OpenGLES 3.0,由于3.0兼容2.0并且功能更强,为何不用更好的呢 //注:在iOS上,可以支持opengles3.0的最低环境是iphone5s ios7.0...frameBuffer:framebuffer对象(通常称为FBO)是颜色、深度和模板缓冲区连接点的集合;描述附加到FBO的颜色、深度和模板缓冲区的大小和格式等属性的状态;以及附加到FBO的纹理和renderbuffer...片元着色器的功能如下: 1.计算颜色 2.获取纹理值 3.往像素点中填充颜色值(纹理值/颜色值) 如下是一个自定义的Fragment.glsl: precision mediump float...在光栅化阶段,基本图元被转换为二维的片元(fragment),fragment 表示可以被渲染到屏幕上的像素,它包含位置,颜色,纹理坐标等信息,这些值是由图元的顶点信息进行插值计算得到的。...7).Framebuffer:这是流水线的最后一个阶段,Framebuffer 中存储这可以用于渲染到屏幕或纹理中的像素值。
在开发过程中,往往为了追求更好的效果而使用了更加高清的素材,使得本就内存吃紧的手机面对更加严峻的挑战,尤其是对iOS开发者而言。 为了解决这个问题,我们使用了纹理压缩技术。...这些文件格式当被读入后,还是需要经过CPU解压成bitmap,再传送到GPU端进行使用。 纹理格式是能被GPU所识别的像素格式,能被快速寻址并采样。...Alpha 压缩率 适用 ETC1 N 6:1 OpenGLES 2.0 ETC2 Y 6:1 OpenGLES3.0 这个系列,可以说是适用机型最广的格式。...,PVRTC格式与基于块的压缩格式,比如S3TC、ETC的不同之处是,它使用2张双线性放大的低分辨率图,根据精度和每个像素的权重,融合到一起来呈现纹理,并且2-bpp和4-bpp都支持ARGB数据。...就像MP4文件是H264的视频的容器一样。 我们选择了使用KTX的格式。 KTX是一个为OpenGL和OpenGLES程序设计的纹理存储格式。它可以简单的辨别里面所存储的纹理格式和其他相关信息。
前文提到,YUV 图不能直接用于显示,需要转换为 RGB 格式,而 YUV 转 RGB 是一个逐像素处理的耗时操作,在 CPU 端进行转换效率过低,这时正好可以利用 GPU 强大的并行处理能力来实现 YUV...YUV 与 RGB 之间的转换矩阵 需要注意的是 OpenGLES 的内置矩阵实际上是一列一列地构建的,比如 YUV 和 RGB 的转换矩阵的构建是: mat3 convertMat = mat3(1.0...OpenGLES 常用纹理的格式类型。 ? OpenGLES 常用纹理的格式类型 GL_LUMINANCE 纹理在着色器中采样的纹理像素格式是(L,L,L,1),L 表示亮度。...GL_LUMINANCE 纹理在着色器中采样的纹理像素格式是(L,L,L,A),A 表示透明度。...2 个 Plane 数据到纹理,ppPlane[0] 表示 Y Plane 的指针,ppPlane[1] 表示 UV Plane 的指针,注意 2 个纹理的格式和宽高。
OpenGLES 相机 LUT 滤镜 ? 左侧为 LUT 滤镜效果,右侧为原图 什么是 LUT ?...LUT(R, G, B) = (R1, G1, B1) LUT 滤镜是一种比较经典的滤镜,本质上属于独立像素点替换,即根据 OpenGL 采样器对纹理进行采样得到的像素点,再基于像素点的(R,G,B)分量查表...OpenGLES 实现 LUT 滤镜的 GLSL 脚本。...RGB 组合的坐标,然后归一化,转化为纹理坐标。...texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); //取目标映射对应的像素值
OpenGL ES准备 回顾下我们之前的OpenGL ES教程,图像在OpenGL ES中的表示是纹理,会在片元着色器里面进行像素级别的处理。...纹理格式 默认的纹理格式defaultTextureOptions 缓存创建 generateTexture会创建对应的纹理缓存 generateFramebuffer会创建对应的帧缓存 注意:...CVOpenGLESTextureCache 缓存和管理CVOpenGLESTextureRef纹理,这些纹理缓存提供了一个直接读写多种颜色格式缓存的方式。...GPUImageFramebuffer就是用来管理纹理缓存的格式与读写帧缓存的buffer。 这里有个GPUImage的简单工程,可以看到GPUImage的源代码。 ?...欢迎私信探讨,工作上的焦虑与迷茫。
好,进入正题,以下讲解以iOS为主,有别的端的同学可能友好性不够。 第一,我们来讲下写一个openGLES代码的基本流程。 ? image.png ?...image.png 在iOS里,渲染最直接的表现形式是UIView,像layer,CGContext等也得基于它,openGLES同样,大家不用把它想复杂,跟咱们正常的代码习惯差不多。...再来看看片元着色器: 片元着色器就是把顶点着色器的数据处理成实际屏幕坐标上的像素颜色 片元着色器的功能如下: 1.计算颜色 2.获取纹理值 3.往像素点中填充颜色值(纹理值/颜色值) 此图是一个自定义的...在光栅化阶段,基本图元被转换为二维的片元(fragment),fragment 表示可以被渲染到屏幕上的像素,它包含位置,颜色,纹理坐标等信息,这些值是由图元的顶点信息进行插值计算得到的。...7).Framebuffer:这是流水线的最后一个阶段,Framebuffer 中存储这可以用于渲染到屏幕或纹理中的像素值。
在OpenGLES2.0之后,引用也GLSL(OpenGL Shader Languge),它类似于C语言的语法。...片元着色器,每个片元运行一次,它用于确定每个片元的点、线、三角形的最终颜色。片元是一个单一颜色的小矩形区域,类似于计算机屏幕上的像素。...vertexBuffer: 数组 着色器的数据类型 着色器分为 标量,向量,距阵,采样器,结构体,数组几种类型。 标量:布尔型(bool)、整形(int)和浮点型(float)等。...mat4 4x4浮点数矩阵 采样: 一般情况下,一个采样器变量代表一幅或一套纹理贴图 采样器 说明 sampler2D 用于访问二维纹理 smapler3D 用于访问三维纹理 samplerCube...用于访问立方贴图纹理 变量限定符 着色器一般包括下在几种变理限定符: 限定符 说明 attribute 一般用于每个顶点都各不相同的量,如顶点位置、颜色等。
学习是一件开心的额事情 ? 手机截图 ? 动画演示.gif 本节学习目标 使用OpenGLES + 着色器语言打造多屏显示视频框架。...---- 实现步骤 1.使用AVPlayer 获取视频每一帧的YUV 像素数据 2.通过CoreVideo 框架中的几个方法,将Y分量和UV 分量进行分离 3.创建着色器,对Y分量和UV 分量进行采样...部分核心讲解 提醒各位,代码太多不能够全部讲解,我只讲关于OpenGLES 和着色器的部分,视频像素获取的代码,请自行搞定! 开发吧!..._videoTextureCache) { NSLog(@"No video texture cache"); return; } // 下面这个是判断视频数据格式的,我在转换的时候,...他们可能还有相同的变量.下面是我封装的方法 [self.shaderManager useProgram]; 着色器视口的设置,我们一般设置视图大小的时候,都是按照物理尺寸来的,但是视口设置是按照像素来计算的
渲染API的版本,在这里我们使用OpenGLES 3.0,由于3.0兼容2.0并且功能更强,为何不用更好的呢 EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES3...(ourTexture, TexCoordOut); //这句代码表示以纹理坐标TexCoordOut来采样ourTexture当做像素的颜色 4).使用纹理 根据我们glsl脚本,我们在项目中需要新定义两个新变量...GLuint _ourTextureSlot; //纹理对象槽位 } 然后我们在设置着色器程序- (void)setupProgram()方法里获取槽位值: - (void)setupProgram.../zh/latest/01%20Getting%20started/06%20Textures/ 这里也稍稍提一下多级渐远纹理,上面链接中对多级渐远纹理的解释很详细,我们在iOS端使用的时候最简单的只需要调用...正确结果.png 所有教程代码在此 : https://github.com/qingmomo/iOS-OpenGLES-
的转换,然后渲染到屏幕上。...0.0) * yuv; outColor = vec4(rgb, 1); } y_texture 和 uv_texture 分别是 NV21 Y Plane 和 UV Plane 纹理的采样器...YUV 格式图像 UV 分量的默认值分别是 127 ,Y 分量默认值是 0 ,8 个 bit 位的取值范围是 0 ~ 255,由于在 shader 中纹理采样值需要进行归一化,所以 UV 分量的采样值需要分别减去...需要注意的是 OpenGL ES 实现 YUV 渲染需要用到 GL_LUMINANCE 和 GL_LUMINANCE_ALPHA 格式的纹理,其中 GL_LUMINANCE 纹理用来加载 NV21 Y...8 个字节表示的 2 个 RGBA 像素就转换为 4 个字节表示的 2 个 YUYV 像素。
的转换,然后渲染到屏幕上。...outColor = vec4(rgb, 1); } y_texture 和 uv_texture 分别是 NV21 Y Plane 和 UV Plane 纹理的采样器...YUV 格式图像 UV 分量的默认值分别是 127 ,Y 分量默认值是 0 ,8 个 bit 位的取值范围是 0 ~ 255,由于在 shader 中纹理采样值需要进行归一化,所以 UV 分量的采样值需要分别减去...需要注意的是 OpenGL ES 实现 YUV 渲染需要用到 GL_LUMINANCE 和 GL_LUMINANCE_ALPHA 格式的纹理。...8 个字节表示的 2 个 RGBA 像素就转换为 4 个字节表示的 2 个 YUYV 像素。
那么在 OpenGLES 中,纹理实际上是一个可以被采样的复杂数据集合,是 GPU 的图像数据结构,纹理分为 2D 纹理、 立方图纹理和 3D 纹理。...2D 纹理是 OpenGLES 中最常用和最常见的纹理形式,是一个图像数据的二维数组。纹理中的一个单独数据元素称为纹素或纹理像素。 立方图纹理是一个由 6 个单独的 2D 纹理面组成的纹理。...立方图纹理像素的读取通过使用一个三维坐标(s,t,r)作为纹理坐标。 3D 纹理可以看作 2D 纹理作为切面的一个数组,类似于立方图纹理,使用三维坐标对其进行访问。 什么是纹理映射?...在 OpenGLES 中,纹理映射就是通过为图元的顶点坐标指定恰当的纹理坐标,通过纹理坐标在纹理图中选定特定的纹理区域,最后通过纹理坐标与顶点的映射关系,将选定的纹理区域映射到指定图元上。...,v_texCoord 为顶点着色器传进来的纹理坐标 // 根据纹理坐标对纹理进行采样,输出采样的 rgba 值(4维向量)
有三个通道传递数据给着色器式:Attribute(参数属性)、Uniform(统一值)、Texture Data(采样器) Texture:用于传递纹理数据,可以将纹理数据传递给片元着色器,也可以传递给顶点着色器...片元着色器的主要包括以下业务: 计算颜色 获取纹理值,将纹理坐标与图形坐标进行一一对应 往像素点中填充纹理值/颜色值 1.2.3 渲染管线流程 如图所示是苹果官方文档中描述的OpenGL ES渲染流程...Clipping: 超出视景体的部分不在屏幕上显示,要进行裁剪 2、片元着色器接收到数据后,进行颜色计算和纹理获取,并进行纹理和颜色的填充 3、逐片段处理,这里部分包括像素归属测试、裁剪测试、深度测试...裁剪测试:确定一个像素(x, y)是否在矩形区域内,如果不在则被丢弃,不予显示 深度测试:对深度值进行比较,确定显示层级 混合:将新生成的片段颜色和保存在帧缓冲区的位置的颜色组合起来,例如两个view有重叠...GLKViewController:管理OpenGL ES呈现循环的视图控制器。 GLKTextureLoader:简化从各种图像文件格式加载OpenGL或OpenGL ES纹理数据的实用程序类。
插值处理 像素处理是针对每一个要渲染的像素进行处理,返回值通常是4个浮点数,表示RGBA的颜色。...纹理 Metal要求所有的纹理都要符合MTLPixelFormat上面的某一种格式,每个格式都代表对图像数据的不同描述方式。...MTLTextureDescriptor 用来设置纹理属性,例如纹理大小和像素格式。...像素函数的返回值是单个像素的输出,包括一个或是多个渲染结果颜色值,一个深度值,还有一个sample遮罩,对应的输出描述符是[[color(m)]] floatn、[[depth(depth_qualifier...} } 数据结构 Metal中常用的数据结构有向量、矩阵、原子数据类型、缓存、纹理、采样器、数组、用户自定义结构体。
领取专属 10元无门槛券
手把手带您无忧上云