一.OpenGL简介

OpenGL是一套相对底层的图形图像开发规范,各个厂商在GPU驱动层以上实现一套相关的API。OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现,将由OpenGL库的开发者自行决定。

在iOS中实现的一套OpenGL框架GLKit,这套框架封装了OpenGL的实现,让开发者更易于入手操作。GLKit框架提供的功能和类可以减少创建基于着色器的新应用程序所需的工作量,或者移植依赖于早期版本的OpenGL ES或OpenGL提供的固定功能顶点或片段处理的现有应用程序。

GLKit在四个关键领域提供功能:

  • 纹理加载允许您的应用程序轻松加载来自各种来源的纹理。只需几行代码即可在背景中异步加载纹理。有关更多信息,请参阅GLKTextureLoader
  • 数学库提供常用的矢量,四元数和矩阵运算。这些实现经过优化以提供出色的性能。
  • 效果提供了常见着色器效果的标准实现。您可以配置效果和关联的顶点数据,该效果会创建并加载适当的着色器。 GLKit包含三个效果:GLKBaseEffect类实现了OpenGL ES 1.1着色和照明模型的关键子集,GLKReflectionMapEffect类扩展了基本效果以包含反射映射支持,而GLKSkyboxEffect类提供了天空盒效果的实现。
  • 视图和视图控制器提供了OpenGL ES视图和相应视图控制器的标准实现。这减少了创建使用OpenGL ES的iOS应用程序所需的代码量。有关更多信息,请参阅GLKViewGLKViewController

在iOS上,GLKit需要OpenGL ES 2.0上下文。在macOS中,GLKit需要支持OpenGL 3.2 Core Profile的OpenGL上下文。

OpenGL相关基本概念

核心模式与立即渲染模式:早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少能控制OpenGL如何进行计算的自由。立即渲染模式确实容易使用和理解,但是效率太低。因此从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发,这个分支的规范完全移除了旧的特性,两者是不兼容的。(OpenGL2.0和OpenGL3.2两种开发规范)

扩展:OpenGL的一大特性就是对扩展(Extension)的支持,当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。如果一个程序在支持这个扩展的显卡上运行,开发者可以使用这个扩展提供的一些更先进更有效的图形功能。通过这种方式,开发者不必等待一个新的OpenGL规范面世,就可以使用这些新的渲染特性了,只需要简单地检查一下显卡是否支持此扩展。

状态机(Contex):OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后我们使用当前OpenGL上下文来渲染。

假设当我们想告诉OpenGL去画线段而不是三角形的时候,我们通过改变一些上下文变量来改变OpenGL状态,从而告诉OpenGL如何去绘图。一旦我们改变了OpenGL的状态为绘制线段,下一个绘制命令就会画出线段而不是三角形。

当使用OpenGL的时候,我们会遇到一些状态设置函数(State-changing Function),这类函数将会改变上下文。以及状态使用函数(State-using Function),这类函数会根据当前OpenGL的状态执行一些操作。只要你记住OpenGL本质上是个大状态机,就能更容易理解它的大部分特性。

图形渲染管线:在OpenGL中将图形图像渲染的完整过程称作图形渲染管线(Graphics Pipeline),实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程。它具体实现两部分功能:第一是将三维数据(顶点数据)转为二维数据,第二是将这些数据进行着色渲染。

2D坐标和像素也是不同的,2D坐标精确表示一个点在2D空间中的位置,而2D像素是这个点的近似值,2D像素受到你的屏幕/窗口分辨率的限制。

可以看到,图形渲染管线非常复杂,它包含很多可配置的部分。然而,对于大多数场合,我们只需要配置顶点和片段着色器就行了。几何着色器是可选的,通常使用它默认的着色器就行了。

在现代OpenGL中,我们必须定义至少一个顶点着色器和一个片段着色器(因为GPU中没有默认的顶点/片段着色器)。

着色器:在整个渲染管线中有几个阶段,每个阶段将会把前一个阶段的输出作为输入。而每个阶段都由专门的着色器(一段程序)来实现,这些着色器是直接运行在GPU上并且有专一性和并发行。

有些着色器允许开发者自己配置,这就允许我们用自己写的着色器来替换默认的。这样我们就可以更细致地控制图形渲染管线中的特定部分了。OpenGL着色器是用OpenGL着色器语言(GLSL,类似C语言的开发语言)写成的。

标准设备坐标(二维)与顶点坐标(三维):在OpenGL中使用常见的左角坐标系,取值范围为[-1,1]。而我们看见的屏幕窗口使用以左上角为原点向下为x轴的坐标系。在OpenGL中基于左角坐标系的三维数据称为顶点坐标,而将顶点坐标作为输入通过顶点着色器将顶点数据转为二维的坐标称作标准设备坐标。每个顶点坐标还有它的顶点属性(可以针对每个点做更高级的操作)。

假设我们要使用OpenGL画一个三角形,就需要输入三个顶点数据到顶点着色器中进行第一步的转换。

float vertices[] = {
    -0.5f, -0.5f, 0.0f,//左下点
     0.5f, -0.5f, 0.0f,//右下点
     0.0f,  0.5f, 0.0f//中间点
};//表示一个三角形的顶点数据

GLKit相关基本概念

二.GLKit应用

results matching ""

    No results matching ""