美文网首页
初识OpenGL

初识OpenGL

作者: 希尔罗斯沃德_董 | 来源:发表于2020-07-07 10:09 被阅读0次

1、OpenGL API简介

OpenGL(Open Graphics Library):是一门跨编程语言、跨平台的编程图形程序接口,将算机的资源抽象称为⼀一个个OpenGL的对象,对这些资源的操作抽象为⼀一个个的OpenGL指令。
OpenGL ES (OpenGL for Embedded Systems):是 OpenGL 三维图形 API 的⼦子集,针对⼿手机、PDA和游戏主机等嵌⼊入式设备⽽而设计,去除了了许多不不必要和性能较低的API接⼝。
DirectX: 是由很多API组成的,DirectX并不不是⼀一个单纯的图形API。最重要的是DirectX是属于Windows上⼀一个多媒体处理理框架。并不不⽀支持Windows以外的平台,所以不不是跨平台框架. 按照性质分类,可以分为四⼤大部分,显示部分、声⾳音部分、输⼊入部分和⽹网络部分.
Metal: Apple为游戏开发者推出了了新的平台技术 Metal,该技术能够为 3D 图 像提⾼高 10 倍的渲染性能。 **Metal **是Apple为了了解决3D渲染⽽而推出的框架。

OpenGL /OpenGL ES/ Metal 在任何项⽬中解决问题的本质就是利用GPU芯片来高效渲染图形图像。

2、常见名词解释

OpenGL上下文【context】:在应⽤用程序调⽤用任何OpenGL的指令之前,需要安排⾸首先创建⼀一个OpenGL的 上下⽂文。这个上下⽂文是⼀一个⾮非常庞⼤大的状态机,保存了了OpenGL中的各种状 态,这也是OpenGL指令执⾏行行的基础。
OpenGL 状态机:OpenGL通过状态机可以记录和管理⾃己的状态(如当前所使⽤用的颜色、是否开启了了混合功能等)。
渲染(render):表示计算机从模型创建最终图像的过程,将图形/图像数据转换成2D空间图像操作叫做渲染(Rendering)。
模型(model):也称场景对象,是通过几何图元,例如点、线和三角形来构建的,而图元与模型的顶点(vertex)也存在着各种对应的关系。
像素(pixel):是指在由一个数字序列表示的图像中的一个最小单位。它是以一个单一颜色的小格存在。每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。
纹理(texture mapping):纹理可以理解为图片。在渲染图形时需要编码填充图⽚,使得场景更加逼真。而这⾥使⽤的图⽚,就是常说的纹理。但是在OpenGL,我们更加习惯叫纹理,而不是图⽚。
混合(Blending):在测试阶段之后,如果像素依然没有被剔除,那么像素的颜⾊将会和帧缓冲区中颜色附着上的颜色进行混合,混合的算法可以通过OpenGL的函数进行指定。但是OpenGL提供的混合算法是有限的,如果需要更加复杂的混合算法,⼀般可以通过像素着⾊器进行实现,当然性能会⽐原生的混合算法差一些。
变换矩阵(Transformation):例如图形想发⽣平移,缩放,旋转变换。就需要使⽤用变换矩阵。
投影矩阵(Projection):用于将3D坐标转换为二维屏幕坐标,实际线条也将在二维坐标下进⾏绘制。
GLSL(OpenGL Shading Language): OpenGL的着色语言。
渲染管线(rendering pipeline):是一系列数据处理过程,并且将应用程序的数据转换到最终渲染的图像上。首先OpenGL接收用户输入的几何数据(顶点和几何图元),并且将它输入到一系列着色器中进行处理,然后送入光栅化单元。光栅化单元负责对所有剪切区域(clipping region)内的图元生成片元数据,然后对每个生成的片元都执行一个片元着色器。大概过程如下图所示:

OpenGL 管线.png
只有顶点着色器和片元着色器是必须的。细分和几何着色器是可选的部分。

顶点数据(vertex data):图形顶点位置数据。⽽而这个数据可以直接存储在数组中或者将其缓存到GPU内存中。
顶点着色器(vertex shader):顶点着⾊器是OpenGL中⽤于计算顶点属性的程序,一般用来处理图形每个顶点变换(旋转/平移/投影等)。每个顶点数据都会执行一个顶点着色器。
细分着色器(tessellation shader):本身包含两个着色器(细分控制着色器和细分计算着色器)。用来进一步处理来自顶点着色器的数据。使得模型外观变得平顺。这一阶段是可选的。
几何着色器:允许在光栅化之前对每个几何图元做更进一步的处理,例如创建新的图元。这一步也是可选的。
图元设置\装配:将前面的顶点数据与相关的几何图元之间组织起来,准备下一步的剪切和光栅化工作。
剪切:顶点可能会在视口(可绘制窗口区域)之外,此时与顶点相关的图元会做出改动,以保证相关的像素不会视口外绘制。
光栅化(rasterizer): 把物体的数学描述以及与物体相关的颜色信息转换为屏幕上⽤于对应位置的像素及用于填充像素的颜色,这个过程称为光栅化,这是⼀个将模拟信号转化为离散信号的过程。它能够把顶点数据转换为片元的过程,具有将图转化为⼀个个栅格组成的图象的作用,特点是每个元素对应帧缓冲区中的⼀个像素。
片元:可视为一个“候选的像素”,也就是可以放在帧缓冲区的像素,但是它也可能被最终剔除,不在更新对应的像素位置。
片元着色器:计算片元的最终颜色并填充。每个像素都会执行一个片元着色器。
备注:顶点着色器决定了图元在屏幕的位置,而片元着色器使用这些信息来决定某个片元的颜色。

3、OpenGL渲染架构

屏幕快照 2020-07-09 下午8.58.38.png
3、OpenGL的三种数据传递方式

根据以上的渲染架构图可以看出OpenGL传递数据有三种方式:Attributes、Uniforms 和 Texture Data。
Attributes: Attributes可以传递顶点数据顶点数据(x,y,z,w)、投影矩阵、模型矩阵以及纹理坐标(顶点着色器无法处理纹理数据,但它会桥接给片元着色器),Attributes只能给顶点着色器传递数据;
Uniforms: 传递统一批次(变换矩阵,通道,颜色)等不经常改动的数据和纹理数据(一般传给片元着色器),Uniforms可以传给顶点着色器也可以传给片元着色器;
Texture Data:纹理数据,Texture Data可以传给顶点着色器也可以传给片元着色器;

4、OpenGL的两种投影方式

正投影:显示2D图形,远近一样大

正投影

设置接口:GLFrustum::SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax)

透视投影:显示3D图形,距离越远越小,反之越大

透视投影

设置接口:GLFrustum::SetPerspective(float fFov, float fAspect, float fNear, float fFar)
fFov:垂直⽅向上的视场⻆度
fAspect:窗⼝的宽度与高度的纵横比
fNear:近裁剪⾯距离
fFar:远裁剪⾯距离
纵横比 = 宽(w)/⾼(h)

5、各种存储着色器的使用

存储着色器的通用初始化方法

GLShaderManager::InitializeStockShaders(void);

单元着色器
使⽤用场景: 绘制默认OpenGL 坐标系(-1,1)下图形。图形所有片段都会以一种颜色填充

GLfloat vRed[] = {1.0,0.0,0.0,1.0f}; //颜色
 //传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形 
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed); 
参数1: 存储着⾊器种类-单元着⾊器 
参数2: 颜⾊

平面着色器
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)。

GLShaderManager::UseStockShader(GLT_SHADER_FLAT,CGFloat mvp[16], CGFloat vColor[4]);

参数1: 存储着⾊器种类-平⾯着⾊器
参数2: 允许变化的4*4矩阵
参数3: 颜⾊

上色着色器
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)。颜色将会平滑地插入到顶点之间,称为平滑着色。

GLShaderManager::UseStockShader(GLT_SHADER_SHADED,CGFloat mvp[16]);
参数1: 存储着⾊器种类-上⾊着⾊器 
参数2: 允许变化的4*4矩阵

默认光源着色器
使⽤场景: 在绘制图形时, 可以应用变换(模型/投影变化) 。这种着色器会使绘制的图形产生阴影和光照的效果。

GLShaderManager::UseStockShader(GLT_SHADER_DEFAULT_LIGHT,CGFloat mvMaxtix[16], CGFloat pMaxtix[16], CGFloat vColor[4]);
参数1: 存储着⾊器种类-默认光源着⾊器 
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 颜色值

点光源着色器
使⽤场景: 在绘制图形时, 可以应用变换(模型/投影变化)。这种着⾊器会使绘制的图形产生阴影和光照的效果。它与默认光源着⾊器⾮常类似,区别只是光源位置可能是特定的。

GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF,CGFloat mvMaxtix[16], CGFloat pMaxtix[16],  CGFloat vLightPos[3], CGFloat vColor[4]);
参数1: 存储着⾊器种类-点光源着⾊器 
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 点光源的位置
参数5: 颜色值

**纹理替换矩阵着⾊器 **:
使⽤场景: 在绘制图形时, 可以应用变换(模型/投影变化)。这种着色器通过给定的模型视图投影矩阵。使⽤纹理单元来进⾏颜⾊填充。其中每个像素点的颜色是从纹理中获取。

GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, CGFloat mvMaxtix[16], GLint nTextureUnit);
参数1: 存储着⾊器种类-纹理替换矩阵着⾊器 
参数2: 模型4*4矩阵
参数3: 纹理单元

纹理调整着⾊器:
使⽤用场景: 在绘制图形时, 可以应用变换(模型/投影变化)。这种着⾊器通过给定的模型视图投影矩阵。着⾊器将⼀个基本色乘以一个取⾃纹理单元nTextureUnit 的纹理。将颜色与纹理进行颜⾊混合后才填充到⽚段中。

GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, CGFloat mvMaxtix[16], CGFloat vColor[4], GLint nTextureUnit);
参数1: 存储着⾊器种类-纹理调整着⾊器
参数2: 模型4*4矩阵
参数3: 颜⾊值
参数4: 纹理单元

纹理光源着⾊器
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)。这种着⾊器通过给定的模型视图投影矩阵。着⾊器将⼀个纹理通过漫反射照明计算进行调整(相乘)。

GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF, CGFloat mvMaxtix[16], CGFloat pMaxtix[16], CGFloat vLightPos[3], CGFloat vBaseColor[4], GLint nTextureUnit);
参数1: 存储着⾊器种类-纹理光源着⾊器 
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 点光源位置
参数5: 颜⾊值(⼏何图形的基本色) 
参数6: 纹理单元

相关文章

  • 02总结--014--OpenGL ES 初识

    OpenGL ES 初识 OpenGL ES 简介 OpenGL ES (OpenGL for Embedded ...

  • OpenGL(1)入门基础

    初识OpenGL

  • OpenGL-ES初探

    初识 OpenGL ES OpenGL ES是OpenGL的子集 OpenGL ES 是针对嵌入式设备及移动终端设...

  • OpenGL初识

    OpenGL初识 图形API简介 OpenGL(Open Graphics Library):一个跨编程语言、跨平...

  • 基础知识

    OpenGL初识[https://www.jianshu.com/p/207f0a8e492f] OpenGL初探...

  • 初识OpenGL

    简书注册了好久,读了很多文章,自己也想要写一些小心得小体会。奈何人懒事多,一直没有动笔。现在就趁自己系统学习Ope...

  • openGL初识

    openGL / openGL ES openGL (open Graphics Library 开放式图形库)。...

  • 初识OpenGL

    什么是OpenGL OpenGL是一套可以对计算机图形硬件设备(GPU)进行访问的API。主要用于渲染2D/3D矢...

  • OpenGL初识

    初始OpenGL OpenGL (Open Graphics Library) 是一个跨平台编程语言、跨平台的编程...

  • 初识OpenGL

    一. 一些基本概念1.啥叫OpenGLOpenGL (Open Graphics Library)是⼀个跨编程语⾔...

网友评论

      本文标题:初识OpenGL

      本文链接:https://www.haomeiwen.com/subject/wenhqktx.html