OpenGL ES
文章平均质量分 85
OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual C++紧密接口,便于实现机械手的有关计算和图形算法。主要针对在macOS和iOS端的功能用法、API等介绍和使用,实现各种炫酷的3D渲染效果。
╰つ栺尖篴夢ゞ
本人毕业于计算机技术专业,从事iOS高级开发,专注于iOS/MacOS内核/汇编/源码/架构/算法等相关技术的开发学习,同时热爱人工智能、OpenGL/ES、云原生等技术,优快云博客专家与原力计划作者,华为云云享专家与特约博主,阿里云专家博主,荣获优快云 iOS领域优质创作者、2022年度博客之星移动领域TOP 3、2022年度博客之星TOP 16、AI创想秀邂逅“华为云ModelArts”征文大赛一等奖、优快云第一届猿创征文优质博文奖,以及多项优秀TOP博文、优快云开源挑战赛优秀奖等。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
OpenGL之macOS上的环境搭建
一、准备资源和文件CLToolsglewlibGLTools.a原创 2020-07-02 18:07:21 · 1846 阅读 · 3 评论 -
OpenGL之常见的专业名词解析
状态机可以理解为一台可以保存状态,并根据当前状态进行相应输出的机器,也可以理解为就是一种存在于理论中的机器;首先,它有记忆的能力,能够记住自己当前的状态。(电脑的存储器(内存、硬盘等),可以记住电脑自己当前的状态(当前安装在电脑中的软件、保存在电脑中的数据,其实都是二进制的值,都属于当前的状态),状态机就相当于这里的电脑,类似于这样的“存储记忆”,因而OpenGL可以记录自己的状态(比如:当前所使用的颜色、是否开启了混合功能等,这些都是要记录的));其次,它可以接收输入,根据用户输入的内容和自己的状原创 2020-07-03 00:54:53 · 561 阅读 · 1 评论 -
OpenGL之深入解析坐标系统
坐标系2D笛卡尔坐标系(由x、y决定)3D笛卡尔坐标系(由x、y、z决定)视口glViewport(GLint x,GLint y,GLsizei width,GLsizei height),对应屏幕区域的范围;投影透视投影和正投影原创 2020-07-04 00:20:51 · 2596 阅读 · 1 评论 -
OpenGL之简单渲染一个三角形
环境搭建本文是基于OpenGL的开发环境搭建完成的情况下,进行一些简单图形的渲染和显示(macOS的OpenGL环境搭建,详情可参考 :)原创 2020-07-05 14:03:37 · 1589 阅读 · 3 评论 -
OpenGL之控制渲染图形的移动
正方形的渲染正方形的绘制,类似于三角形的绘制。基于三角形的绘制,只需要将绘制三角形的部分代码修改,即可实现正方形的绘制;(三角形的绘制见我的上篇文章:OpenGL简单渲染一个三角形)定义正方形顶点到原点的距离,即正方形的边长 = blockSize * 2;// 正方形的边长GLfloat blockSize = 0.1f;修改定点数组,并设置图元的连接方式和顶点个数;// 设置正方形顶点,其中数组vVerts包含所有4个顶点的x,y,z笛卡尔坐标对 GLfloat vVert原创 2020-07-05 15:54:28 · 1728 阅读 · 1 评论 -
iOS之从OpenGL深入探究离屏渲染及性能优化
探究内容到底什么是离屏渲染?是在GPU上面还是CPU上面执行的?为什么要有离屏渲染?什么情况下会产生离屏渲染?帧缓冲区是什么?当前屏幕缓冲区和屏幕外缓冲区又是什么?切换缓冲区是什么操作?真的比较耗时吗?OpenGL屏幕渲染方式OpenGL中,GPU屏幕渲染有以下两种方式:On-Screen Rendering:意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。Off-Screen Rendering:意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲原创 2020-07-06 12:15:33 · 22707 阅读 · 1 评论 -
OpenGL之深入解析渲染架构和数据传递
OpenGL的渲染架构解析原创 2020-07-08 01:12:46 · 733 阅读 · 1 评论 -
OpenGL之矩阵堆栈绘制立体图元
渲染环境准备需要用到的工具类,已做详细的注释说明:// GLTool.h头⽂文件包含了大部分GLTool中类似C语言的独立函数#include "GLTools.h"// 矩阵的⼯具类.可以利于GLMatrixStack 加载单元矩阵/矩阵/矩阵相乘/压栈/出栈/缩放/平移/旋转#include "GLMatrixStack.h"// 矩阵工具类,表示位置.通过设置vOrigin,vForward,vUps等#include "GLFrame.h"// 矩阵⼯具类,⽤来快速设置正/透视投原创 2020-07-10 00:06:51 · 757 阅读 · 1 评论 -
OpenGL之深入解析正背面剔除、深度测试与多边形偏移
一、绘制“甜甜圈”图元的渲染显示就不再重复,现在贴出部分主要绘制代码:定义部分绘制需要用到的全局变量:GLShaderManager shaderManager; // 固定管线管理器GLFrame viewFrame; // 设置角色帧,作为相机GLFrustum viewFrustum; // 使用GLFrustum类来设置透视投影GLTriangleBatch原创 2020-07-10 13:14:24 · 574 阅读 · 1 评论 -
OpenGL之裁剪与颜色混合
裁剪在OpenGL中提⾼渲染的⼀种方式:只刷新屏幕上发生变化的部分,OpenGL 允许将要进⾏行渲染的窗⼝只去指定⼀个裁剪框;基本原理:⽤于渲染时限制绘制区域,通过此技术可以再屏幕(帧缓冲)指定一个矩形区域。启用剪裁测试之后,不在此矩形区域内的⽚元被丢弃,只有在此矩形区域内的片元才有可能进⼊帧缓冲,因此实际达到的效果就是在屏幕上开辟了一个⼩窗口,可以再其中进行指定内容的绘制;裁剪函数: // 开启裁剪测试 glEnable(GL_SCISSOR_TEST); // 关闭裁原创 2020-07-13 13:16:29 · 1040 阅读 · 1 评论 -
OpenGL之图元描边的绘制流程
立体图元的绘制与渲染,之前的文章已经完全实现了图元的“颜色填充”,图元边框的绘制也有接触,详情可参考:OpenGL之矩阵堆栈绘制立体图元。这里具体的介绍一下图元边框的绘制原理和流程:首先,如果图元没有渲染边框 ,是什么效果呢?通过效果图,我们可以看到:图元分不清轮廓,看不清图元面与面的区分,很难看出图元具体是什么样子,这主要是因为出现类似ZFighting的问题,OpenGL中没有办法通过相同颜色的图层,来区分图层关系。边框的绘制流程:① 通过颜色填充绘制图元的基本形状;② 开启多边形偏原创 2020-07-13 20:53:30 · 1623 阅读 · 1 评论 -
OpenGL之矩阵变换的原理分析与数学推导
什么是矩阵变换?这张图比较直观地展示了OpenGL矩阵变换的过程,下面详解一下其中的含义:首先OpenGL有个世界坐标系,我们渲染的物体就是在世界坐标系中,我们的模型需要放到世界坐标系中,那么当我们还没放的时候,模型就和世界坐标系没有联系,它就还处于自己的坐标系中,叫做物体坐标系(模型坐标系、局部空间、局部坐标系),也就是图中的LOCAL SPACE;当把模型放到世界坐标系中,模型就在世界坐标系里有了坐标,也就是原来在LOCAL SPACE中的那些坐标值,变成了世界坐标系中的坐标值,帮助我们完成这原创 2020-07-15 12:34:21 · 614 阅读 · 1 评论 -
OpenGL之3D数学的向量和矩阵
向量基本概念既有大小又有方向的量称之为向量,与之相对应的是标量,标量是只有大小没有方向的量;在3D笛卡尔坐标系:基本上,一个顶点就是XYZ 坐标空间上的一个位置,而在空间中给定的⼀个位置恰恰是由⼀个单独的 XYZ 定义的,而这样的 XYZ 就是向量;长度为0的向量称之为零向量,零向量与所有向量平行;模为1的向量称之为单位向量,单位向量并不是唯一的,每个向量单位化以后都是单位向量;空间向量长度(向量的模)计算公式:math3d库,有2个数据类型,能够表示一个三维或者四维向量:M3DVe原创 2020-07-16 15:05:15 · 584 阅读 · 1 评论 -
OpenGL之矩阵的基本变换和矩阵堆栈
矩阵的基本变换基本变换的解析说明视图变换视图变换是应⽤到场景中的第一种变换, 它⽤来确定场景中的有利位置,在默认情况下, 透视投影中位于原点(0,0,0),并沿着 z 轴负⽅向进行观察 (向显示器器内部”看过去”);当观察者点位于原点(0,0,0) 时,就像在透视投影中⼀样;从⼤局上考虑,在应⽤任何其他模型变换之前, 必须先应⽤视图变换。这样做是因为, 对于视觉坐标系⽽言,视图变换移动了当前的工作的坐标系; 后续的变化都会基于新调整的坐标系进⾏。模型变换模型变换:用于操纵模型与其中某特原创 2020-07-16 22:00:46 · 478 阅读 · 1 评论 -
OpenGL之利用矩阵的“平移”“旋转”“综合变换”等实现矩形的移动
实现代码#include <stdio.h>// GLTool.h头⽂文件包含了大部分GLTool中类似C语言的独立函数#include "GLTools.h"// 矩阵的⼯具类.可以利于GLMatrixStack 加载单元矩阵/矩阵/矩阵相乘/压栈/出栈/缩放/平移/旋转#include "GLMatrixStack.h"// 矩阵工具类,表示位置.通过设置vOrigin,vForward,vUps等#include "GLFrame.h"// 矩阵⼯具类,⽤来快速设置正/透原创 2020-07-17 00:28:56 · 1739 阅读 · 1 评论 -
OpenGL之利用模型视图矩阵和投影矩阵让球体自动旋转
示例代码#include "GLTools.h" #include "GLMatrixStack.h"#include "GLFrame.h"#include "GLFrustum.h"#include "GLGeometryTransform.h"#include "GLBatch.h"#include "StopWatch.h"#include <math.h>#ifdef __APPLE__#include <glut/glut.h>#else#def原创 2020-07-17 00:39:48 · 623 阅读 · 1 评论 -
OpenGL之渲染大小球自转和公转的效果
效果展示整体思路与步骤拆分渲染绘制绿色方格地板部分渲染绘制中心位置的红色大球,并实现其自转;渲染绘制随机位置的50个静态小球和一个围绕红色大球公转的动态蓝色球;渲染实现动态蓝色球绕红色大球的公转;实现移动观察者(camera),仍能观察红色大球自转及动态蓝色球围绕红球公转的效果;重点函数glutWireSphere(r,s1,s2) 该函数用于渲染一个球体(由线条构成球体)。球体球心位于原点。在OpenGL中默认的原点就是窗口客户区的中心(r 是球的半径,s1是以Z轴上线段为直径分布的原创 2020-07-18 14:33:32 · 1979 阅读 · 1 评论 -
OpenGL之深入解析纹理的渲染使用
通常说的纹理,指的是一张二维的图片,把它像贴纸一样贴在图元上面,让图元看起来像贴纸所要表现的效果那样;艺术家和程序员更喜欢使用纹理(Texture)。纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;可以想象成纹理是一张绘有砖块的纸,无缝折叠贴合到3D的房子上,这样房子看起来就像有砖墙外表了。因为可以在一张图片上插入非常多的细节,这样就可以让物体非常精细而不用指定额外的顶点。除了图像以外,纹理也可以被用来储存大量的数据,这些数据可以发送到着...原创 2020-07-18 20:48:25 · 933 阅读 · 1 评论 -
OpenGL之“隧道”的多层纹理渲染与各向异性过滤渲染效果的对比
效果展示绘制流程定义变量GLShaderManager shaderManager; // 着色器管理器GLMatrixStack modelViewMatrix; // 模型视图矩阵GLMatrixStack projectionMatrix; // 投影矩阵GLFrustum viewFrustum; // 视景体GLGeometryTransform transformPipeline原创 2020-07-21 15:52:48 · 660 阅读 · 1 评论 -
OpenGL之仿“天体”运动渲染球体之间的旋转效果
效果展示球体的绘制原创 2020-07-24 01:58:16 · 1065 阅读 · 1 评论 -
OpenGL之深入解析YUV图像的基本处理
YUV 色彩编码模型,其设计初衷为了解决彩色电视机与黑白电视的兼容问题,利用了人类眼睛的生理特性(对亮度敏感,对色度不敏感),允许降低色度的带宽,降低了传输带宽。在计算机系统中应用尤为广泛,利用 YUV 色彩编码模型可以降低图片数据的内存占用,提高数据处理效率。另外,YUV 编码模型的图像数据一般不能直接用于显示,还需要将其转换为 RGB(RGBA) 编码模型,才能够正常显示图像。.......................................原创 2022-06-18 20:42:56 · 946 阅读 · 0 评论 -
OpenGL之深入解析屏幕成像和渲染原理
PU 和 GPU 因为设计之初需求就不一样,所以它们的组成不同,在计算机中的分工也不同。可以看到,GPU 有更多的 ALU,而 CPU 有 Control 单元和 Cache 单元,普通的业务代码因为逻辑复杂,数据类型复杂,跳转复杂,依赖性高等,就更适合 CPU 来做。而 GPU 不擅长处理这些复杂的逻辑,它更擅长处理单一的运算,大量的算术逻辑单元可以保证做到真正的高并发,所以大量的计算任务是适合它的工作,就比如 GLSL 代码。原创 2023-04-10 11:53:55 · 825 阅读 · 1 评论 -
OpenGL ES之基本简介和渲染流程
简介OpenGL ES (OpenGL for Embedded Systems) 是以⼿持和嵌入式为目标的高级3D图形应用程序编程接口(API)。OpenGL ES是目前智能手机中占据统治地位的图形API.支持的平台: iOS, Andriod , BlackBerry ,bada ,Linux ,Windows.OpenGL ES 开放式图形库(OpenGL的)用于可视化的二维和三维数据。它是一个多功能开放标准图形库,⽀持2D和3D数字内容创建,机械和建筑设计,虚拟原型设计,飞⾏模拟,视频游戏等原创 2020-07-25 14:38:22 · 719 阅读 · 1 评论 -
OpenGL ES之GLSL常用内建函数
dot 点乘 返回两个单位向量之间夹角的cos值cross 叉乘texture2D 用于纹理采样normalize :对⼀个向量量规格化clamp 将⼀个向量固定在一个最小值和最大值之间pow()幂函数exp() log() 指数函数 对数函数sqrt() 平方根max() min()最大值 最小值ceil() floor(),取大于实参的最小整数,取小于实参的最大整数sin() cos() tan() 三角函数asin() acos()..原创 2020-08-24 21:58:43 · 2027 阅读 · 1 评论 -
OpenGL ES之GLKit的使用功能和API说明
GLKit的简介一、GLKit框架说明GLKit 框架的设计目标是为了简化基于OpenGL/OpenGL ES的应用开发。它的出现加快OpenGL或OpenGL ES应用程序开发。 使用数学库,背景纹理加载,预先创建的着色器效果,以及标准视图和视图控制器来实现渲染循环。GLKit 框架提供了功能和类,可以减少创建新的基于着色器的应用程序所需的工作量,或支持依赖早期版本的OpenGL或OpenGL ES提供的固定函数顶点或片段处理的现有应用程序。GLKView提供绘制场所(view):GLKView原创 2020-07-25 15:58:21 · 1415 阅读 · 1 评论 -
OpenGL ES之着色语言GLSL的使用说明及API
EGL(Embedded Graphics Library)一、概念说明OpenGL ES 命令需要渲染上下文和绘制表面才能完成图形图像的绘制。渲染上下文: 存储相关OpenGL ES 状态。绘制表面: 是⽤于绘制图元的表面,它指定渲染所需要的缓存区类型,例如颜⾊缓存区、深度缓冲区和模板缓存区。OpenGL ES API 并没有提供如何创建渲染上下⽂或者上下文如何连接到原⽣窗⼝系统。 EGL 是Khronos 渲染API(如OpenGL ES) 和原生窗⼝系统之间的接⼝。 唯⼀支持OpenGL原创 2020-07-29 15:50:18 · 812 阅读 · 1 评论 -
OpenGL ES之VBO、EBO与VAO的说明和使用
VBO(Vertex Buffer Object)是指顶点缓冲区对象,而 EBO(Element Buffer Object)是指图元索引缓冲区对象,VAO 和 EBO 实际上是对同一类 Buffer 按照用途的不同称呼。VAO(Vertex Array Object)是指顶点数组对象,主要用于管理 VBO 或 EBO ,减少 glBindBuffer 、glEnableVertexAttribArray、 glVertexAttribPointer 这些调用操作,高效地实现在顶点数组配置之间切换。...原创 2022-06-20 14:46:23 · 1013 阅读 · 0 评论 -
OpenGL ES之离屏渲染的帧缓冲区对象FBO的说明和使用
FBO(Frame Buffer Object)即帧缓冲区对象,实际上是一个可添加缓冲区的容器,可以为其添加纹理或渲染缓冲区对象(RBO)。FBO 本身不能用于渲染,只有添加了纹理或者渲染缓冲区之后才能作为渲染目标,它仅且提供了 3 个附着(Attachment),分别是颜色附着、深度附着和模板附着。...原创 2022-06-20 15:09:08 · 1606 阅读 · 0 评论 -
OpenGL ES之使用EGL渲染的流程
EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用:与设备的原生窗口系统通信、查询绘图表面的可用类型和配置、创建绘图表面、在 OpenGL ES 和其他图形渲染 API 之间同步渲染、管理纹理贴图等渲染资源。...原创 2022-06-20 18:36:10 · 1219 阅读 · 0 评论 -
OpenGL ES之变换反馈Transform Feedback的使用流程
Transform Feedback(变换反馈)是在 OpenGL ES 3.0 渲染管线中,顶点处理阶段结束之后,图元装配和光栅化之前的一个步骤。Transform Feedback 可以重新捕获即将装配为图元(点,线段,三角形)的顶点,然后可以将它们的部分或者全部属性传递到缓存对象。Transform Feedback 的主要作用是可以将顶点着色器的处理结果输出,并且可以有多个输出,这样可以将大量的向量或矩阵运算交给 GPU 并行处理,这是 OpenGL ES 3.0 的新特性。...原创 2022-06-20 19:09:06 · 1025 阅读 · 0 评论 -
OpenGL ES之基础光照模型的实现
OpenGL ES 目前还无法模拟现实世界的复杂光照效果,为了在效果要求和实现难度之间做一个平衡,往往采用一些简化的模型来模拟光照效果。冯氏光照模型(Phong Lighting Model)便是其中常用的一个光照模型,它由三种元素光组成,分别是环境光(Ambient Lighting)、散射光(Diffuse Lighting)及镜面光(Specular Lighting)。......原创 2022-06-20 20:26:14 · 753 阅读 · 0 评论 -
OpenGL ES之“深度测试”与“模板测试”的使用流程
OpenGL 深度测试是指在片段着色器执行之后,利用深度缓冲所保存的深度值决定当前片段是否被丢弃的过程。深度缓冲区通常和颜色缓冲区有着相同的宽度和高度,一般由窗口系统自动创建并将其深度值存储为 16、 24 或 32 位浮点数。模板测试与深度测试类似,主要作用是利用模板缓冲区(Stencil Buffer)所保存的模板值决定当前片段是否被丢弃,且发生于深度测试之前。...原创 2022-06-21 02:00:00 · 877 阅读 · 0 评论 -
OpenGL ES之混合的概念和使用
OpenGL ES 混合本质上是将 2 个片元的颜色进行调和,产生一个新的颜色。OpenGL ES 混合发生在片元通过各项测试之后,准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值,不再是新(源)片元直接覆盖缓冲区中的(目标)片元。............原创 2022-06-22 18:59:15 · 567 阅读 · 0 评论 -
OpenGL ES之实例化渲染(Instancing)
OpenGL ES 实例化(Instancing)是一种只调用一次渲染函数就能绘制出很多物体的技术,可以实现将数据一次性发送给 GPU ,告诉 OpenGL ES 使用一个绘制函数,将这些数据绘制成多个物体。原创 2022-06-22 19:25:56 · 940 阅读 · 0 评论 -
OpenGL ES之3D模型加载和渲染
OpenGL ES 3D 模型本质上是由一系列三角形在 3D 空间(OpenGL 坐标系)中构建而成,另外还包含了用于描述三角形表面的纹理、光照、材质等信息。构建一些规则的 3D 物体,如立方体、球体、椎体等,我们自己可以手动轻易实现,但是在实际开发中往往会用到复杂的 3D 物体,如人体、汽车等,这就需要设计师和专业的建模工具软件(像 3DS Max、Maya )来生成。......原创 2022-06-23 19:19:20 · 1835 阅读 · 0 评论 -
OpenGL ES之深入解析PBO、UBO与TBO的功能和使用
OpenGL PBO(Pixel Buffer Object),被称为像素缓冲区对象,主要被用于异步像素传输操作。PBO 仅用于执行像素传输,不连接到纹理,且与 FBO (帧缓冲区对象)无关。UBO,就是一个装载 uniform 变量数据的缓冲区对象,本质上跟 OpenGL ES 的其他缓冲区对象没有区别,创建方式也大致一致,都是显存上一块用于储存特定数据的区域。TBO 即“纹理缓冲区对象”,是 OpenGL ES 3.2 引入的概念,因此在使用时首先要检查 OpenGL ES 的版本。...原创 2022-06-23 20:26:06 · 1900 阅读 · 0 评论 -
OpenGL ES之如何传输一个超大数组给着色器程序
在 OpenGL ES 图形图像处理中,会经常遇到一种情况:如何将一个超大的数组传给着色器程序?目前常用的有三种方式:使用将数组加载到 2D 纹理的方式,然后使用 texelFetch 取数据;使用 uniform 缓冲区对象,即 UBO;使用纹理缓冲区对象,即 TBO。。...原创 2022-06-27 13:58:06 · 757 阅读 · 0 评论 -
OpenGL ES之深入解析RGB图像与YUV格式之间的相互转换
RGB 转 YUV 的大致思路:先将 RGBA 按照公式转换为 YUV 如(YUYV),然后将 YUYV 按照 RGBA 进行排布,最后使用 glReadPixels 读取 YUYV 数据,由于 YUYV 数据量为 RGBA 的一半,需要注意输出 buffer 的大小,以及 viewport 的宽度(宽度为原来的一半)。原创 2022-06-28 19:41:30 · 2518 阅读 · 0 评论 -
OpenGL ES之纹理翻转的解决策略
原因分析在前面的文章:OpenGL ES之Swift使用GLSL语言渲染图片的显示和OpenGL ES之GLSL渲染图片显示的整体流程中,我们都对图片纹理做了翻转的处理,不做处理,最后看到的图片显示将是一张倒着的图片。为什么会出现这种情况呢?这是因为OpenGL要求y轴0.0坐标是在图片的底部的(屏幕左上角),但是图片的y轴0.0坐标通常在顶部(屏幕左下角):我们可以改变顶点数据的纹理坐标,翻转y值(用1减去y坐标),也可以编辑顶点着色器来自动翻转y坐标,替换TexCoord的值为TexCoord =原创 2020-07-31 13:26:16 · 789 阅读 · 1 评论 -
OpenGL ES之3D渲染旋转的贴图立方体
效果展示绘制流程一、OpenGL ES 初始化① 初始化上下文并设置当前上下文 /* 初始化上下文并设置当前上下文 * EAGLContext 是苹果iOS平台下实现OpenGLES 渲染层 * kEAGLRenderingAPIOpenGLES1 = 1, 固定管线 * kEAGLRenderingAPIOpenGLES2 = 2, * kEAGLRenderingAPIOpenGLES3 = 3, */ context = [[E原创 2020-07-27 16:51:03 · 576 阅读 · 1 评论
分享